集合与字典 (2)精选文档.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《集合与字典 (2)精选文档.ppt》由会员分享,可在线阅读,更多相关《集合与字典 (2)精选文档.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、集合与字典本讲稿第一页,共七十四页算法与数据结构29.19.1集合及其运算集合及其运算集合及其运算集合及其运算集合是一个基本数学概念,也是一种基本数据结构。集合是一个基本数学概念,也是一种基本数据结构。集合是一个基本数学概念,也是一种基本数据结构。集合是一个基本数学概念,也是一种基本数据结构。抽象地说集合是一些个体(值)的无序汇集;而在实用中抽象地说集合是一些个体(值)的无序汇集;而在实用中抽象地说集合是一些个体(值)的无序汇集;而在实用中抽象地说集合是一些个体(值)的无序汇集;而在实用中作为数据结构的集合可以有多种形式,例如:作为数据结构的集合可以有多种形式,例如:作为数据结构的集合可以有多
2、种形式,例如:作为数据结构的集合可以有多种形式,例如:本讲稿第二页,共七十四页算法与数据结构3集合的抽象定义明确说其中的元素是无顺序的。这样,集合的抽象定义明确说其中的元素是无顺序的。这样,集合的抽象定义明确说其中的元素是无顺序的。这样,集合的抽象定义明确说其中的元素是无顺序的。这样,只有对集合中所有的值进行比较之后,才能判断两个集只有对集合中所有的值进行比较之后,才能判断两个集只有对集合中所有的值进行比较之后,才能判断两个集只有对集合中所有的值进行比较之后,才能判断两个集合是否相等。为了提高效率,集合的许多实现中规定了合是否相等。为了提高效率,集合的许多实现中规定了合是否相等。为了提高效率,
3、集合的许多实现中规定了合是否相等。为了提高效率,集合的许多实现中规定了在元素之间可以进行比较和按顺序存储。在元素之间可以进行比较和按顺序存储。在元素之间可以进行比较和按顺序存储。在元素之间可以进行比较和按顺序存储。本讲稿第三页,共七十四页算法与数据结构4一些集合中保存的是实际的数据值,而另一些集合保一些集合中保存的是实际的数据值,而另一些集合保一些集合中保存的是实际的数据值,而另一些集合保一些集合中保存的是实际的数据值,而另一些集合保存的是元素是否存在于集合中的指示信息。存的是元素是否存在于集合中的指示信息。存的是元素是否存在于集合中的指示信息。存的是元素是否存在于集合中的指示信息。例如,如果
4、一个集合的元素是字符型或取值范围不太例如,如果一个集合的元素是字符型或取值范围不太例如,如果一个集合的元素是字符型或取值范围不太例如,如果一个集合的元素是字符型或取值范围不太大的整数型,那么只要保存指示信息就足够了,因为,大的整数型,那么只要保存指示信息就足够了,因为,大的整数型,那么只要保存指示信息就足够了,因为,大的整数型,那么只要保存指示信息就足够了,因为,如果需要的话,整个值的集合很容易被重新建立起来;如果需要的话,整个值的集合很容易被重新建立起来;如果需要的话,整个值的集合很容易被重新建立起来;如果需要的话,整个值的集合很容易被重新建立起来;但是如果集合包含的是学生记录学生记录或浮点
5、数数但是如果集合包含的是学生记录学生记录或浮点数数但是如果集合包含的是学生记录学生记录或浮点数数但是如果集合包含的是学生记录学生记录或浮点数数据,由于这些值不容易重建,所以这些元素的实际数据,由于这些值不容易重建,所以这些元素的实际数据,由于这些值不容易重建,所以这些元素的实际数据,由于这些值不容易重建,所以这些元素的实际数据值必须保存在集合里。据值必须保存在集合里。据值必须保存在集合里。据值必须保存在集合里。本讲稿第四页,共七十四页算法与数据结构5在集合的抽象概念实际要求每个元素只在集合中出现一次。在集合的抽象概念实际要求每个元素只在集合中出现一次。在集合的抽象概念实际要求每个元素只在集合中
6、出现一次。在集合的抽象概念实际要求每个元素只在集合中出现一次。但有些实际应用却需要允许元素的重复出现。但有些实际应用却需要允许元素的重复出现。但有些实际应用却需要允许元素的重复出现。但有些实际应用却需要允许元素的重复出现。比如一个班级里的所有学生姓名的集合,实际上无法排除同比如一个班级里的所有学生姓名的集合,实际上无法排除同比如一个班级里的所有学生姓名的集合,实际上无法排除同比如一个班级里的所有学生姓名的集合,实际上无法排除同学之间重名的可能性。这时可以使用集合的一种变体:称为学之间重名的可能性。这时可以使用集合的一种变体:称为学之间重名的可能性。这时可以使用集合的一种变体:称为学之间重名的可
7、能性。这时可以使用集合的一种变体:称为多重集合。多重集合。多重集合。多重集合。多重集合(多重集合(多重集合(多重集合(multisetmultiset,或称为包,或称为包,或称为包,或称为包bagbag)是一种类似集)是一种类似集)是一种类似集)是一种类似集合的结构,其基本性质与集合类似,但允许元素的重合的结构,其基本性质与集合类似,但允许元素的重合的结构,其基本性质与集合类似,但允许元素的重合的结构,其基本性质与集合类似,但允许元素的重复出现。复出现。复出现。复出现。本讲稿第五页,共七十四页算法与数据结构6如果在集合实现时采用的是保存实际数据值的方法,如果在集合实现时采用的是保存实际数据值的
8、方法,如果在集合实现时采用的是保存实际数据值的方法,如果在集合实现时采用的是保存实际数据值的方法,只要加上一个相关值出现次数的计数器就可以用于实只要加上一个相关值出现次数的计数器就可以用于实只要加上一个相关值出现次数的计数器就可以用于实只要加上一个相关值出现次数的计数器就可以用于实现包;现包;现包;现包;如果集合用记录元素是否存在的指示信息的方式实现,如果集合用记录元素是否存在的指示信息的方式实现,如果集合用记录元素是否存在的指示信息的方式实现,如果集合用记录元素是否存在的指示信息的方式实现,要改做包的实现就比较困难。要改做包的实现就比较困难。要改做包的实现就比较困难。要改做包的实现就比较困难
9、。本讲稿第六页,共七十四页算法与数据结构79.1.19.1.1集合运算集合运算集合运算集合运算 与前面讲到的许多数据结构类似,对一个集合也与前面讲到的许多数据结构类似,对一个集合也与前面讲到的许多数据结构类似,对一个集合也与前面讲到的许多数据结构类似,对一个集合也可以定义增加一个元素,删除一个元素,或者测可以定义增加一个元素,删除一个元素,或者测可以定义增加一个元素,删除一个元素,或者测可以定义增加一个元素,删除一个元素,或者测试一个元素是否已在集合中等运算,但集合作为试一个元素是否已在集合中等运算,但集合作为试一个元素是否已在集合中等运算,但集合作为试一个元素是否已在集合中等运算,但集合作为
10、一种抽象数据类型,其定义的特点应体现在涉及一种抽象数据类型,其定义的特点应体现在涉及一种抽象数据类型,其定义的特点应体现在涉及一种抽象数据类型,其定义的特点应体现在涉及两个(或多个)集合之间的一些运算。这些运算两个(或多个)集合之间的一些运算。这些运算两个(或多个)集合之间的一些运算。这些运算两个(或多个)集合之间的一些运算。这些运算主要有:主要有:主要有:主要有:本讲稿第七页,共七十四页算法与数据结构8并集:两个集合的并集定义为由两个集合的所有并集:两个集合的并集定义为由两个集合的所有并集:两个集合的并集定义为由两个集合的所有并集:两个集合的并集定义为由两个集合的所有元素形成的集合。元素形成
11、的集合。元素形成的集合。元素形成的集合。交集:两个集合的交集由同时在两个集合中出现的那交集:两个集合的交集由同时在两个集合中出现的那交集:两个集合的交集由同时在两个集合中出现的那交集:两个集合的交集由同时在两个集合中出现的那些元素组成。些元素组成。些元素组成。些元素组成。差集:求两个集合的差集与求交集相反。差集由第一差集:求两个集合的差集与求交集相反。差集由第一差集:求两个集合的差集与求交集相反。差集由第一差集:求两个集合的差集与求交集相反。差集由第一个集合中的所有不在第二个集合里出现的元素组成。个集合中的所有不在第二个集合里出现的元素组成。个集合中的所有不在第二个集合里出现的元素组成。个集合
12、中的所有不在第二个集合里出现的元素组成。子集:一个集合称为是另一个集合的子集,如果这个集子集:一个集合称为是另一个集合的子集,如果这个集子集:一个集合称为是另一个集合的子集,如果这个集子集:一个集合称为是另一个集合的子集,如果这个集合的所有元素都出现在另一个集合里。合的所有元素都出现在另一个集合里。合的所有元素都出现在另一个集合里。合的所有元素都出现在另一个集合里。相等:两个集合相等,指的是第一个集合的元素相等:两个集合相等,指的是第一个集合的元素相等:两个集合相等,指的是第一个集合的元素相等:两个集合相等,指的是第一个集合的元素都出现在第二个集合里,而第二个集合的元素也都出现在第二个集合里,
13、而第二个集合的元素也都出现在第二个集合里,而第二个集合的元素也都出现在第二个集合里,而第二个集合的元素也都出现在第一个集合里。这个概念的另一种表述都出现在第一个集合里。这个概念的另一种表述都出现在第一个集合里。这个概念的另一种表述都出现在第一个集合里。这个概念的另一种表述是:若两个集合互为子集则称这两个集合相等。是:若两个集合互为子集则称这两个集合相等。是:若两个集合互为子集则称这两个集合相等。是:若两个集合互为子集则称这两个集合相等。本讲稿第八页,共七十四页算法与数据结构9从抽象的观点考查上述定义的集合与集合之间的运算,我从抽象的观点考查上述定义的集合与集合之间的运算,我从抽象的观点考查上述
14、定义的集合与集合之间的运算,我从抽象的观点考查上述定义的集合与集合之间的运算,我们发现这些运算可以通过简单地增加元素,检测成员,删们发现这些运算可以通过简单地增加元素,检测成员,删们发现这些运算可以通过简单地增加元素,检测成员,删们发现这些运算可以通过简单地增加元素,检测成员,删除元素等运算定义。除元素等运算定义。除元素等运算定义。除元素等运算定义。已知集合已知集合已知集合已知集合A A和和和和B B,求它们的并集,求它们的并集,求它们的并集,求它们的并集,只要以集合只要以集合只要以集合只要以集合A A(或(或(或(或B B)为基)为基)为基)为基础,把集合础,把集合础,把集合础,把集合B B
15、(或(或(或(或A A)中的元素逐个插入。)中的元素逐个插入。)中的元素逐个插入。)中的元素逐个插入。在求两个集合的交集时,只要从在求两个集合的交集时,只要从在求两个集合的交集时,只要从在求两个集合的交集时,只要从A A(或(或(或(或B B)集出发,检查)集出发,检查)集出发,检查)集出发,检查它的每个元素是否在它的每个元素是否在它的每个元素是否在它的每个元素是否在B B(或(或(或(或A A)集中出现,若是,则把该元)集中出现,若是,则把该元)集中出现,若是,则把该元)集中出现,若是,则把该元素插入到结果集合(初态为空集)中即可。素插入到结果集合(初态为空集)中即可。素插入到结果集合(初态
16、为空集)中即可。素插入到结果集合(初态为空集)中即可。求求求求A A与与与与B B的差集的差集的差集的差集A-B A-B 时,只要以时,只要以时,只要以时,只要以A A集为基础,对每个集为基础,对每个集为基础,对每个集为基础,对每个B B集中集中集中集中的元素做删除运算即可。的元素做删除运算即可。的元素做删除运算即可。的元素做删除运算即可。本讲稿第九页,共七十四页算法与数据结构10如果我们用如果我们用如果我们用如果我们用a a,i i,和,和,和,和r r分别代表分别代表分别代表分别代表增加元素,检测元素,增加元素,检测元素,增加元素,检测元素,增加元素,检测元素,删除元素运算的执行时间,删除
17、元素运算的执行时间,删除元素运算的执行时间,删除元素运算的执行时间,并假定集合中的元素为并假定集合中的元素为并假定集合中的元素为并假定集合中的元素为n n个。个。个。个。依集合运算的抽象实现,可以估算出这些运算操作依集合运算的抽象实现,可以估算出这些运算操作依集合运算的抽象实现,可以估算出这些运算操作依集合运算的抽象实现,可以估算出这些运算操作的时间上限:的时间上限:的时间上限:的时间上限:求求求求两个集合的并时间为两个集合的并时间为两个集合的并时间为两个集合的并时间为O(a n);O(a n);求差集的运行时间为求差集的运行时间为求差集的运行时间为求差集的运行时间为O(r n);O(r n)
18、;求交集的运行时间为求交集的运行时间为求交集的运行时间为求交集的运行时间为O(i+a)n)O(i+a)n)。本讲稿第十页,共七十四页9.1.2集合类集合类我们可以定义一个集合类。定义这个类主我们可以定义一个集合类。定义这个类主要是为了说明各种实现集合的数据结构都要是为了说明各种实现集合的数据结构都应当具有的操作。这个类里没有为集合的应当具有的操作。这个类里没有为集合的实现而设置的内部数据结构,因此也就不实现而设置的内部数据结构,因此也就不需要构造函数和析构函数。需要构造函数和析构函数。本讲稿第十一页,共七十四页templateclasssetpublic:virtualintisEmpty(v
19、oid)const=0;virtualintincludes(constTval)const=0;virtualvoidadd(constTval)=0;virtualvoidremove(constTval)=0;voidintersectWith(constset&);voidunionWith(constset&);voiddifferenceFrom(constset&);intsubset(constset&)return0;intoperator=(constset&)return0;类类9.1集合类集合类本讲稿第十二页,共七十四页我们无法把我们无法把set中的方法都定义为纯虚函数
20、,因为在中的方法都定义为纯虚函数,因为在实现集合操作的成员函数里都包含了对集合类的实实现集合操作的成员函数里都包含了对集合类的实例对象的引用参数。这种情况下函数不能定义为纯例对象的引用参数。这种情况下函数不能定义为纯虚的。这里为每个函数虚构了一个函数体,它们是虚的。这里为每个函数虚构了一个函数体,它们是永远不会被真正使用的。永远不会被真正使用的。这里还有一个新情况,在这里还有一个新情况,在set类的定义里面直接写出类的定义里面直接写出intersectWith等成员函数的定义,而不是只写它们的等成员函数的定义,而不是只写它们的原型。原型。C+允许这样做。当成员函数很短小时,为紧允许这样做。当成
21、员函数很短小时,为紧凑或消除过多重复描述,常采用这种写法凑或消除过多重复描述,常采用这种写法本讲稿第十三页,共七十四页举一个例子讨论上面提出的问题。假设我们把举一个例子讨论上面提出的问题。假设我们把unionWith定义为纯虚函数,函数在类规范里的原定义为纯虚函数,函数在类规范里的原型应该是:型应该是:virtualvoidunionWith(constset&)=0;在在set的实际子类中就必须给出的实际子类中就必须给出unionWith的实现,的实现,而实际上我们无法给出具有同样函数原型的函数的实而实际上我们无法给出具有同样函数原型的函数的实际实现。际实现。本讲稿第十四页,共七十四页为说明
22、这个问题,假设我们要把为说明这个问题,假设我们要把setA定义为定义为set的非抽象的子类,现在考虑它的定义以及其中的非抽象的子类,现在考虑它的定义以及其中纯虚函数纯虚函数unionWith的规范。按照需要,我们应的规范。按照需要,我们应该写:该写:templateclasssetA:publicset.virtualvoidunionWith(constsetA&s);.本讲稿第十五页,共七十四页但是,在这样定义好类规范并建立的但是,在这样定义好类规范并建立的setA所有成员函数所有成员函数之后,会发现仍然无法建立之后,会发现仍然无法建立setA的实例对象。的实例对象。例如,如果我们写出下面
23、的变量定义例如,如果我们写出下面的变量定义setAs1;程序编译时会发生错误,系统将告诉我们:在建立程序编译时会发生错误,系统将告诉我们:在建立setA的实例时,遇到了没有给出定义的纯虚函数的实例时,遇到了没有给出定义的纯虚函数voidunionWith(constset&)。因为在上面因为在上面setA里定义的里定义的unionWith函数的参数类型与函数的参数类型与set里里unionWith的参数不同,这将被认为是对原函数的参数不同,这将被认为是对原函数名的另一个重载定义,而原来的纯虚函数仍然没有定名的另一个重载定义,而原来的纯虚函数仍然没有定义。义。本讲稿第十六页,共七十四页显然,在显
24、然,在setA里把里把unionWith定义为:定义为:virtualvoidunionWith(constset&s);是没有意义的,不会有抽象类的实例成为实际参数,是没有意义的,不会有抽象类的实例成为实际参数,因为根本没有这种实例。因为根本没有这种实例。上述问题是可能通过其他途径绕过去的,但那将使问上述问题是可能通过其他途径绕过去的,但那将使问题大大的复杂化,给出的定义很费事,理解起来也比较困题大大的复杂化,给出的定义很费事,理解起来也比较困难。这里选择的是一种较自然方便的做法。难。这里选择的是一种较自然方便的做法。本讲稿第十七页,共七十四页算法与数据结构189.3 9.3 集合的表实现集
25、合的表实现集合的表实现集合的表实现本讲稿第十八页,共七十四页算法与数据结构19在这节里,我们将考虑利用表实现集合的方法,也就在这节里,我们将考虑利用表实现集合的方法,也就在这节里,我们将考虑利用表实现集合的方法,也就在这节里,我们将考虑利用表实现集合的方法,也就是说,在集合对象中用一个表数据成分,借助它存储是说,在集合对象中用一个表数据成分,借助它存储是说,在集合对象中用一个表数据成分,借助它存储是说,在集合对象中用一个表数据成分,借助它存储集合的元素。根据这个想法定义的集合的元素。根据这个想法定义的集合的元素。根据这个想法定义的集合的元素。根据这个想法定义的setListsetList见类见
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合与字典 2精选文档 集合 字典 精选 文档
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内