字典樹學習總結

2021-09-10 02:13:22 字數 2876 閱讀 7173

字串的多模匹配,kmp,字典樹,ac自動機,現在學習字典樹;

字典樹又稱為單詞查詢樹,用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻的統計。優點是利用字串的公共字首來減少查詢時間,最大限度減少無畏字串比較,查詢效率比雜湊樹高。

其實字典樹就是dfa!!,每層是乙個狀態,只不過我覺得這棵樹的空間利用率不高罷了(hdu1251,g++mle怨念ing)。

1.根節點不包含字元,根節點外每個節點都只包含乙個字元

2.根節點到某一節點上,路徑上經過的字元拼接起來,為該節點對應的字串;

3.每個節點的所有子節點包含的字元都不相同。

基本操作:查詢,插入,刪除(少見)

1.從根節點開始一次搜尋。

2.取得要查詢關鍵字的第乙個字母,並根據該字母選擇對應的子樹並轉到該子樹進行檢索

4.迭代

2. 串的排序:給定n個互不相同的僅有乙個單詞構成的英文名,讓你將他們安字典序大小,從小到大輸出。用字典樹進行排序,採用陣列的方式建立建立字典樹,這棵樹的每個節點的所有子節點很顯然按照其字母大小排序,對這棵樹進行先序遍歷即可。

3.最長公共字首:對所有串建立字典樹,對於兩個串的最長公共字首的長度,即他們所在節點的公共祖先個數,於是,問題轉外化為當時公共祖先問題。

4.學習自動機的熱身

首先是乙個板子:

//#pragma comment(linker, "/stack:1024000000,1024000000")

#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define pair pair//#define max(a,b) (a)>(b)?(a):(b)

//#define min(a,b) (a)<(b)?(a):(b)

#define clean(a,b) memset(a,b,sizeof(a))// 水印

//std::ios::sync_with_stdio(false);

// register

const int maxn=1e3+10;

const int inf32=0x3f3f3f3f;

const ll inf64=0x3f3f3f3f3f3f3f3f;

const ll mod=1e9+7;

const double pi=acos(-1.0);

//---------------------------

const int maxn=26;//假設只有小寫字母

const int maxm=1e5+10;

struct treenodehead;

for(int i='a';i<='z';++i)

}void init_trie()

return newnode;

}void updata(char *s,int num)

t->count+=num;//以該字串為前驅的再加num個。

}int search(char *s,int num)

//這裡只是單純的查詢字串s,後面不能多,前面不能少。

int snum=t->count;//最後存在的 個數

for(int i=0;inext[i])

} if(snum>=num)

return 0;

}void erase(char *s,int num)

t=t->next[temp];

k++;

} while(s[k])

free(t1);

}char temp[1000];

void printall(treenode* tnode,int pos)

for(int i=0;i>oper)

else if(oper==2)

else }

} /*12

21add 143

4*/

然後在hdu上找了個板子題:hdu-1251-統計難題:

直接ac:

const int maxn=28;

const int inf32=0x3f3f3f3f;

const ll inf64=0x3f3f3f3f3f3f3f3f;

const ll mod=1e9+7;

const double pi=acos(-1.0);

//---------------------------

struct nodetree;

void intt()

t->nxt[s[k]-'a']=p;

} t=t->nxt[s[k]-'a'];

++k;

} t->count++;

}int query(char *s)

return t->count;

}int main()

}}root;

void insert(string s1,string s2)

t=t->nxt[s1[i]-'a'];

} t->vis=1;t->word=s2;

}string find(string s)

string res="";

if(t->vis==1)

return res;

}int main()

char ch=getchar();//我在這個地方加乙個換行

char s[3100]=;

while(gets(s))

e+=s[k++];

} cout<}}

字典樹學習總結

解決問題 主要應對多次查詢,典例就是字典,字典樹就是一本字典,字典的最大好處就是能快速查詢 主要原理 我們在查某乙個單詞時總會先索引第乙個字母,然後在查第二個字母,以此類推直到查到此單詞為止,那麼字典樹的查詢過程也是如此,先查第乙個字母的節點位置,然後在該節點的子節點之中查詢第二個字母的位置,以此類...

trie樹學習總結(字典樹模板)

trie樹 演算法簡介 字典樹,也叫trie樹,是一種比較實用的資料結構,無論是在acm競賽的題目中,還是字串相關的某些實際應用領域內,它都能發揮巨大的作用。首先來看看字典樹的本質是什麼。它其實是一棵儲存了很多字串的樹,這棵樹上的每一條邊就是某個或某些字串中的乙個字元,而從根節點到某乙個特定節點所經...

蒟蒻 字典樹學習總結

又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。根節點不包含字元,除根節點外每乙個節點都只...