Trie樹 高階樹型結構

2021-10-03 18:49:17 字數 1889 閱讀 9539

trie樹應用

trie 樹中文名叫字典樹、字首樹等等。這些名字暗示其與字元的處理有關,事實也確實如此,它主要用途就是將字串(當然也可以不限於字串)整合成樹形。

它的核心思想就是通過最大限度地減少無謂的字串比較,使得查詢高效率,即「用空間換時間」,再利用共同字首來提高查詢效率。

典型應用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。

假設有5個字串,它們分別是:code,cod,cook,five,file,fat。按照trie樹的組織結構如下圖:

//該節點處的字元

int count;

// 統計單詞字首出現的次數

trie_node* next[26]

;// 指向各個子樹的指標

bool exist;

// 標記該結點處是否構成單詞

}trie樹的插入操作很簡單,其實就是將單詞的每個字母逐一插入trie樹。插入前先看字母對應的節點是否存在,存在則共享該節點,不存在則建立對應的節點。

比如要插入新單詞cook,就有下面幾步:

void

trie_insert

(trie_node *root,

char

* word)

node = node-

>next[id]

;// 每插入一步,相當於有乙個新串經過,指標向下移動

++p;

node-

>count +=1;

// 這行**用於統計每個單詞字首出現的次數(也包括統計每個單詞出現的次數)

} node-

>exist =

true

;// 單詞結束的地方標記此處可以構成乙個單詞

}

在trie樹中查詢乙個字串的時候,比如查詢字串code,可以將要查詢的字串分割成單個的字元c,o,d,e,然後從trie樹的根節點開始匹配,當匹配到字串最後乙個字母時,如果它還存在於trie樹時且該節點對應的標誌為被設定,則該單詞存在。

bool trie_search

(trie_node *root,

char

* word)

return node-

>exist;

}

trie樹的刪除操作需要考慮刪除的節點所處的位置,這裡分三種情況進行分析:

字首匹配

例如:找出乙個字串集合中所有以五分鐘開頭的字串。我們只需要用所有字串構造乙個trie樹,然後輸出以 五−>分−>鐘 開頭的路徑上的關鍵字即可。

trie樹字首匹配常用於搜尋提示。如當輸入乙個**,可以自動搜尋出可能的選擇。當沒有完全匹配的搜尋結果,可以返回字首最相似的可能。

字串檢索

給出n個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,按最早出現的順序寫出所有不在熟詞表中的生詞。

檢索/查詢功能是trie樹最原始的功能。給定一組字串,查詢某個字串是否出現過,思路就是從根節點開始乙個乙個字元進行比較:

如果沿路比較,發現不同的字元,則表示該字串在集合中不存在。

如果所有的字元全部比較完並且全部相同,還需判斷最後乙個節點的標誌位(標記該節點是否代表乙個關鍵字)。

C 高階資料結構 Trie樹

trie樹,又稱字典樹或字首樹,是一種有序的 用於統計 排序和儲存字串的資料結構,它與二叉查詢樹不同,關鍵字不是直接儲存在節點中,而是由節點在書中的位置決定。乙個節點的所有子孫都有相同的字首,也就是這個節點對應的字串,而根節點對應空字串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部...

資料結構 TRIE樹

分類 data structure 2009 04 19 22 31 5425人閱讀收藏 舉報trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用h...

資料結構 TRIE樹

trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更大。比如說對於某乙個單詞,我要詢問它...