集合与字典一讲课讲稿_第1页
集合与字典一讲课讲稿_第2页
集合与字典一讲课讲稿_第3页
集合与字典一讲课讲稿_第4页
集合与字典一讲课讲稿_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、集合与字典一A B 或 A+B A B 或 A B A- -BAAABBB集合(集合(SetSet)的抽象数据类型)的抽象数据类型template class Set public: virtual Set() = 0; /构造函数 virtual makeEmpty() = 0; /置空集合 virtual bool addMember (const T x) = 0; virtual bool delMember (const T x) = 0; virtual Set intersectWith (Set& R) = 0;/集合的交运算 virtual Set unionWith (Se

2、t& R) = 0; /集合的并运算 virtual Set differenceFrom (Set& R) = 0; /集合的差运算 virtual bool Contains (T x) = 0; virtual bool subSet (Set& R) = 0; virtual bool operator = (Set& R) = 0; /判集合是否相等;用位向量实现集合抽象数据类型用位向量实现集合抽象数据类型n当集合是全集合当集合是全集合 0, 1, 2, , n 的一个的一个子集,且子集,且 n 是不大的整数是不大的整数时,可用位时,可用位(0, 1)向量来实现集合。向量来实现集合。

3、n当全集合是由有限个可枚举的成员组成当全集合是由有限个可枚举的成员组成时,可建立全集合成员与整数时,可建立全集合成员与整数 0, 1, 2, 的一一对应关系,用位向量来表示该集的一一对应关系,用位向量来表示该集合的子集。合的子集。n一个二进位两个取值一个二进位两个取值1或或0,分别表示在,分别表示在集合与不在集合。集合与不在集合。thisRtemp0 1 1 1 0 0 0 0 1 1 00 0 1 0 0 1 0 1 0 1 00 1 1 1 0 1 0 1 1 1 0thisRtemp0 1 1 1 0 0 0 0 1 1 00 0 1 0 0 1 0 1 0 1 00 0 1 0 0 0

4、 0 0 0 1 0thisRtemp0 1 1 1 0 0 0 0 1 1 00 0 1 0 0 1 0 1 0 1 00 1 0 1 0 0 0 0 1 0 0集合的并集合的并集合的交集合的交集合的差集合的差template bool bitSet:subSet (bitSet& R) /判this是否R的子集 assert (setSize = R.setSize); for (int i = 0; i vectorSize; i+) /按位判断 if (bitVectori & !R.bitVectori) return false;return true;thisR0 0 1 1 1

5、 0 1 0 1 1 00 0 1 1 1 0 0 1 0 1 01 1 0 0 0 1 1 0 1 0 1 thisR0 0 1 1 0 0 0 0 1 1 00 0 1 0 0 1 0 1 0 1 0itemplate bool bitSet:operator = (bitSet& R) /判集合this与R相等 if (vectorSize != R.vectorSize) return false; for (int i = 0; i vectorSize; i+) if (bitVectori != R.bitVectori) return false; return true;/对

6、应位全部相等;用带表头结点的有序链表表示集合用带表头结点的有序链表表示集合firstfirst081723354972用有序链表实现集合抽象数据类型用有序链表实现集合抽象数据类型n用有序链表来表示集合时,链表中的每个结用有序链表来表示集合时,链表中的每个结点表示集合的一个成员。点表示集合的一个成员。n各结点所表示的成员各结点所表示的成员 e0, e1, , en 在链表中按在链表中按升序排列,即升序排列,即 e0 e1 en。n集合成员可以无限增加。因此,用有序链表集合成员可以无限增加。因此,用有序链表可以表示无穷全集合的子集。可以表示无穷全集合的子集。集合的有序链表类的定义集合的有序链表类的

7、定义template struct SetNode /集合的结点类定义 T data;/每个成员的数据 SetNode *link;/链接指针 SetNode() : link (NULL);/构造函数 SetNode (const T& x, SetNode *next = NULL) : data (x), link (next);/构造函数;template class LinkedSet /集合的类定义private: SetNode *first, *last; /有序链表表头指针, 表尾指针public: LinkedSet () first = last = new SetNod

