如何解决哈希删除算法
我正在阅读《算法介绍》第三版,在涉及“哈希插入和搜索”的部分中提到了“哈希删除”算法,但没有实际的代码。它指出您无法从插槽i中删除密钥,因为那样可能会导致无法检索密钥。因此,而是将Key Deleted的特殊值应用于该插槽。然后,用于哈希插入的算法会将插槽视为空插槽,然后在其中插入密钥。因此,我自己重写了用于哈希删除的哈希插入算法,并且想知道我的哈希删除算法是否可以标记删除。
T被定义为哈希表,k被定义为键。
哈希插入(T,k)(来自本书)
i = 0
重复
j = h(k,i)
如果T [j] == nil
T [j] = k
返回j
否则我= i + 1
直到我== m
错误“哈希表溢出”
现在这是我的哈希删除算法
哈希删除(T,k)
我= 0
重复
如果T [j] == NIL
我=我++
如果我== m
错误“哈希表溢出”
返回j
否则,如果T [j] == k
k =“已删除”
此伪代码是否可用于哈希删除?我应该将else if语句进一步向上移动,还是在哪里合适?如果在数组中找不到该值,是否应该保持哈希表溢出?我的思考过程是,如果在数组中找不到特定的密钥,我应该这样做。
解决方法
您应该更新您的问题,以指出这与开放式地址哈希方案有关。链式散列不会发生此问题。
您不需要修改HASH-SEARCH
算法。它将像其他值一样越过DELETED
。这是基于新约定的经过改进的HASH-DELETE
算法:
r <- HASH-SEARCH(key)
if r == NIL
return NIL
else
T[r] = DELETED
return T[r]
基于上述内容,您可以按以下方式修改HASH-INSERT
:
i <- 0
repeat j <- h(k,i)
if T[j] == NIL or T[j] == DELETED
then T[j] <- k
return j
else i <- i + 1
until i == m
error "hash table overflow"
HASH-INSERT
会将DELETED
视为空并使用它,但是HASH-SEARCH
和HASH-INSERT
会将其视为一些随机的非目标值并通过。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。