- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数学上的集合是数据结构和算法设计中用到的数据集合的基础,是无序集,并且要求集合中的成员是互不相同的。它所关心的运算主要是集合的并、交、差运算以及判定给定的元素在集合中是否存在。本节定义的ADT Set就是数学上的集合。 同属一个结构S的一组记录:s1,s2,…,集合的成员互不相同,成员次序无关紧要。成员之间的关系是一种完全松散的关系。 5.1.2 用位向量实现集合 当所讨论的集合都是全集合{1,2,…,N}的子集,而且N是一个不大的固定整数时,可以用位向量来实现集合。此时,对于任何一个集合A{1,2,…,N},可以定义它的特征函数为: δA(x)= 用位向量定义的集合类如下: class BitSet { int setsize; //setsize是全集的长度, int arraysize; //arraysize是位向量所需的无符号整形单元数 unsigned int *v; //位向量 int ArrayIndex(T x) { //确定元素x在位向量v中的下标,T为int或long return x / (sizeof(unsigned int)*8); } unsigned int BitMask(T x) { //位屏蔽函数 return 1((x-1) % (sizeof(unsigned int)*8); } public: BitSet(int size); //初始化为空集 BitSet Union(BitSet x); //并集运算 BitSet Intersection(BitSet x); //交集运算 BitSet Different(BitSet x); //差集运算 void Assignment(BitSet x); //将集合A赋值给当前对象 bool Equality(BitSet x); //等价性比较 bool Member(T x); void Insert(T x); void Delete(T x); void InSet(); //输入集合 void OutSet(); //输出集合 }; //BitSet 基本运算的实现 BitSet(int size) { setsize=size; //集合所需单元数 arraysize=(setsize + (sizeof(unsigned int)*8-1)) / (sizeof(unsigned int)*8); v=new unsigned int[arraysize]; for(i=0; iarraysize; i++) v[i]=0; } //BitSet 基本运算的实现 bool Member(T x) { //判断x是否属于当前集合 if(x=0 || xsetsize) { cout”overflow!”; return false; } return v[ArrayIndex(x)] BitMask(x); }// Member 基本运算的实现 BitSet Union(BitSet x){ //并集运算,要求全集相同 BitSet tmp(setsize); for(i=0; iarraysize; i++) tmp.v[i]=v[i] | x.v[i]; //或运算实现 return tmp; }// Union 基本运算的实现 交集运算Intersection只需将Union的阴影部分改为v[i]x.v[i];差集运算Different只需将Union的阴影部分改为v[i] ^ (v[i] x.v[i])。比如: void Insert(T x) { //通过将集合位向量相应位置1来实现插入运算 v[ArrayIndex(x)] |=BitMask(x);} void Delete(T x) { //通过将集合位向量相应位复位来实现删除运算 v[ArrayIndex(x)] = ~BitMask(x);} 当全集是一个有限集,但不是由连续整数组成的集合时,仍可以用位向量来表示这个集合的子集。这时只需要建立全集合的成员与{1,2,…,N}之间的一个一一对应即可,可设计一个映射(Mapping)来实现。 当全集是一个无限集时,就无法用位向量来表示它的子集。此时可用链表来表示。链表中的每个结点表示集合的一个成员。表示集合的链表
文档评论(0)