哈希散列冲突线性探测再散列算法
2014-03-02 00:04
260 查看
题目:已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0....6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为()//平均查找长度就是各数查找次数之和/6。
解题步骤:
线性表(38,25,74,63,52,48)
1:进行38这个数据处理 :38%7 = 3,直接把38放在3这个位置1
[0][1][2][3][4][5][6]---->[0][1][2][38][4][5][6]
2:处理25 25%7=4,同样把25放在4就行 2
[0][1][2][38][25][5][6]
3:接下来是74 74%7=4,但是这时候4上已经放了25了。得进行线性探测。3
H(74) = 4;根据线性探测:D(i)=(H(i)+d)MOD M(M为散列表长度7)
d=1时候 D(1) = (4+1)%7=5散列表中5位置为空,所以可以把74放在位置5处。4
[0][1][2][38][25][74][6]
4:接下来是63 63%7=0直接把63放在0处 5
[63][1][2][38][25][74][6]
5:接下来是52 52%7=3但是位置3已经有38了冲突6
线性探测:D(1)=(3+1)%7=4 4上有25了 冲突7
D(2)=(3+2)%7=5 5上有74了 冲突 8
D(3) = (3+3)%7=6可以 把52放在6位置上9
[63][1][2][38][25][74][52]
6:接下来是48
48%7=6 6位置有52了冲突10
D(1)=(6+1)%7=0 0上有63了冲突11
D(2)=(6+2)%7=1 1上还木有。可以放12
最终结果:[63][48][2][38][25][74][52]
从表中可以看出2位置为空。冲突和比较一共进行了12次,有6个元素。长度为12/6=2.
概率这个就不讨论了。
C语言版本的解决方案:
解题步骤:
线性表(38,25,74,63,52,48)
1:进行38这个数据处理 :38%7 = 3,直接把38放在3这个位置1
[0][1][2][3][4][5][6]---->[0][1][2][38][4][5][6]
2:处理25 25%7=4,同样把25放在4就行 2
[0][1][2][38][25][5][6]
3:接下来是74 74%7=4,但是这时候4上已经放了25了。得进行线性探测。3
H(74) = 4;根据线性探测:D(i)=(H(i)+d)MOD M(M为散列表长度7)
d=1时候 D(1) = (4+1)%7=5散列表中5位置为空,所以可以把74放在位置5处。4
[0][1][2][38][25][74][6]
4:接下来是63 63%7=0直接把63放在0处 5
[63][1][2][38][25][74][6]
5:接下来是52 52%7=3但是位置3已经有38了冲突6
线性探测:D(1)=(3+1)%7=4 4上有25了 冲突7
D(2)=(3+2)%7=5 5上有74了 冲突 8
D(3) = (3+3)%7=6可以 把52放在6位置上9
[63][1][2][38][25][74][52]
6:接下来是48
48%7=6 6位置有52了冲突10
D(1)=(6+1)%7=0 0上有63了冲突11
D(2)=(6+2)%7=1 1上还木有。可以放12
最终结果:[63][48][2][38][25][74][52]
从表中可以看出2位置为空。冲突和比较一共进行了12次,有6个元素。长度为12/6=2.
概率这个就不讨论了。
C语言版本的解决方案:
#include <stdio.h> #include <stdlib.h> //定义哈希函数 num :需要进行散列的数据 /*author 码农小江*/ int hashFunc( int num) { int hashValue; hashValue = num%7; return hashValue; } void main() { int i, j,k, hash_value, second_hash; static int hashTable[7];//定义长度是7的散列表 int a[6] = {38,25,74,63,52,48};//线性表 for(i=0; i<6; i++) { hash_value = hashFunc(a[i]); if(!hashTable[hash_value]) { hashTable[hash_value] = a[i]; }else { for(j=1; j<6; j++) { second_hash = (hash_value + j)%7; if(!hashTable[second_hash]) { hashTable[second_hash] = a[i]; break; } } } } for(k=0;k<7;k++) { printf("%d\n", hashTable[k]); } }
相关文章推荐
- 哈希冲突的处理【闭散列方法-线性探测和二次探测】
- 哈希冲突的处理【闭散列方法-线性探测和二次探测】
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 处理哈希冲突的闭散列方法-线性探测
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)
- 散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
- 线性探测再散列解决冲突的哈希表
- 计算使用线性探测、平方探测以及双散列插入的长随机序列所需要的冲突次数
- 处理哈希冲突的线性探测法
- 散列表(三)冲突处理的方法之开地址法: 线性探测再散列的实现
- 散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
- 数据结构 c语言实现哈希(hash)表查找 除留余数法构建hash函数开放定值法线性探测处理冲突
- 处理哈希冲突的线性探测法
- 第十五周项目2 利用线性探测解决哈希冲突
- 这一篇是基于线性探测的散列表
- hash线性探测开放定址法解决冲突
- 算法6-3:解决哈希冲突之线性探针
- 哈希表中线性探测再散列法及等概率条件下平均查找长度
- 哈希表(线性探测再散列)