数据结构6集合与字典.ppt

  1. 1、本文档共67页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构6集合与字典.ppt

字典及其抽象数据类型 考虑的问题是数据的存储和检索(查询),就像在新华字典里字词的组织和查找一个字的相关解释等 ? 存储和检索是计算过程中最重要的基本操作 ? 本章主要讨论基于关键码的数据存储和检索,需要根据某些线索找出相关的数据 ? 支持这种操作的数据结构,通常称为字典或查找表 ? 不是介绍一种结构,而是介绍计算中最重要的一种问题的许多不同解决方式,以及各种相关性质 ? 将用到前面讨论过的许多结构。包括各种线性结构、树性结构及其各种组合,涉及在这些结构上操作的许多算法 抽象模型 设有关键码集合KEY和值(或称属性)集合VALUE 关联(Association)是二元组(k,v)∈KEYxVALIUE 字典:以关联为元素的有穷集合(key不相同) 关键码到值的有穷函数:key-value 主要字典操作: ? 检索(search) ? 插入元素(insert) ? 删除元素(delete) ? 修改某key对应的值 p269字典的抽象数据结构 最主要也是使用最频繁的操作是检索(也称查找) 检索效率是字典实现中最重要的考虑因素 静态字典:建立后保持不变的字典 动态字典:内容经常动态变动的字典 静态字典的基本操作就是检索。实现中主要考虑检索效率 动态字典除检索外还有插入和删除,实现中还需要考虑: ? 插入删除操作的效率 ? 插入删除可能导致字典结构变化,动态变化中能否保证检索效率?(使字典性能不随操作的进行而逐渐恶化) ? 存储和检索是计算机信息处理中最基本的工作 ? 字典就是实现存储和检索的结构 ? 需要存储和检索的信息有许多具体情况,因此要考虑各种不同的字典实现技术。 ? 这里的基本问题是空间利用率和操作效率检索效率的评价标准:检索过程中关键码的平均比较次数,即平均检索长度ASL(average search length),定义为: ASL =Σni=1pici ci 和pi 分别为元素i 的检索长度和概率。若各元素的检索概率相等,就有pi=1/n。ASL = 1/n Σ ci 。 字典的组织方法很多,如:顺序、跳表、散列、二叉树和B树等。 线性表表示 线性表可以保存信息,因此可以作为字典的实现基础 关联在线性表里顺序排列,形成关联的序列 检索就是在线性表里查找关键码合适的元素 数据元素的插入删除都是很平常的线性表操作 顺序表表示 链表表示(p270) 顺序检索算法 /*在字典中顺序检索关键码为key的元素*/ int seqSearch(SeqDic *pdic, KeyType key, int *position) { int i; for(i = 0; i pdic-n; i++) /* 从头开始向后扫描*/ if(pdic-element[i].key == key) { *position = i; return TRUE; /* 检索成功*/ } *position = -1; return FALSE; /* 检索失败*/ } 失败时由position 设置一个特殊值。 平均检索长度分析 ASL = 1*p1 +2* p2 + …+n* pn = (1+2+…+n)/n (pi=1/n 时) = (n+1)/2 = O(n) 优点:数据结构和算法简单,元素是否有序均可使用 缺点:平均检索长度大,n很大时检索耗时太多 不适合动态变化频繁的字典 删除元素需顺序检索,O(n) ,可能大量移动数据 插入元素(关联)时可保存在已有元素之后,O(1) 操作;若要防止出现重复关键码,就需要检查所有元素,O(n) 动态变化中字典的检索效率不变(已经是最低效的) 二分法检索算法 如果字典元素之间有关系,就可能利用它加快检索速度。最常见的关系是关键码有序,这时将元素按序排列(从小到大或从大到小)排列,就可以快速检索(二分法) 二分法检索基本过程(假设元素按关键码升序排列): 1. 初始时,考虑范围是整个字典(顺序表) 2. 取考虑范围中位于中间的元素,用这个元素的关键码与检索关键码比较。如果相等则检索结束;否则 3. 如果检索关键码较大,把检索范围改为位置高的一半;如果检索关键码较小,把检索范围改为低一半 4. 如果范围里已经无元素,检索失败结束,否则回到2 /* 在字典中用二分法检索关键码为key的元素*/ int biSearch(SeqDic *pdic, KeyType key, int *position) { int low = 0, high = pdic-n-1, mid; while(low=high) { mid = (low+high)/2; /* 当前检索的中间位置*/ if(pdi

文档评论(0)

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

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

1亿VIP精品文档

相关文档