zoukankan      html  css  js  c++  java
  • 二进制集合

    二进制集合是一种神奇的集合,因为集合里的元素只有在和不在两种状态,所以可以用二进制的0或1来分别模拟元素是否在集合内

    比如说一个有三个元素的集合

    三个元素都不在集合里的时候怎么表示? 000对吧

    把000转成十进制就是0

    如果第一个元素在集合里呢?001?

    转成十进制就是1

    同理 写出这个栗子的所有子集

    集合         十进制对应数码  

    000              0              

    001               1

    010               2

    100              4

    011              3

    101              5

    110              6

    111              7

    用二进制表示的东西就是优美

    所以发现规律了没?  对于最多有n个元素的集合来说,空集用0表示,满集用2^n-1来表示

    那2的n次方减1怎么表示呢?有个叫位运算的东西(相信大佬们肯定很熟悉)什么 1<<m等价于2^m,m>>1等价于m/2

    原理不明反正很厉害就是了

    所以2的n次方减1就是(1<<N)-1  注意位运算符比加减号优先级低,所以用括号括起来。要不然你就是在算2的n-1次方

    然后放出所有的二进制集合操作(来自Netcan_Space

    空集
    0
    全集{0,1,,N1}
    (1<<N)-1
    只含有第i个元素的集合{i}
    1<<i
    判断第i个元素是否属于集合S
    if(S>>i & 1)
    向集合中加入第i个元素S{i}
    S|1<<i
    从集合中去掉第i个元素S{i}
    S&~(1<<i)
    集合ST的并集ST
    S|T
    集合ST的交集ST
    S&T

    好了扯回正题

    这就是二进制集合的用法,对于一些枚举操作具有重要意义

    刚做完一道luogu题:打开所有的灯,用到了广搜和二进制集合判重

    来试试呀 

    (喂你这是刚转回正题就结束了吧)

  • 相关阅读:
    MySQL(一)
    HTML基础
    python函数基础
    常用的模块
    面向对象进阶
    定制自己的数据类型
    Shell篇之AWK
    MATLAB如何实现傅里叶变换FFT?有何物理意义?
    傅里叶分析
    2018年度关键词
  • 原文地址:https://www.cnblogs.com/cellular-automaton/p/6836182.html
Copyright © 2011-2022 走看看