字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。
字典樹與字典很相似,當你要查乙個單詞是不是在字典樹中,首先看單詞的第乙個字母是不是在字典的第一層,如果不在,說明字典樹里沒有該單詞,如果在就在該字母的孩子節點裡找是不是有單詞的第二個字母,沒有說明沒有該單詞,有的話用同樣的方法繼續查詢.字典樹不僅可以用來儲存字母,也可以儲存數字等其它資料。
好了,廢話不多說,下面看其定義和操作。
資料結構的定義如下:
11、先說一下root。root是整棵字典樹的根,其中不存放任何與輸入的字串有關的資訊,它的子結點才是輸入字串的第乙個字元--str[0]...#define maxn 10
23 typedef struct
trie
4trie;
89 trie *root;
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、對每個要加入到樹中的字串依次呼叫此函式...
模版如下:
11、若是字母的字典樹,第7行**改為 int id = str[i] - 'a';void createtrie(char *str)217
else
1821}22
/*code
*/23 }
2、其中對於v的操作具體變化
查詢過程
(1) 每次從根結點開始一次搜尋;
模版如下:
1這個是用於處理以str為字首的字串的數目的...int findtrie(char *str)
2else
1114}15
return p->v;
16 }
刪除--釋放記憶體
我們可以看到,其實字典樹的空間開銷是比較大的,尤其是動態建立了多棵字典樹的時候,所以在題目上的記憶體有限制的情況下,我們有必要在使用完一棵字典樹時將其記憶體釋放,**如下:
1到此一棵字典樹的基本操作就完成了。int dealtrie(trie*t)211
free(t);
12return0;
13 }
1、hdoj 1251 統計難題
2、hdoj 1671 phone list
這是上面兩題的ac**:
1 #include2 #include3 #include4view code#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 }
1 #include2 #include3 #include4view code#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 }
字典樹(講解 模版)
又稱單詞查詢樹,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個字串...