zoukankan      html  css  js  c++  java
  • 集合的整数表示

    【基本的集合操作】:

    (1) 空集Ø ------------------------------------------------------------> 0

    (2)只含有第 i 个元素的集合{ i } ----------------------------------> 1 << i

    (3)含有全部 n 个元素的集合{0, 1, ..., n-1} --------------> (1 << n) - 1

    (4)判断第 i 个元素是否属于集合 S ------------------------------> if (S >> i & 1)

    (5)向集合中加入第 i 个元素 S υ { i } ----------------------------> S | 1 << i

    (6)从集合中删去第 i 个元素 S { i } -----------------------------> S & ~ (1 << i)

    (7)集合 S 和 T 的并集 S υ T -------------------------------------> S | T

    (8)集合 S 和 T的交集 S ∩ T --------------------------------------> S & T


    枚举基和S={0,1,2...,n-1}中的所有子集都枚举出:

    for(int S=0;S<1<<n;S++){
        // 对子集的处理
    }
    

      

    【降序遍历子集】:

    int sub = sup;
    do{
    	sub = (sub - 1) & sup;
       }while(sub != sup);
    

      

    【枚举包含所有大小位k的子集】:

     while(comb < (1 << N))
     {
          int x = comb & -comb, y = comb + x;
          comb = (comb & ~y) / x >> 1 | y;
     }
    

      

    解析:

    x = comb & -comb 可以获取最低位的1
    y = comb + x 将最低位的连续1变成0,高一位变成1(新的1)
    comb & ~y 获取最初的连续的1区间
    (comb & ~y) / x >> 1 获得最初的连续1区间然后把最低的1移走维持1的数量不变且是新产生1中最小的。
    (comb & -y) / x >> 1 | y 状态更新。

    总的说完成的操作是:在最低位的连续1区间前一位产生一个1(最小),然后把这个区间一起右移直到少了一个1维持1的数量不变,且是按顺序枚举。

  • 相关阅读:
    public,protected,private辨析
    转载---Java集合对象的深度复制与普通复制
    SSM框架学习之高并发秒杀业务--笔记4-- web层
    PCB布线总的原则
    模拟电子技术目录
    放大器(PA+LAN)在射频上的应用
    AD软件Bug和自我失误的对战
    二、cadence焊盘与封装制作操作步骤详细说明
    图腾柱电路工作原理
    转载:介绍AD另外一种奇葩的多通道复用的方法
  • 原文地址:https://www.cnblogs.com/jaszzz/p/12849648.html
Copyright © 2011-2022 走看看