所謂trie,其實就是一棵樹,不過它的節點是乙個字元。
手動建立一棵trie,用來做模型
這就是一棵trie,是不是有點想法了?
設trie[i,j]=k表示編號為i的節點的兒子是標號為j的節點的編號
編號和標號是不一樣的
先說標號,所謂標號
例如有26個小寫字母,那麼標號就是1~26,
如果有52個大小寫字母,標號就是1~52,反正多一種就多給它個標號。
然後是編號,編號是乙個動態開點的過程,舉個栗子
假設有
bee這個單詞,
我們將它插入到trie裡面去,
root是0號節點
bee
第乙個字元是『b』,標號為2(ord(『b』)-96也就是ascii碼-96)
trie[0,2]=0,也就是還沒有這個節點
給它建立乙個節點
tot+1=1
trie[0,2]=tot
跑到這個節點去
第二個字元是『e』,標號為5
tot+1=2
trie[1,5]=tot
跑到這個節點去
第三個字元同理
tot+1=3
trie[2,5]=tot
假設再來乙個bear
前面『be』都是有的,所以跑到了編號為2的節點
這時又發現第三個字母『a』又沒了
tot+1=4
trie[2,4]=tot
以下同理,整理出來就是
過程很清晰,現在給出**
procedure
make
(x,t:longint);
var ch:char;
begin
if(x=length(s[i]))then
begin
bz1[t]:=true;
exit;
end;
ch:=s[i][x+1];
if(trie[t][ord(ch)-96]=0)then
begin
inc(tot);
trie[t][ord(ch)-96]:=tot;
f[tot]:=ch;
end;
make(x+1,trie[t][ord(ch)-96]);
end;
f[tot]表示編號為tot的點所代表的字元
bz1[t]表示編號為t的點是不是乙個字串的終止點
然後我們就有了一棵trie
有什麼用呢?
第乙個用處是看某乙個字串在不在一堆字串裡
這個很明顯嘛,順著trie跑一遍,跑到底看看是不是乙個字串的終止點
procedure
search
(x,t:longint);
var ch:char;
begin
if(x=length(s1))then
begin
if(bz1[t])then bz:=true
else bz:=false;
exit;
end;
ch:=s1[x+1];
if(trie[t][ord(ch)-96]=0)then
begin
bz:=false;
exit;
end;
search(x+1,trie[t][ord(ch)-96]);
end;
然後還有一種就是判斷乙個字首是多少個串的字首,大致是一樣的,就是每走一步都判斷一下是不是乙個串的結尾。
另外還有求xor最大值也可以用trie,總而言之,想象力有多大,trie就有多少用處。
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...
字典樹 trie樹
amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...