先聊一聊字典樹是什麼,他有什麼用
字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。
簡單來說,字典樹就是將很多組字串儲存在一棵樹上,並且可以快速的找到單詞。
下面先構建一棵簡單的字典樹:
如給出以下字串「ab」,「bc」,「acd」,「bca」,「cab」,「caccd」,「cacca」,構建一棵trie樹。
建樹如下圖
圖中紅色的節點表示到此處已經構成乙個單詞了
字典樹通過每個字母向下查詢,能減少時間
在字典樹上,每一條邊對應乙個字母,而每個節點表示的是這個節點的字首,比如最左邊的b連線的那個節點代表的字首是,因為與享有共同的字首,所以他們享有共同的分支。
陣列寫法:
一、建樹
void
insert()
head=trie[head]
[x];
}}
二、查詢
bool find()
return
true
;}
三、查詢字首數量查詢字首數量需要把前兩個**塊修改一下,具體在下面模板裡
int
find()
return sum[head]
;}
完整模板(根據題目要求進行修改)
int trie[
1005][
26];char s[
100]
;//bool over[1005]; 查詢整個單詞時候用到
int tot=0;
//int sum[1005]; 字首數量
void
insert()
head=trie[head]
[x];
// sum[head]++;//記錄個數
}// over[head]=true;
}bool find()
return
true
;// return over[head];
}//int find()
// return sum[head];
//}
鍊錶寫法:
#include
#include
#include
#include
using namespace std;
char s[11]
;int n, m;
bool p;
struct node
*root;
node*
build()
void
insert()
}int
search()
return r-
>count;
}int
main()
scanf
("%d"
,&m)
;for
(int i =
1; i <= m; i++
)}
推薦使用陣列寫法
陣列做法不管是在時間,空間,**量上都要優於鍊錶做法。
ac**:
#include
#include
using namespace std;
int trie[
1000005][
26];int tot =0;
char s[
105]
;int sum[
1000005]=
;void
insert()
head = trie[head]
[x];
sum[head]++;
}}intfind()
return sum[head];}
intmain()
while
(cin.
getline
(s,105))
printf
("%d\n"
,find()
);return0;
}
hdu 2846 repository(trie樹)
題解:另一篇部落格
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...
字典樹 trie樹
amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...