hdu 1251 trie
生活随笔
收集整理的這篇文章主要介紹了
hdu 1251 trie
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
字典樹(Trie樹)
字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,典型應用是用于統計,排序和保存大量的字符串,所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:利用字符串的公共前綴來節約存儲空間,最大限度的減少無謂的字符串比較,查詢效率比哈希表高。
1. 從根節點開始一次搜索
2. 取得要查找關鍵詞的第一個字母,并根據該字母選擇對應的子樹并轉到該子樹繼續進行檢索
3. 在相應的子樹上,取得要查找關鍵詞的第二個字母,并進一步選擇對應的子樹進行檢索
4. 迭代過程...
5. 在某個節點處,關鍵詞的所有字母已被取出,則讀取附在該節點上的信息,即完成查找
字典樹的應用
1.字典樹在串的快速檢索中的應用。
給出N個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。
在這道題中,我們可以用數組枚舉,用哈希,用字典樹,先把熟詞建一棵樹,然后讀入文章進行比較,這種方法效率是比較高的。
2. 字典樹在“串”排序方面的應用
給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出
用字典樹進行排序,采用數組的方式創建字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可
3. 字典樹在最長公共前綴問題的應用
對所有串建立字典樹,對于兩個串的最長公共前綴的長度即他們所在的結點的公共祖先個數,于是,問題就轉化為最近公共祖先問題。
#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<stack> using namespace std;struct trie {struct trie *child[26];int n; }; struct trie *root;void insert(char *source) {int i,j;int len;struct trie *current,*newnode;len=strlen(source);current=root;for(i=0;i<len;i++){if(current->child[source[i]-'a']!=0){current=current->child[source[i]-'a'];current->n++;}else{newnode=(struct trie *)malloc(sizeof(struct trie));for(j=0;j<26;j++) newnode->child[j]=0;current->child[source[i]-'a']=newnode;current=newnode;current->n=1;}} }int search(char *source) {int i;int len;struct trie *current;len=strlen(source);if(len==0) return 0;current=root;for(i=0;i<len;i++){if(current->child[source[i]-'a']!=0){current=current->child[source[i]-'a'];}else return 0;}return current->n; } /* int Delete(char *source) {stack<struct trie *> q;int i;int len;struct trie *current;len=strlen(source);if(len==0) return 0;current=root;for(i=0;i<len;i++){if(current->child[source[i]-'a']!=0){q.push(current->child[source[i]-'a']);}else return 0;}while(!q.empty()){} } */ int main() {char str[20];int i;root=(struct trie *)malloc(sizeof(struct trie));for(i=0;i<26;i++) root->child[i]=0;root->n=0;while(gets(str),strcmp(str,"")!=0){insert(str);}while(gets(str)){printf("%d\n",search(str));} }
它有三個基本性質,根節點不包含字符,除根節點外每一個節點都只包含一個字符,從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串,每個節點的所有子節點包含的字符都不相同。
字典樹的插入,刪除和查找都非常簡單,用一個一重循環即可。
1. 從根節點開始一次搜索
2. 取得要查找關鍵詞的第一個字母,并根據該字母選擇對應的子樹并轉到該子樹繼續進行檢索
3. 在相應的子樹上,取得要查找關鍵詞的第二個字母,并進一步選擇對應的子樹進行檢索
4. 迭代過程...
5. 在某個節點處,關鍵詞的所有字母已被取出,則讀取附在該節點上的信息,即完成查找
字典樹的應用
1.字典樹在串的快速檢索中的應用。
給出N個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。
在這道題中,我們可以用數組枚舉,用哈希,用字典樹,先把熟詞建一棵樹,然后讀入文章進行比較,這種方法效率是比較高的。
2. 字典樹在“串”排序方面的應用
給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出
用字典樹進行排序,采用數組的方式創建字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可
3. 字典樹在最長公共前綴問題的應用
對所有串建立字典樹,對于兩個串的最長公共前綴的長度即他們所在的結點的公共祖先個數,于是,問題就轉化為最近公共祖先問題。
?
字典樹的基本功能是用來查詢某個單詞(前綴)在所有單詞中出現次數的一種數據結構,它的插入和查詢復雜度都為O(len),Len為單詞(前綴)長度,但是它的空間復雜度卻非常高,如果字符集是26個字母,那每個節點的度就有26個,典型的以空間換時間結構。?#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<stack> using namespace std;struct trie {struct trie *child[26];int n; }; struct trie *root;void insert(char *source) {int i,j;int len;struct trie *current,*newnode;len=strlen(source);current=root;for(i=0;i<len;i++){if(current->child[source[i]-'a']!=0){current=current->child[source[i]-'a'];current->n++;}else{newnode=(struct trie *)malloc(sizeof(struct trie));for(j=0;j<26;j++) newnode->child[j]=0;current->child[source[i]-'a']=newnode;current=newnode;current->n=1;}} }int search(char *source) {int i;int len;struct trie *current;len=strlen(source);if(len==0) return 0;current=root;for(i=0;i<len;i++){if(current->child[source[i]-'a']!=0){current=current->child[source[i]-'a'];}else return 0;}return current->n; } /* int Delete(char *source) {stack<struct trie *> q;int i;int len;struct trie *current;len=strlen(source);if(len==0) return 0;current=root;for(i=0;i<len;i++){if(current->child[source[i]-'a']!=0){q.push(current->child[source[i]-'a']);}else return 0;}while(!q.empty()){} } */ int main() {char str[20];int i;root=(struct trie *)malloc(sizeof(struct trie));for(i=0;i<26;i++) root->child[i]=0;root->n=0;while(gets(str),strcmp(str,"")!=0){insert(str);}while(gets(str)){printf("%d\n",search(str));} }
總結
以上是生活随笔為你收集整理的hdu 1251 trie的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 3666 THE MATRIX
- 下一篇: hdu 3006 位运算