對Trie單詞樹的實現與思考
阿新 • • 發佈:2019-02-05
一. 為什麼要使用Trie樹
Trie樹可以將大量字串通過樹形結構組織起來,字首相同的字串共享儲存空間,從而達到1)節約儲存空間,2)加快特定查詢速度(例如,以給定字串開頭的字串的個數等)。
二. C實現Trie樹
Trie樹的建立
void create_tree(struct Node* T, char dir[]){ int jc=1; //root節點已經在main函式中create,故從第二個字串開始建樹 T->num_word++; struct Node* temp = T; while(dir[jc] != '\0'){ int flag = 0; //用來監控當前字元是否存在於樹中 int it=0; for(; it<temp->num_child; it++){ if(dir[jc] == temp->child[it]->data){ temp = temp->child[it]; temp->num_word++; flag = 1; //當前字元存在 break; } } if(flag == 0){ //當前字元不存在 struct Node* Tc = (struct Node*)malloc(sizeof(struct Node)); Tc->num_word = 1; Tc->data = dir[jc]; Tc->num_child = 0; temp->child[temp->num_child] = Tc; temp->num_child++; temp = Tc; } jc++; } }
Trie樹的搜尋
void compare(struct Node* T, char dir[]){ int jc=1, result = 0; struct Node* temp = T; int flag = 0; while(dir[jc] != '\0'){ int it=0; flag = 0; for(; it<temp->num_child; it++){ if(dir[jc] == temp->child[it]->data){ temp = temp->child[it]; flag = 1; break; } } if(flag == 0) break; jc++; } if(dir[jc] == '\0') result = temp->num_word; else result = 0; printf("%d\n", result); }
主函式部分
int main(void){ int sum_line = 0, sum_compare = 0, i=0, index=0; char dir[11]; struct Node table[27]; memset(table, '\0', sizeof(table)); scanf("%d", &sum_line); for(; i<sum_line; i++){ memset(dir, '\0', 11); scanf("%s", dir); index = (int)dir[0] -97; table[index].data = dir[0]; create_tree(&table[index], dir); } scanf("%d", &sum_compare); for(i=0; i<sum_compare; i++){ memset(dir, '\0', 11); scanf("%s", dir); index = (int)dir[0] - 97; compare(&table[index], dir); } return 0; }
三. 思考
(以上實現當然有更優的方式。)這裡我們主要看重的是,1)Trie樹的思想;2)Trie的建立和搜尋方式。