日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现字典树

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现字典树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字典樹

  • 基本概念
  • 代碼實現
    • 頭文件 trie_types.h
    • 函數實現 trie.c
    • 代碼測試 main.c
  • 測試結果

基本概念

??字典樹,又稱單詞查找樹,Trie樹,常用于統計、排序和保存大量的字符串。它的優點是利用字符串的公共前綴來減少存儲空間以及查詢時間,可以最大限度的減少無謂的字符串比較。
??其基本特點如下:一個根節點起始,根節點不存儲字符,然后除根節點外每一個節點都只包含一個字符;將根節點沿著某一條路徑到葉子節點的所有字符排列起來即存儲的一個字符串或稱為詞組;另外就英文字母而言,如果不區分大小寫,那么一個節點最大的子節點數是26,且每個子節點包含的字符都不相同。
??基本操作有:插入、查找、刪除

代碼實現

??采用c語言實現,分為三個文件:

trie_types.h
包括字典樹的結構體定義和基本操作函數的聲明

trie.c
字典樹基本操作函數的實現

main.c
代碼測試

頭文件 trie_types.h

#ifndef TRIE_TYPE #define TRIE_TYPE#include <stdbool.h>#define MAX 26// 只考慮小寫,英文最多26個字母,即每個節點最多擁有26個子節點// 可以靈活的在此結構中添加字段以實現程序的需求typedef struct TrieNode {char val; // 存儲單個字符bool isEnd; // 標記單詞最后一個字符,即葉子節點struct TrieNode *next[MAX];} *Trie, TrieNode;void init_trie(Trie *trie); // 初始化字典樹void insert_trie(Trie *trie, const char *str); // 插入字符串void search_trie(Trie *trie, const char *str); // 查找詞組是否在字典樹中void delete_trie(Trie *trie); // 刪除字典樹#endif

函數實現 trie.c

#include "trie_types.h" #include <malloc.h> #include <stdio.h>static TrieNode *queue[1024]; // 數組實現隊列static TrieNode *create_node(int val); // 創建新節點 static void traverse_trie(Trie *trie); // 廣度遍歷字典樹static TrieNode *create_node(int val){// 創建新節點TrieNode *newNode;newNode = (TrieNode *)malloc(sizeof(TrieNode));newNode->val = val;newNode->isEnd = false;for (int i=0; i<MAX; i++){newNode->next[i] = NULL;}return newNode; }static void traverse_trie(Trie *trie){// 廣度優先遍歷TrieNode *node = *trie;int head = 0, tail = 0; // 隊列頭尾指針queue[tail++] = node; // 頭節點入隊while (head != tail){node = queue[head++]; // 節點出隊for (int i=0; i<MAX; i++){if (node->next[i]){queue[tail++] = node->next[i];}}} }void init_trie(Trie *trie){// 初始化一個空的字典樹*trie = NULL; }void insert_trie(Trie *trie, const char *str){// 插入單詞到字典樹中TrieNode *node;int i = 0, index = 0;if (!*trie){// 頭節點為空,先創建頭節點*trie = create_node(0);}node = *trie;while (str[i]){/*利用字符相減,使用index記錄節點的插入位置,保證處于同一層次且相同的字符不會被重復插入*/index = str[i] - 'a';if (!node->next[index]){node->next[index] = create_node(str[i]);}node = node->next[index];i++;}node->isEnd = true; // 單詞最后一個字母標記為true }void search_trie(Trie *trie, const char *str){/*查詢單詞是否在字典樹中,不包括含有相同前綴的例如已插入:he,那么h和her都不算在字典樹中*/TrieNode *node = *trie;int i = 0, index = 0;if (!node){// 判斷是否是空樹fputs("Trie is null!\n", stdout);return;}while(str[i]){/*比較str中的每一個字符,直到走到字符數組結尾或者字典樹中不存在對應節點*/index = str[i] - 'a';if (!node->next[index])break;node = node->next[index];i++;}if (node->isEnd && !str[i]) {printf("%s is exist!\n", str);} else {printf("%s is not exist!\n", str);} }void delete_trie(Trie *trie){// 釋放字典樹內存int i = 0;traverse_trie(trie); // 存儲字典樹節點指針到隊列中while (queue[i]){free(queue[i++]);} }

代碼測試 main.c

#include "trie_types.h" #include <stdio.h> #include <malloc.h>int main(void){// 測試字典樹char str[][4] = {"he","she","his"};char tStr[][4] = {"he","she","his","her","hh","oo"};Trie *trie = malloc(sizeof(Trie));init_trie(trie); // 初始化for (int i=0; i<3; i++)// 插入insert_trie(trie, str[i]);for (int i=0; i<6; i++)// 查找search_trie(trie, tStr[i]);delete_trie(trie); // 釋放return 0; }

測試結果


??如上圖所示,上述代碼很好的實現了字典樹的初始化、插入、查詢以及刪除操作,能夠正確的查詢到被存儲在字典樹中的詞組;而具有相同前綴但沒有完整存儲在字典樹中的詞組將不會被查詢到。

總結

以上是生活随笔為你收集整理的C语言实现字典树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。