/*
* =====================================================================================
*
* Filename: hash.c
*
* Description: hash表
* Author: cdutyangshaokun@163.com
* =====================================================================================
*/
hash table 又称散列表,是一种线性存储结构。
hash的基本思想是:设要存储的对象个数为n,设置一个长度为m(m>=n)的连续内存单元,以线性表中的每个对象的关键字ki(0=<i<n-1)为自变量,通过一个哈希函数的函数h(ki),把ki映射为内存单元的地址,并把该对象存储在这个内存单元中。h(ki)也称为哈希地址。
哈希冲突:对于两个关键字ki和kj(i!=j),有ki!=kj,但是有h(ki)=h(kj).
同常把具有不同关键字而具有相同哈希地址的对象称为“同义词”,由同义词引起的冲突称为同义词冲突。
哈希函数的构造方法:
1: 直接地址法:
直接地址法是以关键字k本生或关键字加上某个数值常量c作为哈希地址的方法。
h(k)=k+c
这种方法简单,当关键字的分布基本连续时,可用直接地址法的哈希函数,否则,若关键字分布不连续将造成内存单元的大量浪费。
2:除留余数法:
用关键字k除以某个不大于哈希表长度m的数p所得的余数作为哈希地址的方法
h(k)=k%p
p应该取不大于m的素数效果最好。
3:数字分析法:
提取关键字中取值教均匀的数字位作为哈希地址的方法。
哈希冲突解决的办法:
基本思想是当发生哈希冲突时通过哈希冲突函数产生一个新的哈希地址使hl(ki)!=
hl(kj),哈希冲突函数产生的哈希地址仍可能有哈希冲突问题,此时,在用一个新
的哈希冲突函数得到新的哈希地址,一直到不存在哈希冲突为止。
1:开放地址法:哈希空闲单元既向同义词关键字开发,也向发生冲突的非同义词开放。
a:线性探查法:
从发生冲突的地址开始,依次探查d的下一个地址,直到找到一个空闲地址为止,公式描述为:
d0=h(k);
di=(di+1)modm (1<<i<<m-1)
b:平方探查法:
d0=h(k);
2
di=(d0+i )mod m (1<<i<<m-1)
缺点:不能探查到哈希表上的所有单元,但是至少能探查
嵌入式linux c 学习笔记9---哈希链表
最新推荐文章于 2025-02-22 11:04:18 发布