我正在做一个程序来比较线性探测,二次探测和哈希表中单独链接所需的平均访问和最大访问。
我完成了3个案例的元素插入部分。在从哈希表中找到元素时,我需要限制结束搜索。 在单独链接的情况下,我可以在下一个指针为空时停止。 对于线性探测,我可以在探测整个表时停止(即表的大小)。 在二次探测中我应该使用什么作为限制?表格大小会吗?
我的二次探测功能就像这样
newKey = (key + i*i) % size;
其中i从0变化到无穷大。请帮帮我..
答案 0 :(得分:7)
对于此类问题,请分析i
分为两部分的增长情况:
第一个时间间隔:i
从0
转到size-1
在这种情况下,我现在还没有解决方案。希望能更新。
第二个时间间隔:i
从size
转到infinity
在这种情况下,i
可以表示为i = size + k
,然后
newKey = (key + i*i) % size
= (key + (size+k)*(size+k)) % size
= (key + size*size + 2*k*size + k*k) % size
= (key + k*k) % size
因此,在i
达到size
之后,我们肯定会开始探测先前探测过的细胞。因此,您只需要考虑i
从0到size-1
的情况。因为休息只是一次又一次的故事。
What the story tells up to now:
一个简单的分析告诉我,我需要最多size
次进行探测,因为超过size
次,我开始探测相同的细胞。
答案 1 :(得分:0)
见this link。如果您的表格大小为2的幂并且您使用的是rerobe函数f(i)= i *(i + 1)/ 2,则可以保证遍历整个表格。如果您的表格大小是素数,则保证至少遍历表格的一半。通常,您可以检查在某些时候您是否回到原点。如果发生这种情况,您需要重新进行更新。
答案 2 :(得分:0)
在Excel中进行一些模拟之后,似乎需要迭代到i = size / 2。这是在使用标准方法向单阴影线位置添加连续完美正方形的时候。
如果重新访问某个位置,您可以退出该答案,这将不允许测试二次探针方法可能达到的所有可能位置,至少不是针对所有数组大小。 (我测试了数组大小21,发现i = 5重新访问了与i = 2相同的位置,但是i = 6产生了以前未计算的位置。)