提问者:小点点

如何从哈希表中的线性探针转换为二次探针?


嗨,我是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个答案

匿名用户

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

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

其中位置是刚刚用于当前迭代的索引。

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_length次,有时甚至可能找不到它,即使您永远继续探测。因此,您必须小心地为单个操作的探测次数设置适当的限制

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

current_position = original_position + i**2