也叫「字典樹」,根據它名稱,它本身就是乙個樹形結構。它是一種專門處理字串匹配的資料結構,用來解決在一組字串集合中快速查詢字串的問題。那trie樹究竟有何特殊之處呢,它是通過字串之間的公共字首,將重複的字首合併在一樣,並組織成一棵樹。
舉個例子:
我們現在維護有乙個字串庫,裡面存放了這樣有6個字串,他們分別是:how,hi,her,hello,so,see。接著我們將這些字串構造出乙個trie樹,如下:(**–極客時間專欄《資料結構與演算法之美》)
其中根節點不包含任何資訊,每個節點表示乙個字串中的字元,從根節點到紅色節點的一條路徑表示乙個字串。這樣我們就組織好了一棵trie樹,之後每次字串的查詢,都是在這棵trie樹上進行。
從前面的圖我們知道trie樹是一棵多叉樹,在二叉樹中,乙個節點的左右兩個節點是通過指標來儲存的,對於多叉樹,我們可以借助雜湊表的思想,我們通過乙個下標與字元一一對映的陣列,來儲存子節點的指標。如下:(**–極客時間專欄《資料結構與演算法之美》)
假設我們的字串中只有從a到z這26個小寫字母,我們在陣列中下標為0的位置,儲存指向子節點a的指標,下標為1的位置儲存指向子節點b的指標,以此類推,下標為25的位置,儲存的是指向的子節點z的指標。如果某個字元的子節點不存在,我們就在對應的下標的位置儲存null。
乙個節點的表示如下:
class trienode
如果要在一組字串中,頻繁地查詢某些字串,用trie樹會非常高效。
每次查詢時,如果要查詢的字串長度是k,那我們只需要比對大約k個節點,就能完成查詢操作。跟原本那組字串的長度和個數沒有任何關係。所以說,構建好trie樹後,在其中查詢字串的時間複雜度是o(k),k表示要查詢的字串的長度。
缺點:字串中包含的字符集不能太大,否則會非常浪費空間。要求字串的字首重合比較多,不然空間消耗會變大很。trie樹中用到了指標,所以,對快取並不友好,效能上會打個折扣。而且自己實現乙個trie樹非常複雜,易出錯。像這樣,針對在一組字串中查詢字串的問題,我們在工程中,更傾向於用雜湊表或者紅黑樹。因為這兩種資料結構,我們都不需要自己去實現,直接利用程式語言中提供的現成類庫就行了。但是trie 樹也有自身的優點,雖然它不適合精確匹配查詢,這種問題更適合用雜湊表或者紅黑樹來解決,但是trie樹比較適合查詢字首匹配的字串,也就是前面我們講的在搜尋引擎中常見的關鍵字提醒。trie 樹還可以擴充套件到更加廣泛的乙個應用上,就是自動輸入補全,比如輸入法自動補全功能、ide+**編輯器自動補全功能、瀏覽器**輸入的自動補全功能等等。
資料結構與演算法系列 字典樹
一 背景 什麼是字典樹?trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的...
資料結構與演算法系列19 堆
堆其實就是一種特殊的樹,那它特殊在 呢?只要滿足了以下兩點的,我們就可以稱之為堆。1.堆是乙個完全二叉樹 2.堆中每乙個節點的值都必須大於等於 或者小於等於 其子樹中每個節點的值。這裡稍作解釋,對於第一點,我們前面講過,完全二叉樹就是除了最後一層,其他層的節點個數都是滿的,最後一層的節點都靠左排列。...
資料結構與演算法系列 Sunday演算法詳解
一 背景 sunday演算法是daniel m.sunday於1990年提出的字串模式匹配。其效率在匹配隨機的字串時比其他匹配演算法還要更快。sunday演算法的實現可比kmp,bm的實現容易太多。二 分析假設我們有如下字串 a lessons tearned in software te b so...