散列法(hashing)检索.pptVIP

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
散列法(hashing)检索 2007/05/18 关于作业 分层次的介绍自己的设计 要学会利用图示阐明自己的思想 One picture is worth a thousand words 要侧重最坏情况的考察与分析 最好能根据具体的应用问题给出定制的数据结构与算法解决方案。 应用场景设定与数据分析 图书馆、人事档案、网络搜索引擎、bbs… 数据分析: 基础数据结构 数据量 数据格式、索引 数据操作(等概率假设?) 只读、批量追加(更新、删除) 频繁读写 只写,批量恢复 在线、离线 数据结构设计 基础数据存储方式 数据结构与算法的设计: 动态、静态 检索: 查找 浏览 统计 重复键值: 有没有实际应用需求? 如何套用、改进、设计相关的数据结构与算法 常用的数据结构回顾 队列、栈: 反映问题处理流程。 线性表: 基于连续存储 有序:支持直接存取O(1)、二分 O(log2n),插入删除不方便 无序:遍历。 O(n) 基于链表存储: O(n),动态插入删除较方便。 排序树 非平衡 O(n) 平衡 O(log2n) 可较好支持插入删除 最佳、加权平衡、多分树(缓冲块大小) 本讲主要内容: 散列表概念 散列表的实现 开地址法 拉链法 散列表 散列法(hashing)又称为杂凑法或关键码—地址转换法。用散列法表示的字典称为散列表。 设给定一个字典元素,其关键码为key,将key看成自变量,按一个确定的散列函数 h 计算出h(key),把h(key)作为关键码key对应元素的存储地址(或称 散列地址),再进行字典元素的插入和检索操作。 例子: 由下标值 到 元素地址: &a[i] ? a + i* sizeof(e); O(1). 问题: 下标值连续。要维护线序结构 由不连续key值到元素地址: 变量名表 地址 散列函数基本要求: 负载因子 = 数据元素数目m /存储空间的个数n 尽可能将输入的数据项杂乱无章的映射到存储空间中 遇到碰撞(h(key1) = h(key2))采用统一的解决策略。 几种常见的hash函数 —— 除余法 选择一个适当的正整数P,用P去除关键码,余数作为散列地址,即h(key)=key%P。这个方法的关键是选取适当的P。一般P为素数比较好。 除余法地址计算公式非常简单。实践证明恰恰是这种简单的方法在许多情况下效果较好。除余法是一种最常用的散列函数,在许多静态字典和动态字典中都被采用。 前提:key>>P 数字分析法: 中平方法 先求出关键码的平方,然后取中间几位作为地址。 例如:关键码key=4731 47312 =如果地址长度为3位,则可以取第三位到第五位作为散列地址,即有h1(4731)=382,当然也可以取4-6位,即有h2(4731)= 823。 碰撞的处理 —— 开地址法 Open Addressing 在基本区域内形成一个同义词的探查序列,沿着探查序列逐个查找,直到找到查找的元素或碰到一个未被占用的地址为止。 若插入元素,则碰到空的地址单元就存放要插入的同义词。 若检索元素,则需要碰到空的地址单元后,才能说明表中没有待查的元素(检索失败)。 负载因子 < 1 开地址法 —— 线性探查 Linear Probing 即将基本存储区看作一个循环表。若在地址为d=h(key)的单元发生碰撞,则依次探查下述地址单元∶ d+1,d+2,…,m-1,0,1,…,d-1 (m为基本存储区的长度) 直到找到一个空单元或查找到关键码为key的元素为止。如果从单元d开始探查,查找一遍后,又回到地址d,则表示基本存储区已经溢出。 例子: clustering of linear probing 散列表的数据结构定义 散列表的检索算法 — 用线性探查法解决碰撞 int linearSearch(HashDictionary * phash, KeyType key, int *position){ int d, inc; d=h(key); /* d为散列地址,散列函数为h(key) */ for(inc=0; inc<phash->m; inc++){ if(phash->element[d].key==key) { *position=d; /* 检索成功 */ return(1); } else if(phash->element[d].key==0

文档评论(0)

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

1亿VIP精品文档

相关文档