如何证明二次探测不会以哈希表

时间:2015-12-04 21:10:41

标签: data-structures hashtable quadratic-probing

我的AP计算机科学课最近了解了哈希表以及线性探测如何导致聚类问题,结果证明并不是真正的时间插入/搜索。我们的讲师告诉我们,由于显而易见的原因,二次探测是减少聚类的好方法。我想知道如果剩下一个元素是否有可能,二次探测需要一段时间才能找到它。我写了一个快速程序(我可以插入源代码,如果你想,但我认为没有人会读它),测试是否发生这种情况。

首先,我证明如果没有一个永远不会登陆的数组索引,如果你总是尝试添加到任何一个索引,就会发现它。这是因为通过这样做,它最终会命中数组中的每个索引,或者不会。如果二次探测命中每个索引,那么你可以在任何点选择任何索引并且它总是会结束,因此长度数组总是有效。如果它无法击中每一个实例,你就会找到你不能做到的事情。

然后,我创建了一个我感兴趣的长度的布尔数组,如果索引0不为真,则将其设置为true,否则将index 1%length设置为true,否则设置为index 4 %length为true,如果不是......否则将index n%length设置为true,如果不是......

我没有检查1个前锋和1个后退,但正如你将会看到这首先不重要。

因此,在四个元素的数组中,二次探测将找到索引0和1,但是(在大约46000 ^ 2%长度内)从未到达索引2或3.如果我也向后退,它将具有找到索引3(((0-1)%4 + 4)%4 == 3),但仍不是索引2.

经过一番思考后,我发现我正在寻找是否有任何一对数字,x和n,其中x和n都是整数,其中下面的等式计算结果为真:

x^2 == 4*n+2

也就是说,任何整数的两倍以上都是平方数。

如果可以证明所有整数x和n都没有对将导致为真,那意味着二次探测将永远不会到达长度为4的数组中的索引2。

我认为这与抛物线的说法相同:

y=(x^2-2)/4

不包含(x,y)对,其中x和y都是整数,但我不完全确定。

我刚刚花了两个小时研究这个问题,这是我能够弄清楚的。

我知道有时候二次探测找不到斑点;这不是我感兴趣的。我将如何证明这将永远不会起作用,或者,如果我使用足够大的数字,这将最终终止。另外,如果你能把数学保存在BC微积分学习的东西之下,那就太好了。

非常感谢!

1 个答案:

答案 0 :(得分:2)

好的,经过相当多的思考,我认为我有解决方案,我想我会在这里发布,以防其他人有同样的问题。在上面给出的具体例子中(即长度为4的表中的索引2),程序确实将永远存在。为了使它停止,需要确定有一些整数x,其中x ^ 2 - 2可被4整除。我找到的解决方案来自偶数和奇数的属性。我认为这很容易理解,但并不适用于其他情况,所以我仍然会欣赏一般的答案。

x ^ 2 - 2即使且仅当x ^ 2是偶数时才是偶数,因为从数字中减去2将不会改变它是否是偶数。

注意:我们不能说没有偶数平方数,因为每个其他平方数都是偶数。

x ^ 2是一个完美的正方形,因为x是一个整数。这意味着如果要写出x的素数因子分解,它将在每个因子之上具有偶数指数。这是因为通过将相同的数字相乘来创建一个完美的正方形。

如问题中所述,我们希望证明没有4 * n + 2是完美平方的整数。现在,4 * n + 2不能是4的倍数[当然是两个多于四的倍数]。因此,我们试图证明每个完美正方形是2的倍数也是4的倍数,这意味着没有任何实例,其中两个多于4的倍数是完美的因为所有完美的正方形都被证明是2的倍数。

由于每个平方数的每个因子都具有偶数,因此它必须是偶数幂的2的倍数,而不是奇数。如果它确实是2的倍数,大于1的幂,它也是4的倍数。任何因子2的任何平方数必须有第二个因子,因为这个因子只能来自两个数字中的一个相乘以获得完美的正方形。由于这些数字必须相等,要么它们都有两个,数字是4的倍数,要么两者都没有,甚至连第一个地方都没有。

因此,在上面提到的哈希表中,二次探测永远不会终止,因为它永远不会找到那个点。还有,对不起那个蹩脚的答案,我本来更喜欢计算机科学的一个,但是Comp的理论。科学。当你要证明事情的时候,你会开始略微进入数学领域。