11-散列表-算法导论
2016-06-06 23:55:31 0 举报
AI智能生成
算法导论的第十一章笔记
作者其他创作
大纲/内容
什么是散列表
笼统来说,散列表类似于普通数组,是采用直接寻址的一种数据结果,不过元素
的下标是通过对关键字key进行就算而得到的(数组是直接将关键字key作为下标)
直接寻址表
几种操作
Direct-Address-Search(T,k)
return T[k]
Direct-Address-Insert(T,x)
T[x.key]=x
Direct-Address-Delete(T,x)
T[x.key]=NIL
操作时间都为O(1)
是一个数组T[0,...m-1],其中每个位置被称为 槽,对应全域U中的一个关键字
(槽k指向集合中一个关键字为k的元素——感觉一个槽就是一个指针)
(若集合中没有关键字为k的元素,则T[k]=NIL)
散列表(也叫哈希表)
直接寻址的缺点
当全域U很大,但实际存储的关键字集合相对来说很小时,会浪费很多空间
散列与直接寻址方式的区别
直接寻址
具有关键字k的元素被存放在槽k中
散列方式
具有关键字k的元素放在槽h(k)中;h为散列函数,用于计算关键字k在槽的位置
散列函数h的作用在于缩小了数组下标的范围
解决h 映射冲突的方法
链接法
将散列到同一个槽中的所有元素放在一个链表中
此时可以将每个槽都看做一个链表,只有一个元素的即为只含单一节点的链表
性能分析
简单均匀散列假设下,一次查找成功与不成功的平均时间都
是 F(1+alfa)——alfa = 需要存储的元素个数/散列表的槽数
开放寻址法
散列函数
好的散列函数特点
满足or近似满足 简单均匀散列假设
除法散列法
h(k) = k mod m; m是槽的个数
注意:m一般取不太接近2的整数幂的素数; m
应该避免取某些值,eg. m取为2.^p是很糟糕的值
乘法散列法
h(k) = [ m*( k*A - [k*A] )]—— 即:关键字k乘以常数A(0
优点
对m的选择不是很关键, m可以取 2.^p
一般而言,乘法散列函数如下取更好
A = 0.618033988....(黄金分割点)——推荐值,也可取其他0-1间的值;
然后按乘法散列函数计算即可
全域散列法
基本思想:无招胜有招——为了防止某种散列函数在某种情况下出现最坏的槽分布结果,采取随机选择散列函数的规避保证平均性能很好
0 条评论
下一页
图形选择
思维导图
主题
补充说明
AI生成
提示
关闭后当前内容将不会保存,是否继续?
取消
确定