字首樹,又叫字典樹,主要用於字串(不限於字串)查詢、統計、排序的一種資料結構
比如,給定n個字串,進行m次查詢,每次查詢給定乙個字串 t,問t 是否存在於那給定的n個字串裡
這裡,我們用到了字首樹,即將每個字串看作一條鏈,把擁有相同字首的字串的鏈的相同字首給合併,形成一棵棵子樹。如給定三個字串his,her,hit,得到字首樹:
上圖很清晰了,在右邊的樹裡面從根出發,一直到葉子結點,可以找到his,hit,her三個單詞
那麼問題來了,如果再來乙個字串it,怎麼插入到這棵trie裡?顯然這是無法接到根節點h下面的,因為it第乙個字母不是h~~
那麼我們可以令乙個空結點為根,所有子樹都從這個空結點出發,即:
這時又有了乙個新的問題,it插進trie了,如果再有乙個its怎麼辦?直接在it後面加乙個s,那麼不就把it覆蓋掉了嗎?
這個好解決,只需要使用乙個val陣列記錄每乙個結點的權值即可,從根開始,向下查詢,找到某個結點i,val[i]==0表示當前得到的字串只是乙個字首,並不在我們之前插入到trie裡的眾多字串(後面稱之為字典)裡,不是0則說明這個字串在字典裡。額,我懶地畫圖了,反正這玩意兒也好理解。
然後就是實現了:使用0表示根節點(就是那個空結點)然後1,2,3......依次表示下面的結點,第乙個插入到trie裡的為1(即id為1),第二個插入到trie裡的為2(即id為2),以此類推。使用二維陣列ch[id][son]來表示trie,ch[i][j]表示的是id為i對應結點的j兒子的id。至於ch[i][j]那個j怎麼表示字元,就看情況而定了,比如如果只會出現小寫字母,那就用0,1,2,....,25分別表示a,b,c...,z即可。
給出只有小寫字母的的trie**:
struct trie
//起始只有根節點
int idx(char c) // 字元c的編號
// 插入字串s,附加資訊為v(例如字串的權值等),v非0,因為0表示本結點不是單詞結點
void insert(char* s, int v)
u = ch[u][c];//往下走
}val[u] = v;//字串的最後乙個字元的附加資訊為v
}// 查詢字串s,如果存在返回附加值,否則返回0
int find(char* s)
return val[u];}};
資料結構之字典樹,字首樹 Trie
public class trie public node private node root trie樹的根結點 private int size 樹中結點個數 public trie public int getsize 向字典樹中新增單詞 public void add string str ...
Trie 字首樹 字典樹 單詞查詢樹(資料結構)
在寫完了kmp演算法的部落格之後,我下定決心,一定要寫出一篇關於 ac自動機的部落格 ac自動機實際上就是字典樹上的kmp演算法。所以,考慮到廣大同學不一定會寫trie樹,特此在此處寫了一篇文章介紹介紹這種資料結構。字典樹 又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用...
資料結構 TRIE樹
分類 data structure 2009 04 19 22 31 5425人閱讀收藏 舉報trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用h...