算法导论程序26--开放寻址法(Python)
来源:互联网 发布:淘宝耳机店推荐 编辑:程序博客网 时间:2024/06/05 02:52
在开放寻址法(open addressing)中,所有元素都存放在散列表中。也就是说,每个表项或包含动态集合的一个元素,或包含NIL。当查找某个元素时,要系统地检查所有的表项,直到找到所需的元素,或最终查明该元素不在表中。开放寻址法中,散列表可能会被填满,以至于不能插入任何新的元素,该方法导致的一个结果是装载因子a绝对不会超过1。
为了使用开放寻址法插入一个元素,需要连续地检查散列表,或称为探查(probe),直到找到一个空槽来放置待插入的关键字为止。
检查的顺序不一定是0,1,...,m-1(这种顺序下的查找时间为O(n)),而是依赖于待插入的关键字。对每一个关键字k,使用开放寻址法的探查序列(probe squence)
<h(k,0),h(k,1),...,h(k,m-1)>。
有三种技术常用来计算开放寻址法中的探查序列:线性探查、二次探查和双重探查。
这三种技术中,双重散列产生的探查序列数最多,似乎能给出最好的结果。
双重散列:
采用的散列函数:h(k,i)=(h1(k)+i*h2(k))mod m
其中h1和h2均为辅助散列函数。
初始探查位置T[h1(k)],后续的探查位置是前一个位置加上偏移量h2(k),然后再模m。
比如h1(k)=k mod m,h2(k)=1+(k mod m')其中m'略小于m(比如,m-1)
class open_address_hash: def __init__(self,T=[],size=0): if len(T)==0: self.T=[None for i in range(size)] else: self.T=T self.size=size def hash_insert(self,k): i=0 while i<self.size: j=self.hash_h1_h2(k,i) if self.T[j] == None: self.T[j]=k return j else: i+=1 return "hash table overflow" def hash_search(self,k): i=0 j=self.hash_h1_h2(k,i) while self.T[j]!=None and i<self.size: j=self.hash_h1_h2(k,i) if self.T[j]==k: return j else: i+=1 return None def hash_h1_h2(self,k,i): return ((k%self.size+i*(1+k%(self.size-2))))%self.size运行:
>>> T=[]>>> oah=open_address_hash(T,13)>>> oah.hash_insert(79)1>>> oah.hash_insert(69)4>>> oah.hash_insert(98)7>>> oah.hash_insert(14)5>>> oah.hash_search(50)>>> oah.hash_search(14)5>>>其中,散列表的大小为13。
阅读全文
0 0
- 算法导论程序26--开放寻址法(Python)
- 算法导论 开放寻址法
- 算法导论:开放寻址
- 算法导论程序24--直接寻址表(Python)
- 《算法导论》笔记 第11章 11.4 开放寻址法
- 算法导论11.4开放寻址法 练习总结
- 算法-----开放寻址法
- 开放寻址法PYTHON实现
- 算法导论第十一章11.4例题——开放寻址法代码实现
- 《算法导论》第11章 散列表 (3)开放寻址
- 算法导论程序8--堆(Python)
- 算法导论程序16--基数排序(Python)
- 算法导论程序21--链表(Python)
- 基于visual Studio2013解决算法导论之028散列表开放寻址
- 开放寻址法记录
- 开放寻址法
- 算法导论 直接寻址表
- 算法导论程序6--随机算法(Python)
- 好看的Dialog加载动画
- 优化SQL步骤
- windows程序设计——输出文字
- 2017中国3D打印技术产业大会圆满落幕
- 电路设计_物联网芯片资讯——GPRS
- 算法导论程序26--开放寻址法(Python)
- 百度地图基本使用及画线路轨迹播放问题
- 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
- 编程第十七天
- LeetCode -- 122. Best Time to Buy and Sell Stock II
- 史上最全的常用开发工具类收集(持续更新中)
- 【SLAM】(一)Google Cartographer的初步尝试
- mysql存储过程进行事提交
- Jenkins自动发布Git,Maven项目