trie樹(字典樹)

2021-08-21 12:58:20 字數 2033 閱讀 6520

所謂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新...