数据结构教程 第6章 集合及字典.ppt

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
集合及其表示 并查集与等价类 字典 跳表 散列 6.1.1 集合及其表示 集合是成员(对象或元素)的一个群集。集合中的成员可以是原子(单元素),也可以是集合。 集合的成员必须互不相同。 在算法与数据结构中所遇到的集合,其单元素通常是整数、字符、字符串或指针,且同一集合中所有成员具有相同的数据类型。 colour = { red, orange, yellow, green, black, blue, purple, white } name = {An, Cao, Liu, Ma, Peng, Wang, zhang } 集合中的成员一般是无序的,但在表示它时,常设定集合中的单元素具有线性有序关系,此关系可记作“”,表示“优先于” ;整数、字符和字符串都有一个自然线性顺序。指针也可依据其在序列中安排的位置给予一个线性顺序。 某些集合保存的是实际数值,某些集合保存的是表示元素是否在集合中的指示信息。 要求每个元素在集合中只出现一次,但多种集合允许元素重复出现。 集合的有序链表类的定义 6.2.1 并查集 (Union-Find Sets) 并查集支持以下三种操作: Union (Root1, Root2) //并操作 Find (x) //搜索操作 UFSets (s) //构造函数 对于并查集来说,每个集合用一棵树表示。 为此,采用树的双亲表示作为集合存储表示。集合元素的编号从0到 n-1。其中 n 是最大元素个数。 在双亲表示中,第 i 个数组元素代表包含集合元素 i 的树结点。根结点的双亲为-1,表示集合中的元素个数。 在同一棵树上所有结点所代表的集合元素在同一个子集合中。 初始时, 用构造函数 UFSets(s) 构造一个森林, 每棵树只有一个结点, 表示集合中各元素自成一个子集合。 用 Find(i) 寻找集合元素 i 的根。如果有两个集合元素 i 和 j, Find(i) == Find(j), 表明这两个元素在同一个集合中。 如果两个集合元素 i 和 j 不在同一个集合中,可用 Union(i, j) 将它们合并到一个集合中。 并查集类的定义 成员函数的实现 6.3 字典(Dictionary) 以集合为基础,支持Member、Insert、Remove三种运算的抽象数据类型叫做字典。 字典的概念: 字典是一些元素的集合,每个元素有一个称作关键码的域。 在讨论字典抽象数据类型时,把字典定义为名字-属性对的集合。 字典的操作: 确定一个指定的名字是否在字典中; 搜索出该名字的属性; 修改该名字的的属性; 插入一个新的名字及其属性; 删除一个名字及其属性。 考虑到搜索效率, 可以用顺序表方式、二叉搜索树或多路搜索树方式组织字典。本章介绍3种字典的组织方式:线性表、跳表和散列表。 6.4 跳表(Skip List) 在链表的中部结点增加一个指针,以减少搜索时的比较次数。 6.5 散列 (Hashing) 散列方法 散列方法在元素存储位置与其关键码之间建立一个确定的对应函数关系Hash( ),使每个关键码与结构中一个唯一存储位置相对应: Address = Hash (key ) 在搜索时, 先对元素的关键码进行函数计算,把函数值当做元素的存储位置, 在结构中按此位置取元素比较。若关键码相等, 则搜索成功。在存放元素时, 依相同函数计算存储位置, 并按此位置存放。这种方法就是散列方法。 在散列方法中使用的转换函数叫做散列函数。按此方法构造出来的表或结构就叫做散列表。 使用散列方法进行搜索不必进行多次关键码的比较, 搜索速度比较快, 可以直接到达或逼近具有此关键码的元素的实际存放地址。 散列函数是一个压缩映象函数。关键码集合比散列表地址集合大得多。因此有可能经过散列函数的计算,把不同的关键码映射到同一个散列地址上,这就产生了冲突。 示例:有一组元素,其关键码分别是 12361, 07251, 03309, 30976 采用的散列函数是 hash(x) = x % 73 其中,“%”是除法取余操作。 则有:hash(12361) = hash(07251) = hash(03309) = hash(30976) = 24。就是说, 对不同的关键码, 通过散列函数的计算, 得到了同一散列地址。 我们称这些产生冲突的散列地址相同的不同关键码为同义词。 由于关键码集合比地址集合大得多, 冲突很难避免。所以对于散列方法, 需要讨论以下两个问题: 对于给定的一个关键码集合, 选择一个计算简单且地址分布比较均匀的散列函数,

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档