前言
推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。
Trie樹
Trie樹,是一種搜尋樹,也稱字典樹或單詞查詢樹,此外也稱字首樹,因為某節點的後代存在共同的字首。它的key都為字串,能做到高效查詢和插入,時間複雜度為O(k),k為字串長度,缺點是如果大量字串沒有共同字首時很耗記憶體。它的核心思想就是減少沒必要的字元比較,使查詢高效率,即用空間換時間,再利用共同字首來提高查詢效率。
Trie樹特點
- 根節點不包含字元,其他節點每個節點只包含一個字元。
- 從根節點到某一節點經過路徑的字元連起來即為該節點對應的字串。
- 每個節點的所有子節點字元都不相同。
插入操作
對he、him、his、she、her、hers六個字串進行插入,開始插入he字串,插入第一個字元是h,此時樹為空,所以先建立空的根節點,
接著從根節點開始,不存在h子節點,於是建立子節點h,
在h節點的基礎上繼續插入第二個字元e,
h節點不存在e子節點,建立子節點e,並將該節點標記為單詞標誌,完成he字串插入。
接著插入him字串,從根節點開始,發現h子節點已有,
移到h子節點,
繼續處理第二個字元i,h節點不存在i子節點,於是建立i子節點,
處理第三個字元m,i節點不存在子節點m,於是建立m子節點,並將該節點標記為單詞標誌,完成him插入。
接著插入his字串,從根節點開始,發現h子節點已有,
移到h子節點,
繼續處理第二個字元i,h節點已存在i子節點,於是移到i節點,
處理第三個字元s,i節點不存在子節點s,於是建立s子節點,並將該節點標記為單詞標誌,完成his插入。
繼續插入she字串,從根節點開始,首先處理第一個字元s,發現s子節點不存在,於是建立s節點,
接著處理第二個字元h,s節點不存在h子節點,建立h節點,
繼續處理第三個字元e,h節點不存在e子節點,建立e節點,並將該節點標記為單詞標誌,至此完成she字串插入。
類似地,將her、hers字串插入到樹中,最終為:
查詢操作
查詢hi字串,從根節點開始,
根節點存在h子節點,移動到h節點,
繼續找i子節點,存在,但i並沒有單詞標誌,所以hi字串不存在。
查詢his字串,從根節點開始,
根節點存在h子節點,移動到h節點,
h節點存在i子節點,移動到i節點,
繼續找s子節點,存在,而且s節點為單詞標誌,找到his字串。
而如果查詢hist字串,則最後的t找不到,所以不存在該字串。
刪除操作
情況一
刪除she字串,從根節點開始查詢第一個字元s,
找到s子節點,下移到s節點,繼續查詢字元h,
找到h子節點,下移到h節點,繼續查詢字元e,
找到e節點,已經找到she字串,將e節點的單詞標誌去掉,
此時發現e節點為葉子節點,將其刪除,
刪除後發現h節點為葉子節點,且其不是單詞標誌,將其刪除,
刪除後發現s節點為葉子節點,且其不是單詞標誌,將其刪除,完成she字串刪除操作。
情況二
刪除her字串,從根節點開始查詢第一個字元h,
找到h子節點,下移到h節點,繼續查詢字元e,
找到e子節點,下移到e節點,繼續查詢字元r,
找到r子節點,此時完成整個字串查詢,因為不是葉子節點,只需將其單詞標誌去掉即可。
情況三
刪除his,從根節點開始查詢第一個字元h,
找到h子節點,下移到h節點,繼續查詢字元i,
找到i子節點,下移到i節點,繼續查詢字元s,
找到s子節點,此時完成整個字串查詢,
刪除後發現s節點為葉子節點,將其刪除,
刪除後發現i節點為非葉子節點,停止刪除,完成his字串刪除操作。
-------------推薦閱讀------------
我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)
跟我交流,向我提問:
歡迎關注: