簡體   English   中英

從Python的特定Trie實現中刪除單詞

[英]Deleting a word from a specific implementaion of trie in Python

我對數據結構有點陌生,並且正在實現一種嘗試,以使用編輯距離消除名稱數據庫的歧義。 我正在使用以下的trie實現:

http://stevehanov.ca/blog/index.php?id=114

這基本上是:

class TrieNode:

    def __init__(self):
       self.word = None
       self.children = {}

       global NodeCount
       NodeCount += 1

    def insert( self, word ):
       node = self
       for letter in word:
            if letter not in node.children: 
                node.children[letter] = TrieNode()

            node = node.children[letter]

       node.word = word

# read dictionary file into a trie
trie = TrieNode()
for name in names:
    WordCount += 1
    trie.insert( name )

這樣可以很好地完成工作,因為它將所有名稱插入了特里。 現在,我逐個瀏覽名稱列表,並使用Trie返回與所傳遞名稱相距特定編輯距離的所有名稱的列表。 然后,我想從列表中返回的trie中刪除所有名稱。

有沒有一種快速的方法來做到這一點?

謝謝!

有兩種方法可以執行此操作,具體取決於您是否要檢查是否要刪除通過任何內部節點的最后一條路徑(這會使刪除速度稍慢,但在刪除之后可能會使搜索速度稍快)。 兩種方法都是遞歸地進行,但是如果要迭代地展開(如insert那樣),則不容易檢查,因此我將這樣做。

def delete(self, word):
    node = self
    for letter in word[:-1]:
        if letter not in node.children:
            return False
        node = node.children[letter]
    if word[-1] in node.children:
        del node.children[letter]
        return True
    return False

你能使它更快嗎? 是的,但這可能無關緊要。

首先,您知道節點將始終存在,因此可以刪除一些錯誤檢查。 更重要的是,如果您可以使搜索功能返回節點,而不只是返回節點的值,那將使處理速度更快。 如果可以在Trie上添加反向鏈接,則意味着您可以在恆定時間內刪除節點,而無需重復搜索。 如果您不希望反向鏈接Trie,則可以通過返回拉鏈而不是節點(或更簡單地說,僅返回節點堆棧)來獲得完全相同的收益。

但實際上,最壞的情況是工作加倍,而不是增加算法復雜性或乘以很大的倍數,因此簡單可能會獲勝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM