1. 程式人生 > >Trie(字典樹)

Trie(字典樹)

none not in insert 節點 pre word fix 根節點 keys

字典樹的作用:它是利用單詞的公共前綴來節約儲存空間,因為單詞的前綴相同就會公用前綴的節點。比如搜索提示就可以根據輸入的前綴來提示可以構成的單詞。

前綴樹特點:

  ①:單詞前綴相同共用節點。

  ②:每個節點只存一個字母

  ③:根節點不包含字母

  ④:組成的單詞是根據所走過的路徑所決定的

  ⑤:因為我是用Python字典實現的所以數的子節點存在它的key中,沒一個單詞結束要有一個判斷決定它是一個單詞的結尾不然比如 輸入apple如果search(‘app‘)就不能判斷插入了這個單詞了。

  ⑥:兒子節點數量不定

代碼:

class Trie:

  def __init__(self, root):

    self.root = {}

  def insert(self, sequence):

    #從頭結點開始插入

    node = self.root

    for item in sequence:

      if item not in node.keys():

        node.[item] = {}

      node = node[item]

    #此時到了單詞的結尾,插入一個判斷詞

    node[‘end‘] = True

  def search(self, word):

    curnode = self.root

    for w in word:
      if w not in node.keys():
        return False
      else:
        node = node[w]
    mark = node.get(‘end‘)
    return mark is not None

  def startsWith(self, prefix):
    curnode = self.root
    for w in prefix:

      if w not in curnode.keys():
        return False
      curnode = curnode[w]
    return True

if __name__ == "__main__":

  t = Trie()
  t.insert(‘apple‘)
  assert not t.search(‘app‘)
  assert t.search(‘apple‘)
  t.insert(‘app‘)
  assert t.search(‘app‘)
  assert t.startsWith(‘app‘)

leetcode: https://leetcode-cn.com/problems/implement-trie-prefix-tree/submissions/

我的github代碼:https://github.com/pythonkd/python/blob/master/LeetCode/trie.py

                

Trie(字典樹)