- 1、本文档共97页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
开放地址法: 散列表是一个数组,存储效率高,随机查找。 散列表有“聚集”现象 链地址法: 散列表是顺序存储和链式存储的结合,链表部分的存储效率和查找效率都比较低。 关键字删除不需要“懒惰删除”法,从而没有存储“垃圾”。 太小的α可能导致空间浪费,大的α又将付出更多的时间代价。不均匀的链表长度导致时间效率的严重下降。 应用:文件中单词词频统计 [例] 给定一个英文文本文件,统计文件中所有单词出现的频率,并输出词频最大的前10%的单词及其词频。 假设单词字符定义为大小写字母、数字和下划线,其它字符均认为是单词分隔符,不予考虑。 【分析】关键:对新读入的单词在已有单词表中查找,如果已经存在,则将该单词的词频加1,如果不存在,则插入该单词并记词频为1。 如何设计该单词表的数据结构才可以进行快速地查找和插入? 散列表 人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。 * (3) 删除39时,为保持其“中序有序”,可将父结点中43下移至39处,而将右兄弟中最左边的47上移至原43处,如图8.10(d)所示。 结论:被删关键字所在结点中关键字数目等于[m/2]-1,而与该结点相邻的右兄弟(左兄弟)结点的关键字数目大于[m/2]-1,则需将右兄弟的最小(左兄弟的最大)关键字移至双亲结点中,而将双亲结点中小于(或大于)且紧靠该上移关键字的关键字移至被删关键字所在结点中。 (4) 删除64后,为保持各分支等长(平衡),将删除64后的剩余信息(在此为空指针)及78合并入右兄弟,如图8.10(e)所示。也可将删除64后的剩余信息及47与左兄弟合并。 结论:被删关键字所在结点和其相邻的兄弟结点中的关键字数目均等于[m/2]-1,设该结点有右兄弟且所在结点中剩余的关键字和指针,加上双亲中的Ki一起,合并到Ai所指兄弟结点中。 (5) 删除27时,首先将剩余信息(在此为空指针)与父结点中的18并入左兄弟,并释放空结点,结果如图8.10(f)所示。再将父结点中的剩余信息与祖父结点中的35并入47左端,释放空结点后的结果如图8.10(g)所示。至此,祖父结点仍需要合并,但由于待合并结点的父指针为NULL,故停止合并,直接将根指针bt置为指针p2的值,释放空结点后的结果如图8.10(h)所示。 图8.10 在B-树最下层结点中删除关键字 图8.11 在B-树非最下层删除关键字 2) 在非最下层结点中删除一个关键字 四.B+树 B+树是应文件系统所需而出的一种B-树的变型。一棵m阶的B+树和一棵m阶的B-树的差异在于: ① 有n棵子树的结点中含有n个关键字。 ② 所有的叶子结点中包含了全部关键字信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序连接。 ③ 所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。 B+树可以进行两种查找运算。 注:若从根开始查找时,若非终端结点等于该关键字,并不停止,继续到叶子。 已知的几种查找方法: 顺序查找 O(N) 二分查找(静态查找) O (log 2 N) 二叉搜索树 O(h) 平衡二叉树 O (log 2 N) 还有其他方法吗? 8.3 哈希表 [例] 在登录QQ的时候,QQ服务器是如何核对你的身份?面对庞大的用户群,如何快速找到用户信息? 【分析】看看是否可以用二分法查找。 ? 十亿(109 ≈ 230)有效用户,用二分查找30次。 ? 十亿(109 ≈ 230) × 1K ≈ 1024G,1T连续空间。 ? 按有效QQ号大小有序存储:在连续存储空间中,插入和删除一个新QQ号码将需要移动大量数据。 (不合适) 【问题】如何快速搜索到需要的关键词?如果关键词不方便比较怎么办? 查找的本质: 已知对象找位置。 有序安排对象:全序、半序 直接“算出”对象位置:散列 ? 散列查找法的两项基本工作: 计算位置:构造散列函数确定关键词存储位置; 解决冲突:应用某种策略解决多个关键词位置相同的问题 ? 时间复杂度几乎是常量:O(1),即查找时间与问题规模无关!
文档评论(0)