8、e; LinkedSet (LinkedSet& R);/复制构造函数 LinkedSet () makeEmpty(); delete first; void makeEmpty();/置空集合 bool addMember (const T& x); bool delMember (const T& x); LinkedSet& operator = (LinkedSet& R); LinkedSet operator + (LinkedSet& R); LinkedSet operator * (LinkedSet& R); LinkedSet operator - (LinkedSet

9、& R); bool Contains (const T x);/判x是否集合的成员 bool operator = (LinkedSet& R);/判集合this与R相等 bool Min (T& x);/返回集合最小元素的值 bool Max (T& x);/返回集合最大元素的值 bool subSet (bitSet& R); /判this是否R的子集;等价关系与等价类等价关系与等价类(Equivalence Class)(Equivalence Class)等价类与并查集等价类与并查集n在求解实际应用问题时常会遇到等价类问题。在求解实际应用问题时常会遇到等价类问题。n从数学上看,等价类

10、是对象(或成员)的集合,从数学上看,等价类是对象(或成员)的集合,在此集合中所有对象应满足等价关系。在此集合中所有对象应满足等价关系。n若用符号若用符号“ ”表示集合上的等价关系,则对于表示集合上的等价关系,则对于该集合中的任意对象该集合中的任意对象x, y, z,下列性质成立:,下列性质成立:u自反性:自反性:x x (即等于自身即等于自身)。u对称性:若对称性:若 x y, 则则 y x。u传递性:若传递性:若 x y且且 y z, 则则 x z。n因此,等价关系是集合上的一个自反、对称、因此,等价关系是集合上的一个自反、对称、传递的关系。传递的关系。n“相等相等”(=)就是一种等价关系,

11、它满足上述就是一种等价关系,它满足上述的三个特性。的三个特性。n一个集合一个集合 S 中的所有对象可以通过等价关系划中的所有对象可以通过等价关系划分为若干个互不相交的子集分为若干个互不相交的子集 S1, S2, S3, ,它,它们的并就是们的并就是 S。这些子集即为等价类。这些子集即为等价类。n以下哪些是等价关系?室友、夫妻、师生、兄以下哪些是等价关系?室友、夫妻、师生、兄弟弟n给定集合给定集合 S = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,及如下等价对及如下等价对: 0 4, 3 1, 6 10, 8 9, 7 4, 6 8, 3 5, 2 11, 11

12、 0n进行归并的过程为:进行归并的过程为:初始初始0,1,2,3,4,5,6,7,8,9,10,110 4 0,4,1,2,3,5,6,7,8,9,10,113 1 0,4,1,3,2,5,6,7,8,9,10,116 10 0,4,1,3,2,5,6,10,7,8,9,118 9 0,4,1,3,2,5,6,10,7,8,9,117 4 0,4,7,1,3,2,5,6,10,8,9,11 0,4,7,1,3,2,5,6,10,8,9,116 8 0,4,7,1,3,2,5,6,8,9,10,113 5 0,4,7,1,3,5,2,6,8,9,10,112 11 0,4,7,1,3,5,2,1

13、1,6,8,9,1011 0 0,2,4,7,11,1,3,5,6,8,9,10并查集并查集 (Union-Find Sets)(Union-Find Sets)n并查集支持以下三种操作:并查集支持以下三种操作:u Union (Root1, Root2) /合并操作合并操作u Find (x) /查找操作查找操作u UFSets (s) /构造函数构造函数n对于并查集来说,每个集合用一棵树表示。对于并查集来说,每个集合用一棵树表示。n为此,采用为此,采用树的双亲表示树的双亲表示作为集合存储表示。作为集合存储表示。集合元素的编号从集合元素的编号从0到到 n-1。其中。其中 n 是最大元是最大元

