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