哈希(Hash)
- 根据键(Key)而直接访问在内存存储位置的数据结构
- 哈希函数(散列函数):在记录的存储位置和它的关键词之间建立的一个确定的对应关系f,使每个关键字和结构中的一个惟一的存储位置相对应。
- 哈希表(散列表-Hash table):在查找时,只要根据对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此,不需要进行比较就可直接取得所查记录。按这个思想建立的表为哈希表
- 定义:根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表称为哈希表,这映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。
- 冲突(collision):不同的关键字得到相同的哈希地址
- 同义词(synonym):具有相同函数值的关键字
- 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
哈希函数的构造方法
直接定址法
取关键字或关键字的某个线性函数值为哈希函数。
数字分析法
假设关键字是以r为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。
平方取中法
取关键字平方后的中间几位为哈希地址。
折叠法
将关键字分割成数位相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。
除留余数法
取关键字被某个不大于哈希表表长m的数p出后所得余数为哈希地址。
随机数法
选择一个随机函数,取关键字的随机函数值为它的哈希地址。当关键字长度不等时采用此法构造哈希函数较恰当。
处理冲突的方法
开放定址法
Hi = (H(key) + di) MOD m i = 1,2,…,k(k<=m-1)
- di = 1,2,3,…,m-1,称为线性探测再散列;
- di = 12,-12,22,-22,…,k2,-k2,(k<=m/2)称为二次探测再散列;
- di = 伪随机数序列,称伪随机探测再散列。
再哈希法(再散列)
在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。
链地址法(单独链表法)
将所有关键字为同义词的记录存储在同一线性链表中。
建立一个公共溢出区
一旦发生冲突,都填入溢出表。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!