使用线性探测,步长几乎总是1,但只要步长相对于表大小的主要值,使用其他步长是可以接受的,以便最终访问每个索引。如果不满足此限制,则可能无法访问所有索引... (基本问题是:您需要访问从任意索引开始的数组中的每个索引,并向前跳过固定数量的索引[skip]到下一个索引,必要时使用modulo包装到数组的开头。)
我不明白为什么如果步长不是表格大小的相对素数,那么不能访问所有索引,我不明白为什么反过来是真的:如果所有索引都将被访问步长是数组大小的相对素数。
我已经观察到这个相对优质的房产在我手工制作的几个例子中起作用,但我不明白为什么它在每种情况下都有效。
简而言之,我的问题是:为什么数组的每个索引都访问了一个相对于数组大小的主要步骤?有证据吗?
答案 0 :(得分:1)
假设您有10个元素并使用从0开始的2步。您将访问0,2,4,6,8然后回绕并重新开始。你会错过所有奇数。
答案 1 :(得分:0)
首先,如果步长s对表格大小t不是相对主要的,那么有一些公共因子d大于1.你只需要通过采取大小为s的步骤然后减少数量来命中d的倍数的索引。 index mod t。
其次,如果s和t是相对素数,则有一对整数a和b,因此+ bt = 1.这可以使用Euclid's algorithm证明,或者通过显示最大公约数来证明s和t的最小正数是+ bt。值a(可以从Euclid算法构造,如链接页面上所描述的)是s mod t的乘法逆。这意味着在一个步骤之后,您处于位置1.对于任何其他位置p,如果不是更快,您将在* p步之后到达位置p。
例如,7是相对素数为100. 7 * 43 + 100 *( - 24)= 1.因此,7 mod 100的乘法逆是43.假设我们想知道你到达第20位的时间通过采取大小为7的步骤。其中一个时间是在20 * 43 = 860步之后。你也可以在60,160,260等步骤之后到达位置20,你可以验证,因为7 * 60 = 420,而420 mod 100是20。