您的位置:首页 > 其它

哈希散列冲突线性探测再散列算法

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语言版本的解决方案:

#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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