trie樹
trie樹也稱字典樹,因為其效率很高,所以在在字串查詢、字首匹配等中應用很廣泛,其高效率是以空間為代價的。
一.trie樹的原理
利用串構建乙個字典樹,這個字典樹儲存了串的公共字首資訊,因此可以降低查詢操作的複雜度。
下面以英文單詞構建的字典樹為例,這棵trie樹中每個結點包括26個孩子結點,因為總共有26個英文本母(假設單詞都是小寫字母組成)。
則可宣告包含trie樹的結點資訊的結構體:
#define max 26其中next是乙個指標陣列,存放著指向各個孩子結點的指標。typedef struct trienode //trie結點宣告
trie;
如給出字串"abc","ab","bd","dda",根據該字串序列構建一棵trie樹。則構建的樹如下:
trie樹的根結點不包含任何資訊,第乙個字串為"abc",第乙個字母為'a',因此根結點中陣列next下標為'a'-97的值不為null,其他同理,構建的trie樹如圖所示,紅色結點表示在該處可以構成乙個單詞。很顯然,如果要查詢單詞"abc"是否存在,查詢長度則為o(len),len為要查詢的字串的長度。而若採用一般的逐個匹配查詢,則查詢長度為o(len*n),n為字串的個數。顯然基於trie樹的查詢效率要高很多。
但是卻是以空間為代價的,比如圖中每個結點所佔的空間都為(26*4+1)byte=105byte,那麼這棵trie樹所佔的空間則為105*8byte=840byte,而普通的逐個查詢所佔空間只需(3+2+2+3)byte=10byte。
二.trie樹的操作
在trie樹中主要有3個操作,插入、查詢和刪除。一般情況下trie樹中很少存在刪除單獨某個結點的情況,因此只考慮刪除整棵樹。
1.插入
假設存在字串str,trie樹的根結點為root。i=0,p=root。
1)取str[i],判斷p->next[str[i]-97]是否為空,若為空,則建立結點temp,並將p->next[str[i]-97]指向temp,然後p指向temp;
若不為空,則p=p->next[str[i]-97];
2)i++,繼續取str[i],迴圈1)中的操作,直到遇到結束符'\0',此時將當前結點p中的isstr置為true。
2.查詢
假設要查詢的字串為str,trie樹的根結點為root,i=0,p=root
1)取str[i],判斷判斷p->next[str[i]-97]是否為空,若為空,則返回false;若不為空,則p=p->next[str[i]-97],繼續取字元。
2)重複1)中的操作直到遇到結束符'\0',若當前結點p不為空並且isstr為true,則返回true,否則返回false。
3.刪除
刪除可以以遞迴的形式進行刪除。
測試程式:
#include usingnamespace
std;
#define max 26typedef
struct
trienode
trie;
void insert(trie *root,const
char *s)
inti;
trie *p =root;
while (*s!='\0'
)
temp->isstr = false
; p->next[*s - '
a'] =temp;
p = p->next[*s - 'a'
]; }
else
s++;
}p->isstr = true;//
單詞結束的位置標記此處可以構成乙個單詞
}int search(trie* root, const
char *s)
return (p!=nullptr&&p->isstr==true);}
void del(trie *root)
}free
(root);
}int main(int argc, char *ar**)
root->isstr = false
; cout
<< "
輸入n:\n";
cin >>n;
//getchar();
cout << "輸入"
個單詞:\n";
for (int i = 0; i < n;++i)
while (scanf("
%d",&m)!=eof)
else}}
del(root);
return0;
}//int main()
//
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新...