14、素个数。素个数。n在双亲表示中,第在双亲表示中,第 i 个数组元素代表个数组元素代表包含集合元素包含集合元素 i 的树结点。初始时,的树结点。初始时,根结点的双亲为根结点的双亲为-1,其绝对值表示集,其绝对值表示集合中的元素个数。合中的元素个数。n在同一棵树上所有结点所代表的集合在同一棵树上所有结点所代表的集合元素在同一个子集合中。元素在同一个子集合中。n设设 S1= 0, 6, 7, 8, S2= 1, 4, 9, S3= 2, 3, 5n为简化讨论,忽略实际的集合名,仅用表示为简化讨论,忽略实际的集合名,仅用表示集合的树的根来标识集合。集合的树的根来标识集合。集合名集合名 指针指针0 S1

15、1 S22 S30427681935-4000-3-34422n初始时初始时, 用构造函数用构造函数 UFSets(s) 构造一个森林构造一个森林, 每棵树只有一个结点每棵树只有一个结点, 表示集合中各元素自成表示集合中各元素自成一个子集合。一个子集合。n用用 Find(i) 寻找寻找集合元素集合元素 i 的根。如果有两个的根。如果有两个集合元素集合元素 i 和和 j, Find(i) = Find(j), 表明这两表明这两个元素在同一个集合中,个元素在同一个集合中,n如果两个集合元素如果两个集合元素 i 和和 j 不在同一个集合中不在同一个集合中,可用可用 Union(i, j) 将它们合并

16、到一个集合中。将它们合并到一个集合中。parent- -1 - -1 - -1 - -1 - -1 - -1 - -1 - -1 - -1 - -10 1 2 3 4 5 6 7 8 9S1parent集合集合 和和 的双亲表示的双亲表示- -4 4 - -3 2 - -3 2 0 0 0 40 1 2 3 4 5 6 7 8 9S2S30768000-4419-344235-322S1 S2的可能的表示方法的可能的表示方法parent集合集合 S1 S2 和和 S3 的双亲表示的双亲表示- -7 4 - -3 2 0 2 0 0 0 40 1 2 3 4 5 6 7 8 9076841941

