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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

浅谈 trie树 及其实现

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

定義又稱字典樹,單詞查找樹或者前綴樹,是一種用于快速檢索的多叉樹結構,

如英文字母的字典樹是一個26叉樹,數字的字典樹是一個10叉樹。

核心思想:是空間換時間.利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。

三個基本性質:

1.?根結點不包含字符,除根結點外每一個結點都只包含一個字符。

2.?從根結點到某一結點,路徑上經過的字符連接起來,為該結點對應的字符串。

3.?每個結點的所有子結點包含的字符都不相同。

優點:利用字符串的公共前綴來節約存儲空間,最大限度地減少無謂的字符串比較,查詢效率比哈希表高。

缺點:如果存在大量字符串且這些字符串基本沒有公共前綴,則相應的trie樹將非常消耗內存。

典型應用:統計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計

至于Trie樹的實現,可以用數組,靜態分配空間,也可以用指針動態分配

Trie樹的操作

在Trie樹中主要有3個操作,插入、查找和刪。一般情況下Trie樹中很少存在刪除單獨某個結點的情況,因此只考慮刪除整棵樹。

假設存在字符串str(都為小寫字母),Trie樹的根結點為root。i=0,p=root。

typedef struct stu {int n,flag; //n記錄前綴及單詞的個數,flag標記單詞是否存在struct stu *next[26]; //子節點 }node; View Code node* creat_node() {node *p=(node *)malloc(sizeof(node));p->n=p->flag=0;memset(p->next,0,sizeof(p->next));return p; } 建立新節點并初始化

1、插入

??1)取str[i],判斷p->next[str[i]-'a']是否為空,若為空,則建立結點temp,并將p->next[str[i]-'a']指向temp,然后p指向temp;

???若不為空,則p=p->next[str[i]-'a'];

??2)i++,繼續取str[i],循環1)中的操作,直到遇到結束符'\0',此時將當前結點p中的?flag?置為true。

void trie_insert(node *p,char *s) {int i;while(*s!='\0'){i=*s-'a';if(p->next[i]==0)p->next[i]=creat_node();p=p->next[i];s++;p->n++;}p->flag=1; } 插入字符串

2、查找

??1)取str[i],判斷判斷p->next[str[i]-'a']是否為空,若為空,則返回false;若不為空,則p=p->next[str[i]-'a'],繼續取字符。

??2)重復1)中的操作直到遇到結束符'\0',若當前結點p不為空并且 flag?為true,則返回true,否則返回false。

int trie_search(node *p,char *s) {int i;while(*s!='\0'){i=*s-'a';p=p->next[i];if(p==0)return 0;s++;}return p->n; } 查找字符串,并返回其個數

3、刪除

??刪除可以以遞歸的形式進行刪除。

void trie_del(node *root) {int i;for(i=0;i<M;i++) //M為子節點的個數if(root->next[i]!=NULL)trie_del(root->next[i]);free(root); } 遞歸刪除整棵樹

?

?

轉載于:https://www.cnblogs.com/happy-lcj/p/3890417.html

總結

以上是生活随笔為你收集整理的浅谈 trie树 及其实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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