数据结构教程第6章集合与字典.ppt
《数据结构教程第6章集合与字典.ppt》由会员分享,可在线阅读,更多相关《数据结构教程第6章集合与字典.ppt(63页珍藏版)》请在三一办公上搜索。
1、集合及其表示并查集与等价类字典跳表散列,第六章 集合与字典,集合基本概念,6.1.1 集合及其表示,集合是成员(对象或元素)的一个群集。集合中的成员可以是原子(单元素),也可以是集合。集合的成员必须互不相同。在算法与数据结构中所遇到的集合,其单元素通常是整数、字符、字符串或指针,且同一集合中所有成员具有相同的数据类型。,colour=red,orange,yellow,green,black,blue,purple,white name=An,Cao,Liu,Ma,Peng,Wang,zhang 集合中的成员一般是无序的,但在表示它时,常设定集合中的单元素具有线性有序关系,此关系可记作“”,表
2、示“优先于”;整数、字符和字符串都有一个自然线性顺序。指针也可依据其在序列中安排的位置给予一个线性顺序。某些集合保存的是实际数值,某些集合保存的是表示元素是否在集合中的指示信息。要求每个元素在集合中只出现一次,但多种集合允许元素重复出现。,集合(Set)的抽象数据类型,template class Set public:virtual Set()=0;virtual MakeEmpty()=0;virtual bool AddMember(const T x)=0;virtual bool DelMember(const T x)=0;,AB 或 A+B AB 或 AB A-B,A,A,A,B
3、,B,B,virtual Set unionWith const Set,6.1.2 用位向量实现集合抽象数据类型,当集合是全集合 0,1,2,n 的一个子集,且 n是不大的整数时,可用位(0,1)向量来实现集合。当全集合是由有限的可枚举的成员组成的集合时,可建立全集合成员与整数 0,1,2,的一一对应关系,用位向量来表示该集合的子集。,集合的位向量(bit Vector)类的定义#include const int DefaultSize=50;class bitSet private:unsigned short*bitVector;int setSize,vectorSize;publi
4、c:bitSet(int sz=DefaultSize);bitSet()delete bitVector;,void makeEmpty()for(int i=0;i,bool Contains(const T x);bool subSet(bitSet,使用示例bitSet 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,6.1.3 用有序链表实现集合的抽象数据类型,用带表头结点的有序链表表示集合,first,
5、first,08,17,23,35,49,72,用有序链表来表示集合时,链表中的每个结点表示集合的一个成员。各结点所表示的成员 e0,e1,en 在链表中按升序排列,即 e0 e1 en。集合成员可以无限增加。因此,用有序链表可以表示无穷全集合的子集。,template struct SetNode T data;SetNode*link;SetNode(const T,集合的有序链表类的定义,template class LinkedSet private:SetNode*first,*last;/有序链表的表头指针,表尾指针,public:LinkedSet()first=last=new
6、 SetNode;/构造函数 LinkedSet()MakeEmpty();delete first;void MakeEmpty();/置空集合 bool AddMember(const T/判x是否集合的成员,集合的有序链表类的定义,bool operator=(LinkedSet/判this是否R的子集,集合的有序链表类的定义,6.2.1 并查集(Union-Find Sets),并查集支持以下三种操作:Union(Root1,Root2)/并操作 Find(x)/搜索操作 UFSets(s)/构造函数对于并查集来说,每个集合用一棵树表示。为此,采用树的双亲表示作为集合存储表示。集合元素
7、的编号从0到 n-1。其中 n 是最大元素个数。,在双亲表示中,第 i 个数组元素代表包含集合元素 i 的树结点。根结点的双亲为-1,表示集合中的元素个数。在同一棵树上所有结点所代表的集合元素在同一个子集合中。初始时,用构造函数 UFSets(s)构造一个森林,每棵树只有一个结点,表示集合中各元素自成一个子集合。用 Find(i)寻找集合元素 i 的根。如果有两个集合元素 i 和 j,Find(i)=Find(j),表明这两个元素在同一个集合中。如果两个集合元素 i 和 j 不在同一个集合中,可用 Union(i,j)将它们合并到一个集合中。,S1 S2的可能的表示方法,下标parent,集合
8、 S1,S2 和 S3 的双亲表示,-1 4-1 2-1 2 0 0 0 4,0 1 2 3 4 5 6 7 8 9,0,7,6,8,4,1,9,4,1,9,0,8,7,6,const int DefaultSize=10;class UFSetspublic:UFSets(int sz=DefaultSize);UFSets()delete parent;void Union(int Root1,int Root2);int Find(int x);void WeightedUnion(int Root1,int Root2);private:int*parent;int size;,并查集
9、类的定义,UFSets:UFSets(int sz)size=sz;parent=new intsize;for(int i=0;isize;i+)parenti=-1;void UFSets:Union(int Root1,int Root2)/求两个不相交集合Root1与Root2的并 parentRoot1+=parentRoot2;parentRoot2=Root1;/将Root2连接到Root1下面,成员函数的实现,-5 0 1 2 3,parent,Parent4=3,Parent3=2,Parent2=1,Parent1=0,Parent0=-5,0 1 2 3 4,int UF
10、Sets:Find(int x)if(parent x 0)return x;else return Find(parent x);,6.3 字典(Dictionary),以集合为基础,支持Member、Insert、Remove三种运算的抽象数据类型叫做字典。字典的概念:字典是一些元素的集合,每个元素有一个称作关键码的域。在讨论字典抽象数据类型时,把字典定义为对的集合。字典的操作:确定一个指定的名字是否在字典中;搜索出该名字的属性;修改该名字的的属性;插入一个新的名字及其属性;删除一个名字及其属性。,字典的抽象数据类型const int DefaultSize=26;templateclas
11、s Dictionary public:Dictionary(int size=DefaultSize);bool Member(Name name);Attribute*Search(Name name);void Insert(Name name,Attribute attr);void Remove(Name name);,在字典的所有操作中,最基本的只有 3 种:Search(搜索)、Insert(插入)、Remove(删除)。在选择字典的表示时,必须确保这几个操作的实现。,考虑到搜索效率,可以用顺序表方式、二叉搜索树或多路搜索树方式组织字典。本章介绍3种字典的组织方式:线性表、跳表和
12、散列表。,字典的线性表描述,线性表描述:字典可以保存在线性序列(e1,e2,)中,其中ei是字典中的元素,其关键码从左到右依次增大。对于这种描述方式,有有序顺序表和有序链表。,有序链表的类定义templatestruct ChainNode E data;ChainNode*link;ChainNode():link(NULL);ChainNode(E,有序链表的类定义 ChainNode*Search(const K k1)const;void Insert(const K k1,E,在有n个结点的有序链表中,搜索、插入、删除操作的 时间复杂性均为O(n)。,6.4 跳表(Skip List
13、),在链表的中部结点增加一个指针,以减少搜索时的比较次数。,6.5 散列(Hashing),散列表是表示集合和字典的另一种有效方法,它提供了一种完全不同的存储和搜索方式,通过将关键码映射到表中某个位置上来存储元素,然后根据关键码用用样的方式直接访问。,散列方法,散列方法在元素存储位置与其关键码之间建立一个确定的对应函数关系Hash(),使每个关键码与结构中一个唯一存储位置相对应:Address Hash(key)在搜索时,先对元素的关键码进行函数计算,把函数值当做元素的存储位置,在结构中按此位置取元素比较。若关键码相等,则搜索成功。在存放元素时,依相同函数计算存储位置,并按此位置存放。这种方法
14、就是散列方法。,在散列方法中使用的转换函数叫做散列函数。按此方法构造出来的表或结构就叫做散列表。使用散列方法进行搜索不必进行多次关键码的比较,搜索速度比较快,可以直接到达或逼近具有此关键码的元素的实际存放地址。散列函数是一个压缩映象函数。关键码集合比散列表地址集合大得多。因此有可能经过散列函数的计算,把不同的关键码映射到同一个散列地址上,这就产生了冲突。,示例:有一组元素,其关键码分别是 12361,07251,03309,30976 采用的散列函数是 hash(x)=x%73 其中,“%”是除法取余操作。则有:hash(12361)=hash(07251)=hash(03309)=hash(
15、30976)=24。就是说,对不同的关键码,通过散列函数的计算,得到了同一散列地址。我们称这些产生冲突的散列地址相同的不同关键码为同义词。由于关键码集合比地址集合大得多,冲突很难避免。所以对于散列方法,需要讨论以下两个问题:对于给定的一个关键码集合,选择一个计算简单且地址分布比较均匀的散列函数,避免或尽量减少冲突;拟订解决冲突的方案。,构造散列函数时的几点要求:散列函数的定义域必须包括需要存储的全部 关键码,如果散列表允许有 m 个地址时,其 值域必须在 0 到 m-1 之间;散列函数计算出来的地址应能均匀分布在整个地址空间中;散列函数应是简单的,能在较短的时间内计 算出结果。,散列函数,除留
16、余数法设散列表中允许地址数为 m,取一个不大于 m,但最接近于或等于 m 的质数 p 作为除数,利用以下函数把关键码转换成散列地址:hash(key)=key%p p m其中,“%”是整数除法取余的运算,要求这时的质数 p 不是接近2的幂。示例:有一个关键码 key=962148,散列表大小 m=25,即 HT25。取质数 p=23。散列函数 hash(key)=key%p。则散列地址为hash(962148)=962148%23=12。可以按计算出的地址存放记录。需要注意的是,使用上面的散列函数计算出来的地址范围是 0到 22,因此,从23到24这几个散列地址实际上在一开始是不可能用散列函数
17、计算出来的,只可能在处理溢出时达到这些地址。,散列函数,数字分析法 设有 n 个 d 位数,每一位可能有 r 种不同的符号。这 r 种不同的符号在各位上出现的频率不一定相同。可根据散列表的大小,选取其中各种符号分布均匀的若干位作为散列地址。计算各位数字中符号分布均匀度 k 的公式:其中,表示第 i 个符号在第 k 位上出现的次数,n/r 表示各种符号在 n 个数中均匀出现的期望值。计算出的 k 值越小,表明在该位(第 k 位)各种符号分布得越均匀。数字分析法仅适用于事先明确知道表中所有关键码每一位数值的分布情况,它完全依赖于关键码集合。如果换一个关键码集合,选择哪几位要重新决定。,散列函数,9
18、 4 2 1 4 8位,1=57.60 9 4 1 2 6 9位,2=57.60 9 4 0 5 2 7位,3=17.60 9 4 1 6 3 0位,4=5.60 9 4 1 8 0 5位,5=5.60 9 4 1 5 5 8位,6=5.60 9 4 2 0 4 7 9 4 0 0 0 1,若散列表地址范围有 3 位数字,取各关键码的 位做为记录的散列地址。也可以把第,,和第位相加,舍去进位位,变成一位数,与第,位合起来作为散列地址。,平方取中法此方法在字典处理中使用十分广泛。它先计算构成关键码的标识符的内码的平方,然后按照散列表的大小取中间的若干位作为散列地址。设标识符可以用一个计算机字长的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 教程 集合 字典

链接地址:https://www.31ppt.com/p-5986036.html