又稱單詞查詢樹,trie 樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。
1、根節點不包含字元,除根節點外每乙個節點都只包含乙個字元;
2、從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串;
3、每個節點的所有子節點包含的字元都不相同。
以英文單詞構建的字典樹為例,這棵 trie 樹中每個結點包括 26 個孩子結點,因為總共有 26 個英文本母(假設單詞都是小寫字母組成)。則可宣告包含 trie 樹的結點資訊的結構體:
typedef struct trienode
trienode,*trie;
其中 count 為該單詞字首出現的次數,next 是乙個指標陣列,存放著指向各個孩子結點的指標,exist 表示該結點位置是否構成乙個單詞。
有關 trie 樹的基本操作有插入、查詢和刪除。以統計單詞字首出現的次數為例。
1、插入
假設存在字串 word,trie 樹的根結點為 root。p=word,node=root。
1)當 p 不為空時,判斷 node->next[*p-『a』] 是否為空,若為空,則建立結點 temp,並將 node->next[*p-『a』] 指向 temp,然後 node 指向 node->next[*p-『a』];若不為空,則直接將 node 指向 node->next[*p-『a』]。
2)將 p 指標後移,node->count+=1,重複1)操作,直到 p 為空,將 node->exist 設為 true。
2、查詢
假設要查詢的字串為 word,trie 樹的根結點為 root。p=word,node=root。
1)當 p 不為空時,判斷 node->next[*p-『a』] 是否為空,若為空,則返回 0;若不為空,則 node=node->next[*p-『a』]。
2)將 p 指標後移,若當前結點 node 不為空並且 exist 為 true,則返回 node->count。
3、刪除
刪除操作與插入操作類似,但在刪除前需要先判斷該單詞是否存在。
#include #include #include #include #include using namespace std;
typedef struct trienode
trienode,*trie;
trienode* createtrienode()
void trieinsert(trie root,char* word)
node->exist=true;
}int triedelete(trie root,char* word)
if(node->exist==false) return 0;
node=root;
p=word;
while(*p)
node->exist=false;
return 1;
}int triesearch(trie root,char* word)
return node->count;
}int main()
}return 0;
}
trie 樹的強大之處就在於它的時間複雜度。它的插入和查詢時間複雜度都為 o(k),其中 k 為 key 的長度,與 trie 樹中儲存了多少個元素無關。trie 樹的空間消耗很大,其中心思想就是空間換時間。
本篇文章僅是本人在學習 trie 樹過程中的一些基礎知識總結,如果有什麼錯漏的地方,敬請諒解。
參考文章:
字典樹 Trie 入門篇
字典樹 trie 字典樹 又稱字首樹 給出字串集合 code cook five file fat,我們設根節點為空節點,那麼其trie樹如下所示 字典樹又稱字首樹,給出乙個字串集合,我們可以通過公共字首將整個字串集合存到乙個樹形結構中,一旦形成了集合中的字串,我們只需在樹上的相應節點打上標記 儲存...
hdu 1247 trie樹入門題
題目 題意 給你一些單詞,輸出是由兩個其他的單詞組成的單詞。分析 trie樹的入門題,很簡單,這題的資料很水,每個單詞的長度不會超過26.include include includeusing namespace std const int n 50005 char word n 27 struc...
字典 trie 樹 從入門到入土
今天再來認識乙個強大的資料結構。字典樹又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。就像...