数据结构-Trie树
2016-04-30 14:22
302 查看
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
它有3个基本性质:
根节点不包含字符,除根节点外每一个节点都只包含一个字符;
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
每个节点的所有子节点包含的字符都不相同。
给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。
给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出
用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。
对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为当时公共祖先问题。
代码实现:
它有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; }
相关文章推荐
- 查找 -数据结构
- 查找 -数据结构
- 数据结构修改后,序列化到本地的数据读取错误
- 【数据结构与算法】十五 平衡二叉树
- Java千百问_06数据结构(002)_java有哪8种基本数据类型
- Java千百问_06数据结构(001)_java中数据类型是什么
- springmvc中的RequestBody自动注入List, Map, String数据结构的数据
- 链表的倒序打印
- poj 初级训练计划数据结构总结
- 一、hbase的核心数据结构
- 数据结构与算法分析(1)引论
- C语言数据结构学习网站
- hdu 4193(单调队列)
- 快速排序
- delphi.数据结构.链表
- 集合框架(用LinkedList模拟栈数据结构的集合并测试案例)
- 数据结构排序算法之归并排序
- 冒泡排序
- 希尔排序
- 数据结构之字符串ADT