17、90876-7-7000044444000字典(字典(DictionaryDictionary) n字典是一些元素的集合,每个元素有一字典是一些元素的集合,每个元素有一个称作关键码(个称作关键码(key)的域,不同元素)的域,不同元素的关键码互不相同。的关键码互不相同。n在讨论字典抽象数据类型时,把字典定在讨论字典抽象数据类型时,把字典定义为义为对的集合。对的集合。n根据问题的不同,可以为名字和属性根据问题的不同,可以为名字和属性(信息)赋予不同的含义。(信息)赋予不同的含义。n例如,在图书馆检索目录中,名字是书名,例如,在图书馆检索目录中,名字是书名,属性是索书号及作者等信息;在计算机活动属

18、性是索书号及作者等信息;在计算机活动文件表中,名字是文件名,属性是文件地址、文件表中,名字是文件名,属性是文件地址、大小等信息。大小等信息。n一般来说,有关字典的操作有如下几种:一般来说,有关字典的操作有如下几种: 确定一个指定的名字是否在字典中;确定一个指定的名字是否在字典中; 搜索出该名字的属性;搜索出该名字的属性; 修改该名字的属性;修改该名字的属性; 插入一个新的名字及其属性;插入一个新的名字及其属性;1. 删除一个名字及其属性。删除一个名字及其属性。字典的抽象数据类型字典的抽象数据类型 const int DefaultSize = 26;template class Diction

19、ary /对象: 一组对, 其中, 名字是唯一的public: Dictionary (int size = DefaultSize); /构造函数 bool Member (Name name);/判name是否在字典中 Attribute *Search (Name name); /在字典中搜索关键码与name匹配的表项 void Insert (Name name, Attribute attr); /若name在字典中, 则修改相应对 /的attr项; 否则插入到字典中 void Remove (Name name); /若name在字典中, 则在字典中删除相应的 /对;n用文件记录(

20、用文件记录(record)或表格的表项()或表格的表项(entry)来表示单个元素时,用二元组:来表示单个元素时,用二元组:(关键码(关键码key,记录或表项位置指针,记录或表项位置指针adr)n构成搜索某一指定记录或表项的索引项。构成搜索某一指定记录或表项的索引项。字典的线性表描述字典的线性表描述 n字典可以保存在线性序列字典可以保存在线性序列 (e1,e2,) 中,其中中,其中ei 是字典中的元素,其是字典中的元素,其关键码从左到右依次关键码从左到右依次增大增大。为了适应这种描述方式,可以定义有。为了适应这种描述方式,可以定义有序顺序表和有序链表。序顺序表和有序链表。n用有序链表来表示字典

21、时,链表中的每个结用有序链表来表示字典时,链表中的每个结点表示字典中的一个元素,点表示字典中的一个元素,各个结点按照结各个结点按照结点中保存的数据值非递减链接点中保存的数据值非递减链接,即,即e1e2 。因此,在一个有序链表中寻找一个指定元素因此,在一个有序链表中寻找一个指定元素时,一般不用搜索整个链表。时,一般不用搜索整个链表。跳表(跳表(skip listskip list)n由前面讨论可知,在一个有序顺序表中进行由前面讨论可知,在一个有序顺序表中进行折半搜索,时间效率很高。但是在有序链表折半搜索,时间效率很高。但是在有序链表中进行搜索,只能顺序搜索,需要执行中进行搜索,只能顺序搜索,需要

22、执行O(n)次关键码比较。次关键码比较。n如果在链表中部结点中增加一个指针,则比如果在链表中部结点中增加一个指针,则比较次数可以减少到较次数可以减少到 n/2+1。在搜索时,首先用。在搜索时,首先用要搜索元素与中间元素进行比较,如果要搜要搜索元素与中间元素进行比较,如果要搜索元素小于中间元素,则仅需搜索链表的前索元素小于中间元素,则仅需搜索链表的前半部分,否则只要在链表的后半部分进行比半部分,否则只要在链表的后半部分进行比较即可。较即可。 跳表的结构跳表的结构(a) 带有表头结点和表尾结点的有序链表(b) 在链表中部增加一个链接指针(c) 在前半部分和后半部分中部各增加一个链接指针102030

23、405060701020304050607010203040506070n在上面跳表的例子中有三条链:在上面跳表的例子中有三条链:0 级链级链就是图就是图(a)中的初始链表,包括了所有中的初始链表,包括了所有 7个元素。个元素。1 级级链链包括包括 2、4、6 三个元素。三个元素。2 级链级链只包括第只包括第 4 个元素。个元素。n为了搜索值为为了搜索值为 30 的元素,首先搜索的元素,首先搜索 2 级链,级链,与中间元素与中间元素 40 进行比较,在进行比较,在 2 级链中只需比级链中只需比较较1次。由于次。由于30 20,可到,可到 0 级链继续搜索,与链表中级链继续搜索,与链表中元素进行

24、比较。元素进行比较。 n搜索搜索时间代价为时间代价为O(log2n)。n图图(c)就是跳表,有一组分层的链,就是跳表,有一组分层的链,0级链级链是包是包含所有元素的有序链表,有含所有元素的有序链表,有n个元素。个元素。n0 级链的第级链的第21, 2 21, 3 21, 个结点链接起来形个结点链接起来形成成1级链级链,故,故1级链是级链是0级链的子集。级链的子集。n1 级链的第级链的第22, 2 22, 3 22, 个结点链接起来形个结点链接起来形成成2级链级链,依此类推,依此类推,第第i级链级链所包含的元素是所包含的元素是第第i-1级链级链的子集。的子集。n一个有一个有n个元素的跳表理想情况下的链级数为个元素的跳表理想情况下的链级数为 log2n ,即跳表的最高级数为,即跳表的最高级数为 log2n -1。n若一个元素在若

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论