字典樹

字典樹

字典樹又稱單詞查找樹,Trie樹,是一種樹形結構,是一種哈希樹的變種。典型套用是用於統計,排序和保存大量的字元串(但不僅限於字元串),所以經常被搜尋引擎系統用於文本詞頻統計。

性質

它有3個基本性質:
根節點不包含字元,除根節點外每一個節點都只包含一個字元。 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字元串。 每個節點的所有子節點包含的字元都不相同。

基本操作

其基本操作有:查找 插入和刪除,當然刪除操作比較少見.我在這裡只是實現了對整個樹的刪除操作,至於單個word的刪除操作也很簡單.

實現方法

搜尋字典項目的方法為(1) 從根結點開始一次搜尋;
(2) 取得要查找關鍵字的第一個字母,並根據該字母選擇對應的子樹並轉到該子樹繼續進行檢索;
(3) 在相應的子樹上,取得要查找關鍵字的第二個字母,並進一步選擇對應的子樹進行檢索。
(4) 疊代過程……
(5) 在某個結點處,關鍵字的所有字母已被取出,則讀取附在該結點上的信息,即完成查找。
其他操作類似處理

套用

串的快速檢索

給出N個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。
在這道題中,我們可以用數組枚舉,用哈希,用字典樹,先把熟詞建一棵樹,然後讀入文章進行比較,這種方法效率是比較高的。

“串”排序

給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出
用字典樹進行排序,採用數組的方式創建字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可。

最長公共前綴問題

對所有串建立字典樹,對於兩個串的最長公共前綴的長度即他們所在的結點的公共祖先個數,於是,問題就轉化為最近公共祖先問題(以後補上)。

字典樹基本模板

#define MAX 26 //字元集大小
typedef struct TrieNode
{
int nCount; //記錄該字元出現次數
struct TrieNode *next[MAX];
}TrieNode;
TrieNode Memory[1000000];
int allocp =0;
/*初始化*/
void InitTrieRoot(TrieNode **pRoot)
{
*pRoot = NULL;
}
/*創建新結點*/
TrieNode *CreateTrieNode()
{
int i;
TrieNode *p;
p =&Memory[allocp++];
p->nCount =1;
for(i =0 ; i < MAX ; i++)
{
p->next&#91;i&#93; = NULL;
}
return p;
}
/*插入*/
void InsertTrie(TrieNode **pRoot , char*s)
{
int i , k;
TrieNode *p;
if(!(p =*pRoot))
{
p =*pRoot = CreateTrieNode();
}
i =0;
while(s&#91;i&#93;)
{
k = s&#91;i++&#93; -'a'; //確定branch
if(p->next&#91;k&#93;)
p->next&#91;k&#93;->nCount++;
else
p->next&#91;k&#93; = CreateTrieNode();
p = p->next&#91;k&#93;;
}
}
//查找
int SearchTrie(TrieNode **pRoot , char*s)
{
TrieNode *p;
int i , k;
if(!(p =*pRoot))
{
return0;
}
i =0;
while(s&#91;i&#93;)
{
k = s&#91;i++&#93; -'a';
if(p->next&#91;k&#93; == NULL) return0;
p = p->next&#91;k&#93;;
}
return p->nCount;
}

相關搜尋

熱門詞條

聯絡我們