簡體   English   中英

為什么我的 trie 設置中相同字符的根不同? 以及如何打印 trie 本身?

[英]Why is the root different for the same character in my trie set-up? And how can I print the trie itself?

我正在設置一個trie ,這是我的代碼:

class Trie:
    def __init__(self):
        self.root = {}
        self.endSymbol = "*"

    def add(self, word):
        node = self.root
        for letter in word:
            if letter not in node:
                node[letter] = {}
            node = node[letter]
        node[self.endSymbol] = word

def multiStringSearch(smallStrings):
    trie = Trie()

    for word in smallStrings:
        trie.add(word)

    return trie

print(multiStringSearch(["abc", "mnopqr", "wyz", "no", "e", "tuuv","abb"]) 

兩個問題:

  1. 我怎樣才能print out the trie
  2. 出於某種原因,上面沒有產生正確的 trie,例如, "mnopqr""no"應該在'n'same root下,但它們在上述結構中分別出現。
  1. 打印出trie
class Trie:
    def __init__(self):
        self.root = {}
        self.endSymbol = "*"

    def add(self, word):
        node = self.root
        for letter in word:
            if letter not in node:
                node[letter] = {}
            node = node[letter]
        node[self.endSymbol] = word

    def __str__(self):
        return str(self.root)


def multiStringSearch(smallStrings):
    trie = Trie()

    for word in smallStrings:
        trie.add(word)

    return trie


if __name__ == "__main__":
    trie = multiStringSearch(["abc", "mnopqr", "wyz", "no", "e", "tuuv","abb"])
    print(trie)
  1. 不,它們不應該在同一個詞根下,因為它們不共享一個共同的前綴。 在您的示例中, abbabc應該在同一個根目錄下,如果您打印出 `trie.

ad 1) 以下代碼將打印帶有縮進的樹(以便於檢查樹)

class Trie:
    def __init__(self):
        self.root = {}
        self.endSymbol = "*"

    def add(self, word):
        node = self.root
        for letter in word:
            if letter not in node:
                node[letter] = {}
            node = node[letter]
        node[self.endSymbol] = word

    def __str__(self):
        return self.__format(self.root)

    def __format(self, node, indent = 0):
        s = ''

        for key in node:
            s += ' ' * indent
            s += key
            if key == self.endSymbol:
                s += ' => ' + node[key]
                s += '\n'
            else:
                s += '\n'
                s += self.__format(node[key], indent + 1)

        return s

def multiStringSearch(smallStrings):
    trie = Trie()

    for word in smallStrings:
        trie.add(word)

    return trie

print(multiStringSearch(["abc", "mnopqr", "wyz", "no", "e", "tuuv","abb"]))

Output:

a
 b
  c
   * => abc
  b
   * => abb
m
 n
  o
   p
    q
     r
      * => mnopqr
w
 y
  z
   * => wyz
n
 o
  * => no
e
 * => e
t
 u
  u
   v
    * => tuuv

暫無
暫無

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

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