- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 应用开散列法处理冲突, 需要增设链接指针,似乎增加了存储开销。事实上, 由于闭散列法必须保持大量的空闲空间以确保搜索效率,如二次探查法要求装填因子?≤0.5,而表项所占空间又比指针大得多,所以使用开散列法反而比闭散列法节省存储空间。 散列表直接出计算表项存放地址,在关键码与存储位置之间直接建立了映象。 散列表分析 * 当选择的散列函数能够得到均匀的地址分布时, 在搜索过程中可以不做多次探查。 由于很难避免冲突, 增加了搜索时间。冲突的出现, 与散列函数选取(地址分布是否均匀), 处理冲突方法(是否产生堆积)有关。 在实际应用中使用关键码进行散列时, 如在用作关键码的许多标识符具有相同的前缀或后缀,或者是相同字符的不同排列的场合,不同的散列函数往往导致散列表具有不同的搜索性能。 下图给出一些实验结果。 * 搜索关键码时所需对桶的平均访问次数 * 可以看出,开散列法优于闭散列法;在散列函数中,用除留余数法作散列函数优于其他类型的散列函数,最差的是折叠法。 对散列表技术进行的实验评估表明, 它具有很好的平均性能, 优于一些传统的技术, 如平衡树。但散列表在最坏情况下性能很不好。如果对一 个有 n 个关键码的散列表执行一次搜索或插入操作,最坏情况下需要 O(n) 的时间。 Knuth对不同的冲突处理方法进行了概率分析。 * 若设 ? 是散列表的装填因子: Sn 是搜索一个随机选择的关键码 xi (1≤i ≤n) 所需的关键码比较次数的期望值 Un 是在长度为 m 的散列表中 n 个桶已装入表项的情况下,装入第 n+1 项所需执行的关键码比较次数期望值。 前者称为在 ? = n / m 时的搜索成功的平均搜索长度,后者称为在? = n / m时的搜索不成功的平均搜索长度。 * 平均搜索长度与装填因子的关系 * 散列表的装填因子 ? 表明了表中的装满程度。越大, 说明表越满, 再插入新元素时发生冲突的可能性就越大。 散列表的搜索性能, 即平均搜索长度依赖于散列表的装填因子, 不直接依赖于 n 或 m。 不论表的长度有多大, 我们总能选择一个合适的装填因子, 以把平均搜索长度限制在一定范围内。 * 例:设有一个含200个表项的散列表,用二次探查法解决冲突,按关键码查询时找到一个新表项插入位置的平均探查次数不超过1.5,则散列表应能够至少容纳多少个表项。再设计散列函数(设搜索不成功的平均搜索长度为 Un=1 / (1-α), 其中α为装填因子) 解答:设表中表项个数 n = 200,搜索不成功的平均搜索长度 Un=1 / (1-α) ≤1.5 ? ?≤1/3 ? n / m = 200 / m = ?≤1/3 m≥600 ? m = 607(满足4k+3的质数且α 0.5 ) * 可得 Hash (Burke) = 1 Hash (Ekers) = 4 Hash (Broad) = 1 Hash (Blum) = 1 Hash (Attlee) = 0 Hash (Hecht) = 7 Hash (Alton) = 0 Hash (Ederly) = 4 设散列表 HT[26], m = 26。采用线性探查法处理冲突, 则散列结果如图所示。 0 1 2 3 4 Attlee Burke Broad Blum Ekers (1) (1) (2) (3) (1) Alton Ederly Hecht 5 6 7 8 9 (6) (3) (1) * 需要搜索或加入一个表项时,首先使用散列函数计算桶号作为初始地址: H0 = hash (key) 一旦发生冲突,在表中顺次向后寻找“下一 个”空桶 Hi 的递推公式为: Hi = (Hi-1+1) % m, i =1, 2, …, m-1 即用以下的线性探查序列在表中寻找“下一 个”空桶的桶号: H0+1, H0 +2, …, m-1, 0, 1, 2, …, H0-1 亦可写成如下的通项公式: * Hi = (H0 + i)
原创力文档


文档评论(0)