集合
集合:互不相同项的无序组合
- 要么指出集合的特殊属性,只有集合中元素才满足的特性
- 要么显式列出集合的所有成员
存储映像
位向量存储表示
位串表示法
- 每个集合S使用一个位串表示,位串中每位代表全集U的一个元素
- 当且仅当全集$U$中第i个元素被包含在子集$S$中时,位向量
第i个元素为1
1
| typedef int BitSet[MAX_SET_SIZE/sizeof(int)];
|
- 可以实现快速的标准集合运算
- 以使用大量存储空间为代价的
线性表存储表示
线性表表示法
1 2 3 4
| typedef SqList SLSet; typedef LinkList LLSet;
|
集合不能包含相同元素,列表可以
- 可以引入multiset、bag绕过对唯一性的要求
- 多重集和包是可重复项的无序组合
集合是元素的组合,而列表是集合的有序组合
集合运算
Disjoint Set/Union Find
不相交集/并查集:由某个有限集的一系列不相交子集,及相应
操作构成
- 通常假设集合中元素为整数,或可以映射为整数
- 主要包括find、union操作
存储映像
实现应该对find、union有特殊优化
- 按秩合并:将包含较少结点的集合合并到含有较多结点集合
- 路径压缩:将每个结点都直接指向根节点
大多数实现会使用集合某个元素作为该集合代表
- 有些对代表没有特殊约定
- 有的要求代表为子集中最小元素等
树双亲表存储表示
双亲表示法
应用
- 生成不相交集
- 求解无向图中连通分量数量
- 求解等价问题:两两等价元素作为一类,求解每类元素
- 集合归并
Map/Dictionary
映射/字典:能查找给定元素、增加新元素、删除元素的集合
应用
- Extendible Hashing:可扩充散列,用于存储磁盘上大型字典
- 查找时先计算可能包含查找键K的存储段磁盘地址
- 然后从磁盘中读取段中所有键,从中查找K
- 因为存取主存开销较磁盘小很多,宁可多次存取主存