是否可以在具有冲突解决方案的开放寻址哈希表中进行非延迟删除(没有逻辑删除),而不是进行线性探测(但仍然是开放寻址)?
使用线性探测,有一种算法here。我想知道,当我们进行二次探测/双重哈希运算时,是否有非延迟删除算法?
答案 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