数据结构集合与字典幻灯片.ppt
《数据结构集合与字典幻灯片.ppt》由会员分享,可在线阅读,更多相关《数据结构集合与字典幻灯片.ppt(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构集合与字典数据结构集合与字典1第1页,共67页,编辑于2022年,星期六集合及其表示集合及其表示集合基本概念集合基本概念集合是成员集合是成员集合是成员集合是成员(对象或元素对象或元素对象或元素对象或元素)的一个群集。集合中的成员可的一个群集。集合中的成员可的一个群集。集合中的成员可的一个群集。集合中的成员可以是原子以是原子以是原子以是原子(单元素单元素单元素单元素),也可以是集合。,也可以是集合。,也可以是集合。,也可以是集合。集合的成员必须互不相同。集合的成员必须互不相同。集合的成员必须互不相同。集合的成员必须互不相同。在算法与数据结构中所遇到的集合,其单元素通常是在算法与数据结构中
2、所遇到的集合,其单元素通常是在算法与数据结构中所遇到的集合,其单元素通常是在算法与数据结构中所遇到的集合,其单元素通常是整数、字符、字符串或指针,且同一集合中所有成员整数、字符、字符串或指针,且同一集合中所有成员整数、字符、字符串或指针,且同一集合中所有成员整数、字符、字符串或指针,且同一集合中所有成员具有相同的数据类型。具有相同的数据类型。具有相同的数据类型。具有相同的数据类型。colour=red,orange,yellow,green,black,blue,colour=red,orange,yellow,green,black,blue,purple,white name=“An”,“
3、Cao”,“Liu”,“Ma”,purple,white name=“An”,“Cao”,“Liu”,“Ma”,“Peng”,“Wang”,“zhang”“Peng”,“Wang”,“zhang”第2页,共67页,编辑于2022年,星期六集合中的成员一般是无序的,没有先后次序关系。但在表集合中的成员一般是无序的,没有先后次序关系。但在表集合中的成员一般是无序的,没有先后次序关系。但在表集合中的成员一般是无序的,没有先后次序关系。但在表示它时,常常写在一个序列里。示它时,常常写在一个序列里。示它时,常常写在一个序列里。示它时,常常写在一个序列里。我们常设定集合中的单元素具有线性有序关系,此关系可
4、我们常设定集合中的单元素具有线性有序关系,此关系可我们常设定集合中的单元素具有线性有序关系,此关系可我们常设定集合中的单元素具有线性有序关系,此关系可记作记作记作记作“”“”,表示,表示,表示,表示“优先于优先于优先于优先于”。若若a,b是集合中的两个单元素,则是集合中的两个单元素,则是集合中的两个单元素,则是集合中的两个单元素,则a ab三者必居其一;三者必居其一;若若a,b b,c c是集合中的三个单元素,且是集合中的三个单元素,且是集合中的三个单元素,且是集合中的三个单元素,且a ab b,b bc c,则则a c c。(传递性传递性传递性传递性)整数、字符和字符串都有一个自然的线性顺序
5、。而指针整数、字符和字符串都有一个自然的线性顺序。而指针整数、字符和字符串都有一个自然的线性顺序。而指针整数、字符和字符串都有一个自然的线性顺序。而指针也可以依据其在序列中安排的位置给予一个线性顺序。也可以依据其在序列中安排的位置给予一个线性顺序。也可以依据其在序列中安排的位置给予一个线性顺序。也可以依据其在序列中安排的位置给予一个线性顺序。集合操作有求集合的并、交、差、判存在等。集合操作有求集合的并、交、差、判存在等。集合操作有求集合的并、交、差、判存在等。集合操作有求集合的并、交、差、判存在等。第3页,共67页,编辑于2022年,星期六集合运算的文氏集合运算的文氏(Venn)图图用位向量实
6、现集合抽象数据类型用位向量实现集合抽象数据类型n n当集合是全集合当集合是全集合 0,1,2,n 的一个的一个子集,且子集,且 n是不大的整数时,可用位是不大的整数时,可用位(0,1)向量来实现集合。向量来实现集合。n n 当全集合是由有限的可枚举的成员组成当全集合是由有限的可枚举的成员组成的集合时,可建立全集合成员与整数的集合时,可建立全集合成员与整数 0,1,2,的一一对应关系,用位向量来表的一一对应关系,用位向量来表示该集合的子集示该集合的子集第4页,共67页,编辑于2022年,星期六集合的位向量集合的位向量(bit Vector)类的定义类的定义#include const int D
7、efaultSize=100;class Set private:int*bitVector;int MaxSize;public:Set(int MaxSetSize=DefaultSize);Set()delete bitVector;void MakeEmpty()for(int i=0;i 0);bitVector=new int MaxSize;assert(bitVector!=0);for(int i=0;i=0&x=0&x MaxSize);if(bitVectorx)bitVectorx=0;return 1;return 0;第8页,共67页,编辑于2022年,星期六集合复
8、制集合复制Set&Set:operator=(Set&right)assert(MaxSize=right.MaxSize);for(int i=0;i MaxSize;i+)bitVectori=right.bitVectori;return*this;集合并运算集合并运算Set&Set:operator+(Set&right)assert(MaxSize=right.MaxSize);for(int i=0;i MaxSize;i+)bitVectori=bitVectori|right.bitVectori;return*this;第9页,共67页,编辑于2022年,星期六集合交运算集合
9、交运算Set&Set:operator*(Set&right)assert(MaxSize=right.MaxSize);for(int i=0;i MaxSize;i+)bitVectori=bitVectori&right.bitVectori;return*this;集合差运算集合差运算Set&Set:operator-(Set&right)assert(MaxSize=right.MaxSize);for(int i=0;i=0&x MaxSize);return bitVectorx;判断两个集合是否相等判断两个集合是否相等int Set:operator=(Set&right)as
10、sert(MaxSize=right.MaxSize);for(int i=0;i MaxSize;i+)if(bitVectori!=right.bitVectori)return 0;return 1;第11页,共67页,编辑于2022年,星期六若若This集合是集合是right的子集则返回的子集则返回1否则为否则为0int Set:SubSet(Set&right)assert(MaxSize=right.MaxSize);for(int i=0;i MaxSize;i+)if(bitVectori!right.bitVectori)return 0;return 1;第12页,共67页
11、,编辑于2022年,星期六使用示例使用示例 Set s1,s2,s3,s4,s5;int index,equal;/构造集合构造集合 for(int k=0;k 10;k+)/集合赋值集合赋值 s1.AddMember(k);s2.AddMember(k+7);/s1:0,1,2,9,s2:7,8,9,16 s3=s1+s2;/求求s1与与s2的并的并 0,1,16 s4=s1*s2;/求求s1与与s2的交的交 7,8,9 s5=s1-s2;/求求s1与与s2的差的差 0,1,2,3,4,5,6 index=s1.SubSet(s4);/求求s4在在s1中首次匹配中首次匹配 cout inde
12、x endl;/位置位置,index=7 equal=s1=s2;/集合集合s1与与s2比较相等比较相等 cout equal endl;/equal为为0,两集合不等两集合不等第13页,共67页,编辑于2022年,星期六用有序链表实现集合的抽象数据类型用有序链表实现集合的抽象数据类型用带表头结点的有序链表表示集合用带表头结点的有序链表表示集合 用有序链表来表示集合时,链表中的每个结点表示集合的一用有序链表来表示集合时,链表中的每个结点表示集合的一个成员。个成员。各结点所表示的成员各结点所表示的成员 e0,e1,en 在链表中按升序排列在链表中按升序排列,即即 e0 e1 en。在一个有序链表
13、中寻找一个集合成员时,一般不用搜索整在一个有序链表中寻找一个集合成员时,一般不用搜索整个链表,搜索效率可以提高很多。个链表,搜索效率可以提高很多。集合成员可以无限增加。因此,用有序链表可以表示无穷集合成员可以无限增加。因此,用有序链表可以表示无穷全集合的子集。全集合的子集。第14页,共67页,编辑于2022年,星期六集合的有序链表类的定义template class SetList;template class SetNode friend class SetList;public:SetNode(const Type&item):data(item),link(NULL);private:T
14、ype data;SetNode*link;template class SetList private:SetNode*first,*last;public:第15页,共67页,编辑于2022年,星期六 SetList();void MakeEmpty();int AddMember(const Type&x);int DelMember(const Type&x);SetList&operator=(SetList&right);SetList&operator+(SetList&right);SetList&operator*(SetList&right);SetList&operato
15、r-(SetList&right);int Contains(const Type&x);int operator=(SetList&right);Type&Min();Type&Max();第16页,共67页,编辑于2022年,星期六 集合的搜索、加入和删除操作集合的搜索、加入和删除操作template 判断判断X是否为集合成员是否为集合成员int SetList:Contains(const Type&x)SetNode*temp=firstlink;while(temp!=NULL&tempdata x)temp=templink;if(temp!=NULL&tempdata=x)ret
16、urn 1;else return 0;第17页,共67页,编辑于2022年,星期六将将X插入到集合中插入到集合中template int SetList:AddMember(const Type&x)SetNode*p=firstlink,*q=first;while(p!=NULL&pdata x)q=p;p=plink;if(p!=NULL&pdata=x)return 0;SetNode*s=new SetNode(x);slink=p;qlink=s;if(p=NULL)last=s;return 1;第18页,共67页,编辑于2022年,星期六删除集合中的删除集合中的Xtempla
17、te int SetList:DelMember(const Type&x)SetNode*p=firstlink,*q=first;while(p!=NULL&pdata x)q=p;p=plink;if(p!=NULL&pdata=x)qlink=plink;if(p=last)last=q;delete p;return 1;else return 0;第19页,共67页,编辑于2022年,星期六用有序链表表示集合时的几个重载函数用有序链表表示集合时的几个重载函数template 复制集合复制集合SetList&SetList :operator=(SetList&right)SetNo
18、de*pb=right.firstlink;SetNode*pa=first=new SetNode;while(pb!=NULL)palink=new SetNode(pbdata);pa=palink;pb=pblink;palink=NULL;last=pa;return*this;第20页,共67页,编辑于2022年,星期六template 集合并SetList&SetList:operator+(SetList&right)SetNode*pb=right.firstlink;SetNode*pa=firstlink;SetNode*pc=first;while(pa!=NULL&p
19、b!=NULL)if(padata=pbdata)pclink=pa;pa=palink;pb=pblink;else if(padata pbdata)pclink=pa;pa=palink;else第21页,共67页,编辑于2022年,星期六 pclink=new SetNode(pbdata);pb=pblink;pc=pclink;if(pa!=NULL)pclink=pa;else while(pb!=NULL)pclink=new SetNode(pbdata);pc=pclink;pb=pblink;pclink=NULL;last=pc;return*this;第22页,共67
20、页,编辑于2022年,星期六template 集合交集合交SetList&SetList:operator*(SetList&right)SetNode*pb=right.firstlink;SetNode*pa=firstlink;SetNode*pc=first;while(pa!=NULL&pb!=NULL)if(padata=pbdata)pc=pclink;pa=palink;pb=pblink;else if(padata pbdata)pclink=palink;delete pa;pa=pclink;else pb=pblink;第23页,共67页,编辑于2022年,星期六 w
21、hile(pa!=NULL)pclink=palink;delete pa;pa=pclink;last=pc;return*this;第24页,共67页,编辑于2022年,星期六template 集合差集合差SetList&SetList:operator-(SetList&right)SetNode*pb=right.firstlink;SetNode*pa=firstlink;SetNode*pc=first;while(pa!=NULL&pb!=NULL)if(padata=pbdata)pclink=palink;delete pa;pa=pclink;pb=pblink;else
22、if(padata pbdata)pc=pclink;pa=palink;else pb=pblink;if(pa=NULL)last=pc;return*this;第25页,共67页,编辑于2022年,星期六判断集合相等判断集合相等template int SetList:operator=(SetList&right)SetNode*pb=right.firstlink;SetNode*pa=firstlink;while(pa!=NULL&pb!=NULL)if(padata=pbdata)pa=palink;pb=pblink;else return 0;if(pa!=NULL|pb!
23、=NULL)return 0;return 1;第26页,共67页,编辑于2022年,星期六并查集并查集(Union-Find Sets)把每一个对象看作是一个单元素集合,然后按一定顺序将把每一个对象看作是一个单元素集合,然后按一定顺序将把每一个对象看作是一个单元素集合,然后按一定顺序将把每一个对象看作是一个单元素集合,然后按一定顺序将属于同一等价类的元素所在的集合合并。在此过程中将反属于同一等价类的元素所在的集合合并。在此过程中将反属于同一等价类的元素所在的集合合并。在此过程中将反属于同一等价类的元素所在的集合合并。在此过程中将反复地使用一个搜索运算,确定一个元素在哪一个集合中。复地使用一个
24、搜索运算,确定一个元素在哪一个集合中。复地使用一个搜索运算,确定一个元素在哪一个集合中。复地使用一个搜索运算,确定一个元素在哪一个集合中。能够完成这种功能的集合就是能够完成这种功能的集合就是能够完成这种功能的集合就是能够完成这种功能的集合就是并查集并查集并查集并查集。它支持以下三。它支持以下三。它支持以下三。它支持以下三种操作:种操作:种操作:种操作:UnionUnion(RootRoot1,1,RootRoot2)2)/并操作并操作并操作并操作;要求两个集合互不相交 Find Find(x x)/搜索操作搜索操作搜索操作搜索操作;UFSetsUFSets(s s)/构造函数构造函数构造函数构
25、造函数。第27页,共67页,编辑于2022年,星期六n n 对于并查集来说,每个集合用一棵树表示。对于并查集来说,每个集合用一棵树表示。n 集合中每个元素的元素名分别存放在树的结点中,集合中每个元素的元素名分别存放在树的结点中,此外,树的每一个结点还有一个指向其双亲结点的此外,树的每一个结点还有一个指向其双亲结点的指针。指针。n 为此,需要有两个映射:为此,需要有两个映射:n 集合元素到存放该元素名的树结点间的对应;集合元素到存放该元素名的树结点间的对应;n 集合名到表示该集合的树的根结点间的对应。集合名到表示该集合的树的根结点间的对应。n 设设 S1=0,6,7,8,S2=1,4,9,S3=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 集合 字典 幻灯片
限制150内