看圖輕鬆理解數據結構與算法系列(Trie樹)

前言

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

Trie樹

Trie樹,是一種搜索樹,也稱字典樹或單詞查找樹,此外也稱前綴樹,由於某節點的後代存在共同的前綴。它的key都爲字符串,能作到高效查詢和插入,時間複雜度爲O(k),k爲字符串長度,缺點是若是大量字符串沒有共同前綴時很耗內存。它的核心思想就是減小不必的字符比較,使查詢高效率,即用空間換時間,再利用共同前綴來提升查詢效率。算法

Trie樹特色

  • 根節點不包含字符,其餘節點每一個節點只包含一個字符。
  • 從根節點到某一節點通過路徑的字符連起來即爲該節點對應的字符串。
  • 每一個節點的全部子節點字符都不相同。

image

插入操做

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

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插入。.net

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併發篇


跟我交流,向我提問:

歡迎關注:

相關文章
相關標籤/搜索