trie 樹是一種多叉樹的結構,每個節點儲存乙個字元,一條路徑表示乙個字串。
下圖表示了字串: him 、 her 、 cat 、 no 、 nova 構成的 trie 樹。
從圖中可以看出 trie 樹包含以下性質:
trie 樹中每個節點儲存乙個字元,從根節點到葉節點的一條路徑儲存乙個字串。另外,有公共字首的字串,他們的公共字首會共用節點。如 her、 him 共用 h 節點。
如何生成 trie 樹?
trie 樹的生成過程,就是不斷將字串插入樹中。
以插入字串 him 、 her 、 cat 、 no 、 nova 為例,過程如下:
插入 him :
插入 her :
插入 cat:
插入 no:
插入 nova:
如何刪除乙個字串?
刪除乙個字串需要考慮的地方較多。
情況一:待刪除的字串末尾為葉節點,且與其它字串無公共字首。將節點逐一刪除即可,例如刪除 cat。
情況二:待刪除字串末尾不是葉節點。將字串標誌位置為 false 即可,例如刪除 no 。
情況三:待刪除字串末尾為葉節點,並且中間有其它單詞。逐一刪除節點,直到待刪除節點是另乙個字串的結尾為止,例如刪除 nova。
情況四:待刪除字串某一節點還有其它子節點。逐一刪除節點,如果待刪除節點還有其它子節點,則停止刪除,例如刪除 him。
trie 樹有什麼用?
trie 樹又叫字典樹。字典是用來查字的,trie 樹最基本的作用是在樹上查詢字串。
例如有 5 個字串: him 、 her 、 cat 、 no 、 nova 。現在要查詢 catch 是否存在。
如果使用暴力的方法,需要用 catch 與這 5 個字串分別進行匹配,效率較低。
如果將這 5 個字串儲存成 trie 的結構,只需要順著路徑依次比較,比較完 cat 之後,沒有節點與 c 匹配,所以字串集合中不存在 catch。
寫一下 trie 樹實現插入,檢索,刪除字串的**。
//實現 trie 樹節點結構
struct trie_node
;//指向子節點指標};
//插入字串:
void
insert
(string s, trie_node* root)
p = p-
>child[n];}
p->iskey =1;
//字串結尾標誌位置為1}
//檢索字串
bool
search
(string s, trie_node* root)
if(p-
>iskey)
return1;
return0;
}//刪除字串:
void
remove
(string s, trie_node* root)
p->iskey =0;
//情況二,將標誌位置為0
while
(!stkt.
empty()
)delete q;
//刪除節點
stkt.
pop();
stkt.
top()-
>child[stkc.
top()]
=nullptr
;//刪除邊
stkc.
pop();
}}
trie 樹還有其他用途嗎?可以用來詞頻統計詞頻統計在構造樹的過程中,已經將所有字串遍歷了一遍。可以在 trie 樹節點的資料結構中,增加乙個 count 來計數。對於每個字串的插入操作,若已存在,計數加 1,若不存在,插入後 count 置為 1。
要統計某個字串出現的次數,只需要找到字串結尾對應的節點,輸出對應節點的 count 值即可。
//重寫 trie 樹節點結構
struct trie_node
;//指向子節點指標};
//重寫插入字串:
void
insert
(string s, trie_node* root)
p = p-
>child[n];}
p->iskey =1;
}//實現詞頻統計
intcount
(string s, trie_node* root)
return p-
>count;
}
說說 trie 樹的優缺點。
trie樹的核心思想是空間換時間,利用字串的公共字首來減少無謂的字串比較以達到提高查詢效率的目的。
優點插入和查詢的效率很高,都為o(m)。其中 m 是待插入/查詢的字串的長度。。 缺點
空間消耗比較大。
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新...