一:概念
從上面的圖中,我們或多或少的可以發現一些好玩的特性。
第一:根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。
第二:從根節點到某一節點,路徑上經過的字元連線起來,就是該節點對應的字串。
第三:每個單詞的公共字首作為乙個字元節點儲存。
二:使用範圍
既然學trie樹,我們肯定要知道這玩意是用來幹嘛的。
第一:詞頻統計。
可能有人要說了,詞頻統計簡單啊,乙個hash或者乙個堆就可以打完收工,但問題來了,如果記憶體有限呢?還能這麼
玩嗎?所以這裡我們就可以用trie樹來壓縮下空間,因為公共字首都是用乙個節點儲存的。
第二: 字首匹配
就拿上面的圖來說吧,如果我想獲取所有以"a"開頭的字串,從圖中可以很明顯的看到是:and,as,at,如果不用trie樹,
你該怎麼做呢?很顯然樸素的做法時間複雜度為o(n2) ,那麼用trie樹就不一樣了,它可以做到h,h為你檢索單詞的長度,
可以說這是秒殺的效果。
舉個例子:現有乙個編號為1的字串」and「,我們要插入到trie樹中,採用動態規劃的思想,將編號」1「計入到每個途徑的節點中,
那麼以後我們要找」a「,」an「,」and"為字首的字串的編號將會輕而易舉。
三:實際操作
到現在為止,我想大家已經對trie樹有了大概的掌握,下面我們看看如何來實現。
1:定義trie樹節點
為了方便,我也採用純英文本母,我們知道字母有26個,那麼我們構建的trie樹就是乙個26叉樹,每個節點包含26個子節點。
12: 新增操作#region trie樹節點
2///
3///
trie樹節點
4///
5public
class
trienode635
}36#endregion
既然是26叉樹,那麼當前節點的後續子節點是放在當前節點的哪一叉中,也就是放在childnodes中哪乙個位置,這裡我們採用
int k = word[0] - 'a'來計算位置。
13:刪除操作///2
///插入操作
3///
4///
5///
6public
void addtrienode(ref trienode root, string word, int
id)7
2223
//該id途徑的節點
24root.childnodes[k].hashset.add(id);
2526
var nextword = word.substring(1
);27
28//
說明是最後乙個字元,統計該詞出現的次數
29if (nextword.length == 0
)30 root.childnodes[k].freq++;
3132 addtrienode(ref
root.childnodes[k], nextword, id);33}
34#endregion
刪除操作中,我們不僅要刪除該節點的字串編號,還要對詞頻減一操作。
///4:測試///刪除操作
/// ///
//////
///public
void deletetrienode(ref trienode root, string word, int
id)
1public
static
void
main()
2, stringsplitoptions.removeemptyentries);
1011 trie.addtrienode(sp.lastordefault().tolower(), convert.toint32(sp[0
]));12}
1314 stopwatch watch =stopwatch.startnew();
1516
//檢索go開頭的字串
17var hashset = trie.searchtrie("go"
);18
19foreach (var item in
hashset)20"
, item);22}
2324
watch.stop();
2526 console.writeline("
", watch.elapsedmilliseconds);
2728 console.writeline("
\n\ngo 出現的次數為:\n\n
下面我們拿著id到txt中去找一找,嘿嘿,是不是很有意思。
單詞查詢樹
兩種方法 給出一些列號碼,若果任乙個號碼不在另乙個中充當字首,那麼這系列號碼是合理的輸出yes,否則輸出no 思路 標頭檔案中find函式的使用,按長度從小到大排列,那麼能當另乙個號碼字首的只能是前乙個當後乙個的字首,所以乙個乙個找 時間複雜度 o n include include include...
單詞查詢樹
在進行文法分析的時候,通常需要檢測乙個單詞是否在我們的單詞列表裡。為了提高查詢和定位的速度,通常都畫出與單詞列表所對應的單詞查詢樹,其特點如下 1 根結點不包含字母,除根結點外每乙個結點都僅包含乙個大寫英文本母 2 從根結點到某一結點,路徑上經過的字母依次連起來所構成的字母序列,稱為該結點對應的單詞...
單詞查詢樹
一 將基於含有r個字元的字母表的單詞查詢樹稱為r向單詞查詢樹。p479 1 基於單詞查詢樹的符號表 基於單詞查詢樹的符號表 public class triest public value get string key private node get node x,string key,int d...