原作者位址
字典樹又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。
說到底,其實不難算是演算法應當歸為資料結構,一種特殊的樹。
字典樹有三個特點,非常重要,也是構建字典樹的三個標準原則吧。
1.根節點為空
2.樹的每一層的元素獨一無二不可重複
3.從根節點到某一節點的路徑就是該節點對應的字串。
比如說這個樣例
banana
band
beeabsolute
acm
這五個單詞組成的字典樹應該如下圖所示:
(中間有些單詞很長省略了..)這個圖應該很直觀了。
字典樹的操作(看資料一般定義了四個操作。建立 新增 刪除 查詢。由於刪除操作不常用於是在這就不說了):
1.建立
建立應該分成兩個部分。定義結點和建立樹。
定義結點的**如下:
struct trie
;
1.num:到這個節點,字首相同的數目,這個地方看起來可能並不理解,那麼繼續往下看會明白。(ps:這個num隨題目變化而不同)
2.next是乙個指標陣列,其中maxn是每一層中最多的元素數。比如說這個題目當中,每一層最多只有26個小寫字母,maxn = 26.
***建立字典樹:
這個是最重要的部分。
建立字典樹首先要建立乙個trie型別的指標root,並且將其初始化(next[i] = null)。
struct trie *root = (struct trie*)malloc(sizeof(struct trie));
void initialize()
反應到圖上就如下圖所示。
(ps:用c語言的話千萬別忘了用malloc函式)
建立了樹根之後,開始完善這顆樹,注意一定要遵守那三個原則。
先給出**,然後以acm這個單詞為例從圖上體現一下。
void insert(char *str)//插入字典樹
else} }
我們把執行過程畫出來。
(假設str == acm)
在迴圈開始之前,我們得到的是這樣的圖
迴圈開始,第乙個字元是a
pos = 0
顯然p->next[pos] = null,則建立乙個新的結點,然後p->next[pos]指向這個結點,如下圖:
然後再把temp賦值給p使得temp稱為新的p
(注意temp的num值賦值為1了,表示到現在為止有乙個單詞的開頭字母是a,如果你在加入新增單詞absolute,那麼是指向else裡邊的**,此時a這一點的num值為2,表示到現在為止有兩個單詞的開頭字是a。這句話對於理解num的意義很有必要,後續的查詢**也更容易看懂)
然後不斷的這樣構造即可。
2.查詢
同樣,先貼**然後解釋。
int find(char *str)
return p->num;
}
在看懂了上邊的圖和理解了num的意思之後,這段**理解起來應該就很容易了。
假設字典樹已經建立完畢,對於ac這組資料,我們尋找到底有幾個單詞的字首是ac。
str == ac
迴圈:i = 0時 pos = a - 'a' = 0;
p - > next[0]不是空,繼續到下一層。
i = 1時 pos = c - 'a' = 2;
p - > next[2]不是空,繼續下一層。
i = 2 迴圈結束。
返回當前結點的num(也就是到該結點的字串剛好為ac的單詞的個數)
(如果想更加詳細的了解的話..多畫圖,多找幾個例子,順著**走一遍,就明白了了)
附ac**,98ms
#include #include #include #define maxn 26struct trie
;struct trie *root = (struct trie*)malloc(sizeof(struct trie));
void initialize()
void insert(char *str)//插入字典樹
else
} }int find(char *str)
return p->num;
}int main()
return 0;
}
杭電1251 字典樹典型應用
一道字典樹的簡單題,不過對於我這種剛學字典樹的菜鳥來說,還是糾結了很長時間,可以留下來做個模板,題目 ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第一部分是一...
hdu 1251 字典樹入門
ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第一部分是一張單詞表,每行乙個單詞,單詞的長度不超過10,它們代表的是老師交給ignatius統計的單詞,乙個空行...
HDU1251字典樹模板
problem description ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input 輸入資料的第一部分是一張單詞表,每行乙個單詞,單詞的長度不超過10,它們代表的是老師...