字典樹 基本模版 操作

2022-07-12 10:48:14 字數 3483 閱讀 5352

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

字典樹與字典很相似,當你要查乙個單詞是不是在字典樹中,首先看單詞的第乙個字母是不是在字典的第一層,如果不在,說明字典樹里沒有該單詞,如果在就在該字母的孩子節點裡找是不是有單詞的第二個字母,沒有說明沒有該單詞,有的話用同樣的方法繼續查詢.字典樹不僅可以用來儲存字母,也可以儲存數字等其它資料。

好了,廢話不多說,下面看其定義和操作。

資料結構的定義如下:

1

#define maxn 10

23 typedef struct

trie

4trie;

89 trie *root;

1、先說一下root。root是整棵字典樹的根,其中不存放任何與輸入的字串有關的資訊,它的子結點才是輸入字串的第乙個字元--str[0]...

2、每個結點的最大分支數maxn根據要求變化,如果輸入的是數字(0~9)的組合,定義為10就ok,若是小寫字母則定義為26,大小寫字母定義為52...

3、其中的v比較靈活,用於儲存一些資訊,具體是什麼資訊根據題目具體要求具體變化,如:可以定義為以從root到此結點的結點組合為字首的字串的個數,可以用來記錄此結點是否為某個字串的尾結點...

4、對於root的定義一般也有兩種寫法:trie root; 或者 trie *root;  第一種一般用於乙個題目只有一棵字典樹的情況,第二種主要用於題目中需要動態建立多棵字典樹進行處理的時候(便於清空已經使用過的trie記憶體),在main()中要root = malloc(sizeof(trie)); 

字典樹建立過程

1、依次讀取字串的每個字元...

2、建樹過程中,需要兩個temp指標,*p 和 *q,*p 用於從根節點開始(trie *p = root;若前面定義root時用的是第二種方式,則此處為trie *p = &root;)依次往下找,每次都選擇str[i]所在的子樹,若str[i]已經存在則p=p->next[id],若不存在則用*q建立乙個新結點,將其插到p->next中(若對v有操作,此時也同時進行)...

3、在讀取字串每個字元的for迴圈結束後,一棵其中只包含了乙個字串資訊的字典樹就建成了...

4、對每個要加入到樹中的字串依次呼叫此函式...

模版如下:

1

void createtrie(char *str)217

else

1821}22

/*code

*/23 }

1、若是字母的字典樹,第7行**改為 int id = str[i] - 'a';

2、其中對於v的操作具體變化

查詢過程

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

模版如下:

1

int findtrie(char *str)

2else

1114}15

return p->v;

16 }

這個是用於處理以str為字首的字串的數目的...

刪除--釋放記憶體

我們可以看到,其實字典樹的空間開銷是比較大的,尤其是動態建立了多棵字典樹的時候,所以在題目上的記憶體有限制的情況下,我們有必要在使用完一棵字典樹時將其記憶體釋放,**如下:

1

int dealtrie(trie*t)211

free(t);

12return0;

13 }

到此一棵字典樹的基本操作就完成了。

1、hdoj 1251 統計難題

2、hdoj 1671 phone list

這是上面兩題的ac**:

1 #include2 #include3 #include4

#define maxl 15

5#define maxn 30

67 typedef struct

trie

8trie;

1213

trie root;

1415

int createtrie(char *str)

1629 p->next[id] =q;

30 p = p->next[id];

31 }else

3236}37

return0;

38}3940

int findtrie(char *str)

41else

5053}54

return p->v;55}

5657

intmain()

5864 memset(line, 0, sizeof

(line));

65while(scanf("

%s", &line) !=eof)

6669

return0;

70 }

view code

1 #include2 #include3 #include4

#define maxn 10

56 typedef struct

trie

7trie;

1112 trie *root;

1314

int createtrie(char *str)

1528 p->next[id] =q;

29 p = p->next[id];30}

31else

3237 p = p->next[id];38}

39}40 p->v = -1;41

for (int i = 0; i < maxn; ++i)

4247}48

return1;

49}5051

int deletetrie(trie *t)

52else

5764}65

}66free(t);

67return0;

68}6970

intmain()

7182

int flag = 1

;83 scanf("

%d", &n);

84for (int i = 0; i < n; ++i)

8592}93

if(flag)

94else

97100

deletetrie(root);

101}

102return0;

103 }

view code

字典樹(講解 模版)

又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹與字典很相似,當你要查乙個單詞是不是...

zz 字典樹原理 字典樹(講解 模版)

怕以後還要用到 就先轉了 from 字典樹原理 trie樹就是字典樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更...

Trie字典樹 基本操作

給出n nn個字串,以及m mm個詢問。每次詢問讀入乙個字串,求該字串是多少個字串的字首。每個字串長度小於102 10 2 102,n和m小於105 10 5 105。輸入 4anan amnaman anann 3ana amaa 輸出 21 4樸素演算法 暴力搜尋,對於每個詢問,把所有的n個字串...