【问题标题】:Hash Delete Algorithm哈希删除算法
【发布时间】:2021-01-15 06:52:09
【问题描述】:

我正在阅读《算法简介》第 3 版这本书,在涉及哈希插入和搜索的部分中,提到了哈希删除算法,但没有实际的代码。它指出您不能从插槽 i 中删除密钥,因为这样可能无法检索密钥。因此,将 Key Deleted 的特殊值应用于插槽。然后,哈希插入算法会将插槽视为空,并将密钥插入其中。所以,我自己为哈希删除重写了哈希插入算法,我想知道我的哈希删除算法是否可以标记删除。 T定义为哈希表,k定义为key。 哈希插入(T,k)(这是从书中)
我 = 0
重复
j = h(k, i)
如果 T[j] == nil
T[j] = k
返回 j
否则我 = 我 + 1
直到 i == m
错误“哈希表溢出”

现在这是我的哈希删除算法
哈希删除 (T, k)
我 = 0
重复
如果 T[j] == NIL
i = i++
如果我 == 米
错误“哈希表溢出”
返回 j
否则如果 T[j] == k
k = "已删除"

此伪代码是否适用于哈希删除?我应该将 else if 语句进一步向上移动,还是它在哪里可以?如果在数组中找不到值,我应该保留哈希表溢出吗?我的想法是,如果在数组中找不到特定的键,我应该这样做。

【问题讨论】:

    标签: algorithm hash pseudocode


    【解决方案1】:

    您应该更新您的问题,指出这是关于开放寻址散列方案。在链式哈希中不会出现此问题。

    您不需要修改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-SEARCHHASH-INSERT 只会将其视为一些随机的非目标值并通过。

    【讨论】:

    • 这是有道理的。谢谢!
    猜你喜欢
    • 2016-06-23
    • 2013-05-11
    • 2018-11-17
    • 1970-01-01
    • 2012-06-03
    • 2021-05-03
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多