樹結構 Trie字典樹

2021-09-13 16:43:32 字數 2418 閱讀 1940

trie樹的名字有很多,比如字典樹,字首樹等等。

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

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

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

(1)詞頻統計:

可能有人要說了,詞頻統計簡單啊,乙個hash或者乙個堆就可以打完收工,但問題來了,如果記憶體有限呢?對於百億級別的資料樣本還能這麼玩嗎?所以這裡我們就可以用trie樹來壓縮下空間,因為公共字首都是用乙個節點儲存的。

(2)字首匹配:

就拿上面的圖來說吧,如果我想獲取所有以"a"開頭的字串,從圖中可以很明顯的看到是:and,as,at,如果不用trie樹, 你該怎麼做呢?很顯然樸素的做法時間複雜度為o(n2) ,那麼用trie樹就不一樣了,它可以做到h,h為你檢索單詞的長度,可以說這是秒殺的效果。

舉個例子:現有乙個編號為1的字串」and「,我們要插入到trie樹中,採用動態規劃的思想,將編號」1「計入到每個途徑的節點中, 那麼以後我們要找」a「,」an「,」and"為字首的字串的編號將會輕而易舉。

為了方便,我也採用純英文本母,我們知道字母有26個,那麼我們構建的trie樹就是乙個26叉樹,每個節點包含26個子節點。

/**

字典樹*/

type trienode struct

既然是26叉樹,那麼當前節點的後續子節點是放在當前節點的哪一叉中,也就是放在childnodes中哪乙個位置,這裡我們採用 int k = word[0] - 'a』來計算位置。

func

addnode

(root *trienode, word string

)//找到word的第乙個字元在root節點的第k個子節點

k := word[0]

-'a'

if root.childs[k]

==nil

} nextword := word[1:

]iflen(nextword)==0

addnode

(root.childs[k]

, nextword)

}

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

func

deletenode

(root *trienode, word string

)//找到word的第乙個字元在root節點的第k個子節點

k := word[0]

-'a'

if root.childs[k]

==nil

nextword := word[1:

]iflen(nextword)==0

&& root.childs[k]

.freq >

0deletenode

(root.childs[k]

, nextword)

}

/**

獲取word出現的頻率;

頻率大於0表示存在,如果不存在頻率為0

*/func

get(root *trienode, word string

)int

k := word[0]

-'a'

if root.childs[k]

==nil

nextword := word[1:

]iflen(nextword)==0

return

get(root.childs[k]

, nextword)

}

func

getrandomstring

(l int

)string

r := rand.

new(rand.

newsource

(time.

now().

unixnano()

))for i :=

0; i < l; i++

return

string

(result)

}//----------------------------

package trie_tree

import

("fmt"

"testing"

"time"

)func

preparedata()

*trienode

for i :=

0; i <

1000000

; i++

return root

}func

testtrie

(t *testing.t)

資料結構 Trie字典樹

簡介 字典樹 又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。優點 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。性質 1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字元 2.從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字...

Trie樹(字典樹)

trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...