杭電1251 字典樹基礎講解

2021-06-26 12:33:48 字數 2761 閱讀 9572

原作者位址

字典樹又稱單詞查詢樹,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 26

struct 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,它們代表的是老師...