我正在阅读linear probing中的hash table tutorial,并且发现了这一点:
使用线性探测,步长几乎总是1,但只要步长相对于表大小的主要值,使用其他步长是可以接受的,以便最终访问每个索引。如果不满足此限制,则可能无法访问所有索引......
(基本问题是:您需要访问从任意索引开始的数组中的每个索引,并向前跳过固定数量的索引[skip]到下一个索引,必要时包装到数组的开头模。)
我理解为什么如果步长不是表格大小的相对素数,所以不能访问所有索引,但我不明白为什么反过来是正确的:如果步长是的话,将访问所有索引数组大小相对较高。
我已经观察到这个相对优质的房产在我手工制作的几个例子中起作用,但我不明白为什么它在每种情况下都有效。
简而言之,我的问题是:为什么数组的每个索引都访问了一个相对于数组大小的主要步骤?有证据吗?
谢谢!
答案 0 :(得分:2)
维基百科关于Cyclic Groups
环Z / nZ的单位是n的互质数。
Also:
[如果两个数字是共同素数]存在整数x和y,使得ax + by = 1
所以,如果“a”是你的步长,“b”是数组的长度,你可以通过
到达任何索引“z”axz + byz = z
=>
axz = z(mod b)
即踩“xz”次(并将数据包裹在“yz”次)。
答案 1 :(得分:0)
步数为lcm(A,P)/P
或A/gcd(A,P)
,其中A
为数组大小,P
为此魔法互助。
因此,如果gcd(A,P) != 1
,则步数将小于A
相反,如果gcd(A,P) == 1
(互质),那么步数将为A并且将访问所有索引