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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Trie总结

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

Trie 樹即為字典樹
這個樹可以把所有我們要在文本中所查詢的前綴都記錄下來
當我們拿到一個文本串 需要從里面找出所有前綴串的數目我們就可以用這個結構
拿著我們的文本到這個樹里面走一走就得到有多少個前綴了

我們來看 當我們拿到一個前綴
不斷地把這個前綴插入到樹中
對每一個節點 可以連到26個分節點去
這個樹具體有兩個操作
一個是add操作
還有一個就是匹配操作


Trie的頭結點是空的
我們將我們想要統計的串加入到以頭結點為根的樹里
每一個前綴都是從根節點的一條路徑

我們可以看一道例題HDU 1251
輸入多個單詞
然后再輸入多個前綴 每一個前綴輸出字符串中出現當前前綴的單詞數量

這里我們就可以把所有單詞全部add到字典樹中
為他們建立查詢路徑
比如這里的trie的結構我們可以這么設置

struct node{int time;node *next[26];init(){time = 0;for(int i=0;i<26;i++)next[i] = NULL;} }e;

time就記錄這里當前前綴已經走過多少次 也就是add過多少次
next表示 指向后面的字符的指針數組

add操作

void add(char s[]){int len = strlen(s);node *p = &e; //指向trie的指針for(int i=0;i<len;i++){if(!(p->next[s[i]-'a'])){//如果走到這里為空 就重新申請node *q = (node*)malloc(sizeof(node));(*q).init(); p->next[s[i]-'a']=q;}p = p->next[s[i]-'a'];p->time++; //并記錄前綴次數 }

查詢:

int match(char s[]){int len = strlen(s);node *p = &e;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return 0;p = p->next[s[i]-'a'];}return p->time; }

這里也就是把我們所要查找的串拿進來一個個匹配 看看能匹配到多少個
返回我們記錄的次數

完整代碼為:

#include<cstdio> #include<cstring> #include<cstdlib> using namespace std; struct node{int time;node *next[26];void init(){time = 0;for(int i=0;i<26;i++)next[i] = NULL;} }e; void add(char s[]){int len = strlen(s);node *p = &e; for(int i=0;i<len;i++){if(!(p->next[s[i]-'a'])){node *q = (node*)malloc(sizeof(node));(*q).init(); p->next[s[i]-'a']=q;}p = p->next[s[i]-'a'];p->time++;} } int match(char s[]){int len = strlen(s);node *p = &e;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return 0;p = p->next[s[i]-'a'];}return p->time; } char a[15]; int main() {e.init();while(*gets(a))add(a);while(~scanf("%s",a)){printf("%d\n",match(a));}return 0; }

總結

以上是生活随笔為你收集整理的Trie总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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