我的 AP 计算机科学课程最近了解了哈希表以及线性探测如何导致聚类问题,结果证明并不是真正的恒定时间插入/搜索。我们的讲师告诉我们,由于显而易见的原因,二次探测将是减少聚类的好方法。我想知道是否有可能如果只剩下一个元素,那么二次探测需要一段时间才能找到它。我写了一个快速程序(如果你愿意,我可以插入源代码,但我认为无论如何都不会有人阅读它)测试是否发生这种情况。
首先,我证明了如果没有永远不会登陆的数组索引,那么如果你总是尝试添加到任何一个索引,它就会被找到。这是因为通过这样做,它最终会命中数组中的每个索引,或者不会。如果二次探测命中每个索引,那么您可以在任何点选择任何索引并且它总是会结束,因此长度数组总是有效的。如果它不能击中每一个实例,你就会发现你不能这样做。
然后,我创建了一个我感兴趣的任何长度的布尔数组,如果索引 0 不为真,则将其设置为真,否则将索引 1%length 设置为真,否则将索引 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
也就是说,任何整数的 4 倍以上是平方数。
如果对于所有整数 x 和 n 都可以证明没有任何对会导致该结果为真,则意味着二次探测永远不会到达长度为 4 的数组中的索引 2。
我认为这与说抛物线是一回事:
y=(x^2-2)/4
不包含 (x, y) 对,其中 x 和 y 都是整数,但我不完全确定。
我刚刚花了两个小时来解决这个问题,这就是我能够弄清楚的全部。
我知道有时二次探测找不到位置。那不是我感兴趣的。我将如何证明这将永远行不通,或者如果我使用足够大的数字,这将最终终止。此外,如果您可以将数学保留在您在 BC 微积分中学习的内容中,那就太好了。
非常感谢!