数据结构--查找--散列表--C语言

散列表(空间换时间)

散列函数的构建

①直接定址法
优点:以关键码key的某个线性函数值为散列地址,不会产生冲突。
缺点:要占用连续地址空间,空间效率低。
例:Hash(key)=a*key+b(a、b是常数)

②除留余数法(优)
Hash(key)=key % p(p是一个整数)
关键:如何选取p?
技巧:设表长为m,取p<=m且为质数

处理冲突的方法

①开放地址法(开地址法)
思想:有冲突时就去找下一个为空的位置
例:除留余数法 Hi=(Hash(key)+di)% m ,( di为增量序列)
常用方法:
a:线性探测法

di为1,2,3,4,,,,m-1

b:二次探测法

di为1^2
-1^2,
2^2,
-2^2
,,,,
q^2

c:伪随机探测法

di为伪随机数序列

②链地址法(拉链法)(优)
思想:相同散列地址的记录链成一个单链表,然后一个数组将m个单链表的表头指针。
优点:非同义词(散列函数的值相同)不会冲突。
链表上的结点空间为动态申请,适合于结点数量不确定的

散列表的查找

过程:给定 k 值–>计算Hash(k)–>判断地址是否非空–>比对关键字(空就查找失败)–>按处理冲突的方法计算Hi

猜你喜欢

转载自blog.csdn.net/qq_45914759/article/details/105709088