Data structures 如何证明二次探测不会以哈希表结束

Data structures 如何证明二次探测不会以哈希表结束,data-structures,hashtable,quadratic-probing,Data Structures,Hashtable,Quadratic Probing,我的AP计算机科学课程最近学习了哈希表,以及线性探测如何导致集群问题,并最终证明不是恒定时间插入/搜索。我们的指导老师告诉我们,二次探测是减少集群的一个好方法,原因显而易见。我想知道,如果只剩下一个元素,是否可能需要一段时间才能找到它。我写了一个快速的程序(如果你想的话,我可以插入源代码,但我不认为任何人会读它),测试看看是否发生了这种情况 首先,我证明了,如果没有一个数组索引永远不会登陆,那么如果您总是尝试添加到任何一个索引中,就会找到它。这是因为这样做,它要么最终会命中数组中的每个索引,要么

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

首先,我证明了,如果没有一个数组索引永远不会登陆,那么如果您总是尝试添加到任何一个索引中,就会找到它。这是因为这样做,它要么最终会命中数组中的每个索引,要么不会。若二次探测命中每个索引,那个么你们可以在任意点选取任何索引,它总是会结束,所以长度数组总是有效的。如果它不能命中每一个实例,你就会发现你做不到的事情

然后,我制作了一个我感兴趣的任意长度的布尔数组,如果索引0不是真的,将其设置为真,否则将索引1%长度设置为真,否则将索引4%长度设置为真,如果它不是真的。。。否则,如果索引n%length不是

我没有检查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都是整数,但我不能完全确定

我刚刚花了两个小时研究这个问题,这就是我所能想到的

我知道有时二次探测找不到一个点;那不是我感兴趣的。我该如何去证明这是行不通的,或者,如果我使用足够大的数字,这最终会终止。另外,如果你能把数学放在你在卑诗省微积分学的东西下面,那就太好了


非常感谢

好吧,经过一番思考,我想我找到了解决方案,我想我会把它贴在这里,以防其他人有同样的问题。在上面给出的具体示例中(即长度为4的表中的索引2),该程序将永远运行。为了让它停止,需要有一个整数x,x^2-2可以被4整除。我找到的解决方案来自偶数和奇数的性质。我认为这很容易理解,但并不真正适用于其他情况,因此我仍然希望得到一个一般性的答案

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

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

x^2是一个完美的平方,因为x是一个整数。这意味着,如果我们写出x的素因式分解,它的每个因子都会有一个偶数指数。这是因为一个完美的正方形是由相同的数字乘以它本身而产生的

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

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


因此,在上面提到的哈希表中,二次探测永远不会终止,因为它永远不会找到那个点。另外,对于数学上的答案我很抱歉,我更喜欢计算机科学的,但是Comp的理论。Sci。当你开始证明事情时,开始稍微偏离数学区域。

对于StackOverflow来说,“如何证明”不是一个好问题。有一些探测序列与表格大小相结合,允许每个插槽只访问一次,请参见@leventov,我很抱歉,这不是另一个无意识的问题,“我如何使用语言B完成任务a”由谷歌和一些读者自动回答的问题类型。你建议我在哪里问一个需要思考的问题?