Python 如何将哈希表中的线性探测转换为二次探测?

Python 如何将哈希表中的线性探测转换为二次探测?,python,hashtable,quadratic-probing,Python,Hashtable,Quadratic Probing,嗨,我是python新手,我有一个哈希表,它使用线性探测来解决冲突。我知道线性探针是当N+1,N+2,N+3,但二次探针是当N+1,N+4,N+9。。。 这是我为线性探头设置的项函数 def __setitem__(self, key, value): position = self.hash_value(key) for _ in range(self.table_size): if self.array[position] is None:#found emp

嗨,我是python新手,我有一个哈希表,它使用线性探测来解决冲突。我知道线性探针是当N+1,N+2,N+3,但二次探针是当N+1,N+4,N+9。。。 这是我为线性探头设置的项函数

def __setitem__(self, key, value):
    position = self.hash_value(key)
    for _ in range(self.table_size):
        if self.array[position] is None:#found empty slot
            self.array[position] = (key, value)
            self.count += 1
            return
        elif self.array[position][0] == key:#found key
            self.array[position] = (key, value)#update value
            return
        else:#not found try next
            position = (position+1) % self.table_size
    raise ValueError("Table is Full!")
为了将其转换为二次探头,我尝试将位置更改为

position = (position+(i+1)**2) % self.table_size

但很明显,这是错误的,因为二次指数被添加到最后一个位置,而不是原始位置?任何帮助都将不胜感激

如果你注意到二次数的序列:
1,4,9,16,25,
,你会注意到连续元素之间的差异是
3,5,7,9
,即奇数。因此,您可以使用变量
i
,该变量用作计数器/索引,并使用它为下一次迭代增加位置,如下所示:

position = (position + (2 * i + 1)) % self.table_size
其中,
position
是刚刚用于当前迭代的索引

expected    |  i  |    new_position
1           |  0  |     0 + (2 * 0 + 1) = 1
4           |  1  |     1 + (2 * 1 + 1) = 4
9           |  2  |     4 + (2 * 2 + 1) = 9
16          |  3  |     9 + (2 * 3 + 1) = 16
25          |  4  |    16 + (2 * 4 + 1) = 25
但是,您需要修改递增
i
的次数。一个常见的选择是只使用表长度,但您应该知道,在二次探测中,即使表中存在有效的索引,也有可能通过将表长度迭代几次而找不到,有时甚至可能找不到,即使您一直在探测。因此,您必须小心地为单个操作设置适当的探测次数限制

或者,您可以跟踪第一个计算/散列索引,并始终计算
位置
,如下所示:

current_position = original_position + i**2