具有开放式寻址的哈希表,非延迟删除(无逻辑删除)

时间:2018-10-26 23:12:13

标签: algorithm hashtable

是否可以在具有冲突解决方案的开放寻址哈希表中进行非延迟删除(没有逻辑删除),而不是进行线性探测(但仍然是开放寻址)?

使用线性探测,有一种算法here。我想知道,当我们进行二次探测/双重哈希运算时,是否有非延迟删除算法?

3 个答案:

答案 0 :(得分:1)

对于具有任何值的任何非线性探测算法,没有这样的算法。它适用于线性探测,因为探测序列是可逆的。如果探针序列是可逆的,则所有元素都遵循相同的探针序列(尽管基于初始哈希,它们将沿着序列在不同位置开始)。因此,次级哈希无法阻止探针收敛,从而导致使用过的节点聚类,从而表征了线性探测。

换句话说,任何允许通过沿探针序列向后移动未删除元素进行删除的探测算法,对负载因子的敏感性与线性探测相同,而没有线性探测所提供的参考位置优势。

答案 1 :(得分:1)

通过纯删除进行删除的问题在于,空插槽可能会导致以后的搜索在找到表中实际存在的项之前终止。如果您维护一个计数器,该计数器给出在任何插入之前进行的探测的最大数量,并且仅在此探测数量之后才终止每个失败的搜索,则可以通过简单地从插槽中删除项目来删除它-但是失败的搜索当然会更昂贵。

答案 2 :(得分:0)

Wiki页面上的算法令人困惑且不完整:这是一个经过优化测试的更好版本,用于检查k是否在[i, j)范围之外,并认为j可能被包裹:

function remove(key): boolean
    i := find_slot(key)
    if not slot[i].used
        return false // key is not in the table
    j := i
    loop
        j := (j + 1) modulo num_slots
        if not slot[j].used or j = i // if table was 100% full
            breakloop
        k := hash(slot[j].key) modulo num_slots
        if (j < i) xor (k <= i) xor (k > j)
            slot[i] := slot[j]
            i := j
    endloop
    slot[i].used := false
    num_slots := num_slots - 1
    return true