字典樹模板

2021-07-08 13:28:09 字數 1835 閱讀 2581

字典樹

字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,雜湊表的乙個變種。用於統計,排序和儲存大量的字串(也可以儲存其

的)。優點就是利用公共的字首來節約儲存空間。在這舉個簡單的例子:比如說我們想儲存3個單詞,nyist、nyistacm、nyisttc。如果只是

單純的按照以前的字元陣列儲存的思路來儲存的話,那麼我們需要定義三個字串陣列。但是如果我們用字典樹的話,只需要定義

乙個樹就可以了。在這裡我們就可以看到字典樹的優勢了。

基本的操作

[cpp]view plain

copy

print?

struct node    

};    

struct node  

};

next是表示每層有多少種類的數,如果只是小寫字母,則26即可,若改為大小寫字母,則是52,若再加上數字,則是62了,這裡根

據題意來確定。

cnt可以表示乙個字典樹到此有多少相同字首的數目,這裡根據需要應當學會自由變化。

構建trie樹的基本演算法也很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則

建立對應的節點和邊。比如要插入單詞add(已經插入了單詞「ad」),就有下面幾步:

考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。

考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad

考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。

[cpp]view plain

copy

print?

void buildtrie(char *s)    

p=p->next[s[i]-'a'];    

p->cnt++;    

}    

}    

void buildtrie(char *s)  

p=p->next[s[i]-'a'];

p->cnt++;

} }

(1)每次從根結點開始進行搜尋;

(4)迭代剛才過程。。。

(5)直到在某個結點處:

[cpp]view plain

copy

print?

void findtrie(char *s)    

p=p->next[s[i]-'a'];    

}    

printf("%d\n",p->cnt);    

}    

void findtrie(char *s)  

p=p->next[s[i]-'a'];

} printf("%d\n",p->cnt);

}

有些題目,資料比較大,需要查詢完之後釋放記憶體(比如:hdu1671 phone list)

遞迴釋放記憶體:

[cpp]view plain

copy

print?

void del(node *root)    

字典樹模板

字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,典型應用是用於統計,排序和儲存大量的字串,所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來節約儲存空間,最大限度的減少無謂的字串比較,查詢效率比雜湊表高。字典樹的應用 字串的快速檢索 雜湊最長公共字首 include usi...

字典樹模板

package template public class triemod trie root new trie for string s str if find root,asdf else public static void insert final trie root,string str ...

字典樹模板

今天ac了兩題trie tree的題目,感覺trie的性質真的是相當的好,而且實現比較簡單。它使在字串集合中查詢某個字串的操作的複雜度降到最大只需o n 其中n為字串的長度。trie是典型的將時間置換為空間的演算法,好在acm中一般對空間的要求很寬鬆。include includeusing nam...