單詞查詢樹

2021-07-05 04:04:40 字數 2781 閱讀 4663

一:概念

從上面的圖中,我們或多或少的可以發現一些好玩的特性。

第一:根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。

第二:從根節點到某一節點,路徑上經過的字元連線起來,就是該節點對應的字串。

第三:每個單詞的公共字首作為乙個字元節點儲存。

二:使用範圍

既然學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個子節點。

1

#region trie樹節點

2///

3///

trie樹節點

4///

5public

class

trienode635

}36#endregion

2: 新增操作

既然是26叉樹,那麼當前節點的後續子節點是放在當前節點的哪一叉中,也就是放在childnodes中哪乙個位置,這裡我們採用

int k = word[0] - 'a'來計算位置。

1

///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

3:刪除操作

刪除操作中,我們不僅要刪除該節點的字串編號,還要對詞頻減一操作。

///

///刪除操作

/// ///

//////

///public

void deletetrienode(ref trienode root, string word, int

id)

4:測試

1

public

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...