Python 如何将哈希表中的线性探测转换为二次探测?
嗨,我是python新手,我有一个哈希表,它使用线性探测来解决冲突。我知道线性探针是当N+1,N+2,N+3,但二次探针是当N+1,N+4,N+9。。。 这是我为线性探头设置的项函数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
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