- 论坛徽章:
- 0
|
针对开放地址哈希表结构,采用线性探测再散列处理冲突过程中会发生的两个第一个哈希地址不同的记录争夺一个后续哈希地址的“二次聚集”的现象。
例:
用线性探测再散列法处理冲突: Hi = key MOD m; 其中m=10为哈希表长度,插入前15,16,17,18,19的H(key)分别为:5,6,7,8,9存放地址为:5,6,7,8,9
46的H(key)为6,发生冲突,连续向下探测4次,出现“二次聚集”的现象.
用二次探测再散列法处理冲突: Hi = (H(key) + di)MOD m; 其中m为哈希表长度,di=12,-12,22,-22,32,....k2(k <=m/2),插入前15,16,17,18,19的H(key)分别为:5,6,7,8,9 存放地址为:5,6,7,8,9
46的H(key)为6,发生冲突. 用二次探测再散列法解决冲突:
1 6+12)%10=(6+1)%10=7,仍然发生冲突.
2 6-12)%10=(6-1)%10=5,仍然发生冲突.
3 6+22)%10=(6+4)%10=0,不再发生冲突.
则46放置于位置0。
用二次探测再散列法处理冲突时,查找算法如下:二次探测再散列公式产生的key值如下:
[root@hpc-rm c_test]# ./a.out | sort -n |less
0
1
1
1
1
1
1
2
2
2
2
5
5
5
5
7
7
7
7
10
10
10
10
10
10
11
为什么会出现重复的key值呢?是不是我的公式不对?
如果公式正确的话,如何才能产生不重复的key值呢?
有建议说把MAXSIZE改为素数就不会出现重复的key了,但我修改后照样会出现重复的key值?为什么呢?
是我算法不对?
求大侠们指点,项目逼得紧! |
|