您的位置:首页 > 理论基础 > 数据结构算法

数据结构-Trie树

2016-04-30 14:22 302 查看
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

它有3个基本性质:

根节点不包含字符,除根节点外每一个节点都只包含一个字符; 

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;

 每个节点的所有子节点包含的字符都不相同。


串的快速检索

给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。

在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。


“串”排序

给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出

用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。


b07d

最长公共前缀

对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为当时公共祖先问题。
代码实现:

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define in(a) scanf("%d",&a)
#define mm(a,b) memset(a,b,sizeof(a))
#define out(a) printf("%d")
#define MOD =1e9+7
#define ll long long
#define INF 0x3f3f3f3f
#define FOR(i,l,r) for(int i=l;i<=r;i++)

typedef struct Trie_node
{
struct Trie_node* next[26];
bool exist;
}TrieNode,*Trie;

TrieNode* createTrieNode()
{
TrieNode * node=(TrieNode *)malloc(sizeof(Trie_node));
node->exist=false;
memset(node->next,0,sizeof(node->next));
return node;
}
void Trie_insert(Trie root,char *word)
{
Trie node=root;
char *p=word;
int id;
while( *p )
{
id=*p-'a';
if(node->next[id] == NULL)
{
node->next[id]=createTrieNode();
}
node=node->next[id];
++p;
}
node->exist=true;
}
bool Trie_search(Trie root,char *word)
{
Trie node=root;
char *p=word;
int id;
while(*p)
{
id=*p-'a';
if(node->next[id]==NULL)
return false;
node=node->next[id];
++p;
}
if(node->exist)
return true;
else return false;
}

int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
Trie root=createTrieNode();
char str1[10],str2[10];
for(int i=0;i<n;i++)
{
scanf("%s",str1);
Trie_insert(root,str1);
}
for(int i=0;i<m;i++)
{
scanf("%s",str2);
if(Trie_search(root,str2))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: