HASH表一些简单问题
来源:互联网 发布:企业saas软件 编辑:程序博客网 时间:2024/05/16 14:34
对于哈希表来说,它主要由三部分构成:哈希函数、哈希表、冲突处理
(1)哈希函数的构造方法:
1)直接定址法
取关键字或关键字的某个线性函数值为哈希地址。即:
H(key)=key或H(key)a*key+b
其中a和b为常数
例如:有一个从1岁到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身,如下表:
由于直接定址所得地址集合和关键字集合的大小相同,因此,对于不同的关键字不会发生冲突。但是,实际中使用这种方法的情况很少,因为随着关键字的增多,哈希表会变得很庞大。
2)平方去中位法:
取关键字平方后的中间几位为哈希地址。取的位数由表长决定。例子:
3)还有折叠法、数字分析法、除留余数法、随机数法等
(2)处理冲突的方法
1)开放地址法
其中i=1,2,3。。。。,k(k<=m-1),H(key)为哈希函数,m为哈希表表长,di为增量序列,可能有下列三种情况:
(1)di=1,2,3....,m-1,称线性探测在散列;
(2)称二次探测再散列;
(3)di=伪随机数序列,称伪随机探测再散列。
例如,在长度为11的哈希表中已填有关键字分别为17,60,29的记录,(哈希函数H(key)=key MOD 11),现在有第四个记录,其关键字为38,由哈希函数得到哈希地址为5,产生冲突。若用线性探测再散列的方法处理,得到下个地址是6,仍冲突,再求下个地址7,仍冲突,直到哈希地址为8的 位置为“空”时止,处理冲突的过程结束,记录填入哈希表中序号为8的位置。若用二次探测再散列,则应该填入序号为4的位置。类似的可以得到伪随机再散列的地址。
(a)插入前(b)线性探测再散列(c)二次探测再散列(d)伪随机探测再散列,伪随机数是9
2)链地址法
将所有关键字为同义词的记录存储在同一线性表中。假设某哈希函数产生的哈希地址在区间[0,m-1]上,则设立一个指针型向量 Chain Chain Hash[m];
其每个分量的初始状态都是空指针。凡是哈希地址为i的记录都插入到头指针为ChainHash[i]的链表中。在列表中的插入位置可以在表头或表尾;也可以在中间 以保持同义词在同一线性表中按关键字有序。
例如:已知一组关键字为(19,14,23,01,68,20,84,27,55,11,10,79),则按哈希函数H(key)=key MOD 13 和链地址法处理冲突构造所得的哈希表,如下图所示:
- HASH表一些简单问题
- hash表简单实现
- hash表简单运用
- 有关 Hash Collision DoS 的一些问题
- hash表的一些基本知识
- 问题 J: 简单的变位词 [hash]
- Hash表的简单应用
- Oracle 一些简单问题:
- 简单Hash
- 对Hash表的一些见解
- hash join驱动表问题
- XML的一些简单问题!
- gnuradio 一些简单的问题
- 一些简单问题的思考:
- 一些简单图论问题
- 一个简单的Hash表算法 zz
- 初步实现一个简单的Hash表
- 简单好用的hash表-----uthash
- 初探通信--ChannelFactory
- ALV 变式 删除
- 美国小伙斯诺登,披露中情局全球互联网监视计划后仓促“逃离”香港始末,真英雄也。
- 安卓开发09:常用控件-TextView文本展示
- 实例:SSh结合Easyui实现Datagrid的分页显示
- HASH表一些简单问题
- Spring源码导出到eclipse
- 习题10.18、10.19
- OGRE去掉弹出的配置窗口
- C# 编写的一个简单的 HTTP 服务器
- CPSR 程序状态寄存器
- JSP----mysql 增、删 、改
- NHibernate中Session的管理
- 堆排