- 1、本文档共46页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用不同的冲突处理方法时散列表的平均查找长度 例1: 求散列表大小并设计散列函数 条件:设有一个含200个记录的散列表,要求用平方探查法解决冲突,且要求按关键码查询时,找到一个新记录插入位置的平均探查次数不超过1.5。 问题:哈希表至少应该多大?并设计哈希函数。 分析:对平方探测法,查找不成功的平均搜索长度为 Un=1 / (1 -α), 解答:根据要求n=200,且: Un=1 / (1 -α) ? 1.5 ? ? 1/3 ? = n / m = 200 / m m ? 600 五. 可扩充散列 问题提出: 可扩充散列是一种动态散列方法,它对传统的散列技术进行了扩充。它采用树型结构实现哈希表的存储结构,使之能够动态(再散列不需要复制)地适应对文件存储容量的需求,并能保持高效(访问外存次数少)的搜索效率。 根据关键字二进制码的最低 2 位进行划分,可以把这些关键字分成 4 类。假设把它们 4 个页块的文件中, 每页最多可以容纳2个关键码。这样就可以利用各关键码的最低2位(00, 01, 10, 11)来决定它们的存储页块。 二叉Trie树: 根据各关键码的二进制位表示, 从最低位到最高位进行划分, 各页块的索引构成一个二叉树结构。 二叉Trie树构造方法: 首先, 在根结点处按各关键码的最低位是 1 还是 0, 划分为两组。对于每一组再按次低位是 1 还是 0 继续分组, 如此分下去, 直到每组剩下不多于 2 个关键码为止。 二叉Trie树组成: 在二叉Trie树中有两类结点:分支结点和叶结点。分支结点按其相关二进位是 1 还是 0, 分为两个分支; 叶结点包含指向关键码存放页块的指针。 根据关键字二进制码的最低 2 位进行划分,可以把这些关键字分成 4 类。假设把它们 4 个页块的文件中, 每页最多可以容纳2个关键码。这样就可以利用各关键码的最低2位(00, 01, 10, 11)来决定它们的存储页块。 再插入 一个新关键码 C1(110001) 2. 将二叉Trie树转换为目录表 关键码插入及页块分裂 1. 在向一个页块插入关键码 key 时, 如果该页块不满, 可以直接将关键码插入; 2. 如果该页块已满,需要分裂页块 如果目录中指向每一个页块的局部深度都小于目录表的深度, 即:PgDepth DicDepth 则需要紧缩目录。其过程与目录扩充的过程相反。 性能分析 可扩充散列技术是一种非常好的问题解决方法 : 其目录表的地址空间可以扩充和收缩。 在时间方面 : 用基于目录表的可扩充散列方法进行检索, 仅需要 2 次磁盘访问。一次转载目录表,一次转载页块。 在空间方面 : 因增加不均匀分布的关键码可能会导致目录表扩充一倍,许多指针指到同一页块,这样会消耗许多存储空间。 可扩充散列结构: 由一个目录表和一组页块构成。 定义页块信息: 页块的局部深度 PgDepth——指明该页块中存放的记录二进码地址的低位部分有多少位是相同的; C5 C3 000 001 010 011 100 101 110 111 A0, B0 A1, B1 C2 PgDepth=2 3. 插入与目录扩充 A0, B0 C2 C3 0 0 1 0 1 1 A1, B1 C5 0 1 PgDepth=3 PgDepth=2 PgDepth=2 PgDepth=3 C5 C3 000 001 010 011 100 101 110 111 A0, B0 A1, B1 C2 PgDepth=2 A0, B0 C2 C3 0 0 1 0 1 1 A1, B1 C5 0 1 PgDepth=3 PgDepth=2 PgDepth=2 PgDepth=3 定义目录表信息: 目录表深度 DirDepth——为区分各个页块所需的二进制位数。 DirDepth=3 DirDepth 与 PgDepth 的关系 A0, B0 C2 A1, B1 C3 00 01 10 11 DirDepth=2 P
文档评论(0)