集合的位向量实现

时间:2011-10-01 06:14:57

标签: algorithm data-structures set

在阅读aho数据结构书中关于集合的基本操作的章节时,我在主题的位向量实现中遇到了以下行...

if the universal set is sufficiently small so that a bit vector fits in one computer word,
then union, intersection and difference can be performed by single logical operations in
the language of the underlying machine..  

集合的位向量实现意味着集合由数组表示,其下标表示集合的元素,如果它是数组的成员,则下标的内容为1,如果不是,则为0。所以成员,插入和删除操作可以在一个恒定的时间内执行....但任何人都可以告诉我如何通过摘录所述的单个逻辑操作来执行交集,并集和差异... plz举个例子(或代码)三种操作中的任何一种......

2 个答案:

答案 0 :(得分:16)

假设您有一台具有32位字的计算机,并且您希望在具有32个元素的域上表示集合。例如{0 ... 31}的子集。

集合用单个整数表示,当且仅当x在集合中时,位#x为1。所以集合{0,1,17,30}将是

01000000000000100000000000000011

我们按照惯例从31到0,从左到右编号。

使用此表示法:

  • 交叉点是二进制AND(x & y
  • Union是二进制OR(x | y
  • 设置差异是二进制AND NOT(x & ~y
  • 对称集差异是二进制异或(x ^ y

答案 1 :(得分:1)

给定集s1s2

  • 交叉点为s1 & s2
  • 联盟是s1 | s2
  • 差异为s1 & ~s2