求教hash值和数组下标对应的问题
上班闲逛,在网上看到关于hash算法的东西,如下:
对于32位整数值,hash算法为:index = value * 2654435769 >> 28;
有如下value值和数组位置对应关系:
本地传图片半天都没传上去,我就手写吧,大家将就着看:
数组位置 value值(链表)
0
1 26
2 31 353 387
3 91
4 28 337
5
6 12
7
8 140 496
9 1 111
10
11
12
13
14
15
[解决办法]
假设这个数组,可以放下97个元素,
那么我们只放 30个
int a[97];
int hash(int val){...return ...;};
a[hash(n)]= n;
这样,数值和表就建立了联系;
哈希算法可以确保哈希值在数组容量之内。
如果是空表,直接赋值就行。
否则要检查,是否有冲突,有冲突要处理哈希值的冲突。
[解决办法]
#include <stdio.h>
int d[12]={26,31,353,387,91,28,337,12,140,496,1,111};
int i;
int main() {
for (i=0;i<12;i++) {
printf("%3d %I64d\n",d[i],(((unsigned __int64)d[i] * 2654435769ui64) & 0xFFFFFFFFui64) >> 28);
}
return 0;
}
// 26 1
// 31 2
//353 2
//387 2
// 91 3
// 28 4
//337 4
// 12 6
//140 8
//496 8
// 1 9
//111 9
//