看圖輕鬆理解資料結構與演算法系列(Trie樹)

超人汪小建發表於2019-03-03

前言

推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。

Trie樹

Trie樹,是一種搜尋樹,也稱字典樹或單詞查詢樹,此外也稱字首樹,因為某節點的後代存在共同的字首。它的key都為字串,能做到高效查詢和插入,時間複雜度為O(k),k為字串長度,缺點是如果大量字串沒有共同字首時很耗記憶體。它的核心思想就是減少沒必要的字元比較,使查詢高效率,即用空間換時間,再利用共同字首來提高查詢效率。

Trie樹特點

  • 根節點不包含字元,其他節點每個節點只包含一個字元。
  • 從根節點到某一節點經過路徑的字元連起來即為該節點對應的字串。
  • 每個節點的所有子節點字元都不相同。

image

插入操作

對he、him、his、she、her、hers六個字串進行插入,開始插入he字串,插入第一個字元是h,此時樹為空,所以先建立空的根節點,

image

接著從根節點開始,不存在h子節點,於是建立子節點h,

image

在h節點的基礎上繼續插入第二個字元e,

image

h節點不存在e子節點,建立子節點e,並將該節點標記為單詞標誌,完成he字串插入。

image

接著插入him字串,從根節點開始,發現h子節點已有,

image

移到h子節點,

image

繼續處理第二個字元i,h節點不存在i子節點,於是建立i子節點,

image

處理第三個字元m,i節點不存在子節點m,於是建立m子節點,並將該節點標記為單詞標誌,完成him插入。

image

接著插入his字串,從根節點開始,發現h子節點已有,

image

移到h子節點,

image

繼續處理第二個字元i,h節點已存在i子節點,於是移到i節點,

image

處理第三個字元s,i節點不存在子節點s,於是建立s子節點,並將該節點標記為單詞標誌,完成his插入。

image

繼續插入she字串,從根節點開始,首先處理第一個字元s,發現s子節點不存在,於是建立s節點,

image

接著處理第二個字元h,s節點不存在h子節點,建立h節點,

image

繼續處理第三個字元e,h節點不存在e子節點,建立e節點,並將該節點標記為單詞標誌,至此完成she字串插入。

image

類似地,將her、hers字串插入到樹中,最終為:

image

查詢操作

查詢hi字串,從根節點開始,

image

根節點存在h子節點,移動到h節點,

image

繼續找i子節點,存在,但i並沒有單詞標誌,所以hi字串不存在。

image

查詢his字串,從根節點開始,

image

根節點存在h子節點,移動到h節點,

image

h節點存在i子節點,移動到i節點,

image

繼續找s子節點,存在,而且s節點為單詞標誌,找到his字串。

image

而如果查詢hist字串,則最後的t找不到,所以不存在該字串。

刪除操作

情況一

刪除she字串,從根節點開始查詢第一個字元s,

image

找到s子節點,下移到s節點,繼續查詢字元h,

image

找到h子節點,下移到h節點,繼續查詢字元e,

image

找到e節點,已經找到she字串,將e節點的單詞標誌去掉,

image

此時發現e節點為葉子節點,將其刪除,

image

刪除後發現h節點為葉子節點,且其不是單詞標誌,將其刪除,

image

刪除後發現s節點為葉子節點,且其不是單詞標誌,將其刪除,完成she字串刪除操作。

image

情況二

刪除her字串,從根節點開始查詢第一個字元h,

image

找到h子節點,下移到h節點,繼續查詢字元e,

image

找到e子節點,下移到e節點,繼續查詢字元r,

image

找到r子節點,此時完成整個字串查詢,因為不是葉子節點,只需將其單詞標誌去掉即可。

image

情況三

刪除his,從根節點開始查詢第一個字元h,

image

找到h子節點,下移到h節點,繼續查詢字元i,

image

找到i子節點,下移到i節點,繼續查詢字元s,

image

找到s子節點,此時完成整個字串查詢,

image

刪除後發現s節點為葉子節點,將其刪除,

image

刪除後發現i節點為非葉子節點,停止刪除,完成his字串刪除操作。

-------------推薦閱讀------------

我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)

為什麼寫《Tomcat核心設計剖析》

我的2017文章彙總——機器學習篇

我的2017文章彙總——Java及中介軟體

我的2017文章彙總——深度學習篇

我的2017文章彙總——JDK原始碼篇

我的2017文章彙總——自然語言處理篇

我的2017文章彙總——Java併發篇


跟我交流,向我提問:

看圖輕鬆理解資料結構與演算法系列(Trie樹)

歡迎關注:

看圖輕鬆理解資料結構與演算法系列(Trie樹)

相關文章