如何将散列 table 中的线性探针转换为二次探针?
How to convert from linear probe in hash table to quadratic probe?
您好,我是 python 的新手,我有一个散列 table,它使用线性探测来解决冲突。我知道线性探针是 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
作为 counter/index 并使用它来增加下一次迭代的位置,如下所示:
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
。一个常见的选择是只使用 table 长度,但你应该知道,在二次探测中,有可能在 table 中找不到有效索引,即使它仅通过迭代 table_length 就存在有时,即使您一直在探索,它甚至可能找不到它。因此,您必须注意为单个操作设置适当的探测次数限制
或者,您可以跟踪第一个 calculated/hashed 索引并始终将 position
计算为:
current_position = original_position + i**2
您好,我是 python 的新手,我有一个散列 table,它使用线性探测来解决冲突。我知道线性探针是 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
作为 counter/index 并使用它来增加下一次迭代的位置,如下所示:
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
。一个常见的选择是只使用 table 长度,但你应该知道,在二次探测中,有可能在 table 中找不到有效索引,即使它仅通过迭代 table_length 就存在有时,即使您一直在探索,它甚至可能找不到它。因此,您必须注意为单个操作设置适当的探测次数限制
或者,您可以跟踪第一个 calculated/hashed 索引并始终将 position
计算为:
current_position = original_position + i**2