【问题标题】:How to convert from linear probe in hash table to quadratic probe?如何将哈希表中的线性探针转换为二次探针?
【发布时间】:2018-10-30 07:07:04
【问题描述】:

您好,我是 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

但显然这是错误的,因为二次索引被添加到最后一个位置而不是原始位置?任何帮助将不胜感激!

【问题讨论】:

    标签: python hashtable quadratic-probing


    【解决方案1】:

    如果您注意到二次数序列: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 的次数。一个常见的选择是只使用表长度,但您应该知道,在二次探测中,即使仅通过迭代 table_length 次,也可能无法在表中找到有效索引,有时甚至可能找不到它,即使您永远探索下去。因此,您必须小心为单个操作的探测次数设置适当的限制

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

    current_position = original_position + i**2
    

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 2013-03-25
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-07-17
      • 2013-06-27
      • 1970-01-01
      相关资源
      最近更新 更多