字典树详解----串查找、排序、公共前缀之杀手锏
来源:互联网 发布:淘宝美工助理激活卡号 编辑:程序博客网 时间:2024/05/17 05:53
1、字典树
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变形。典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是利用最大公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
2、性质
- 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符;
- 从根节点到某一节点,路径上经过的字符串连接起来,为该节点对应的字符串;
- 每个节点的所有子节点包含的字符都不相同。
3、实现方法
搜索字典项目的方法:
- 从根节点开始一次搜索;
- 取得要查找关键词的第一个字母,并根据该字母选择对应的子树继续进行检索;
- 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索
- 迭代下去
- 在某个结点处,关键词的所在字母已被取出,则读取附在该结点上的信息,即完成查找。
4、应用
(1)串的快速检索
给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
方法1:可以将英文文章中的所有单词逐个与熟词表进行比较,O(N)=O(n*avg(length1)*N*avg(length2)) = O(n*N)
方法2:采用hash表,
方法3:采用字典树,将该熟词表构成字典树,然后通过字典树进行查找。建树的时间复杂度:O(n) = O(N),查找的时间复杂度,只和树的深度相关,而与熟词表中有多少个单词无关,树的深度又与单词的长度有关,而单词最长不过30个字符,因此O(N)=O(1);另外在空间复杂度上又优于其他的算法,由于公共前缀的存在,不需要大量存储重复的字符。
(2)串的排序
给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出。
用字典树进行排序,采用数组的方式创建字典树,因为树的每个结点的所有子结点很显然是按照其字母大小排序的,那么对待这棵树进行先序遍历即可。
(3)最长公共前缀
对所有串建立字典树
字典树的代码:
#define MAX 10typedef struct Trie{int v; //用于存储当前结点的公共前缀的字符串数目Trie *next[MAX]; //用于存储当前结点的子节点数组}Trie;Trie *root = NULL;void createTrie(char *str){int length = strlen(str);Trie *p = root, *q;for(int i = 0;i<length;i++){int id = str[i]-'0';if(p->next[id] == NULL){q = new Trie;q->v = 1;for(int j = 0;j<MAX;j++)q->next[j] = NULL;p->next[id] = q;p = p->next[id];}else{p->v++;p = p->next[id];}}p->v = -1;}int FindTrie(char *str){int length = strlen(str);Trie *p = root;for(int i = 0 ;i<length;i++){int id = str[i] - '0';p = p->next[id];if(p == NULL)return 0; //即该字符串不在此树上if(p->v = -1)return -1;//说明字典树中已经存在这样的字符串是str的前缀}return 1;//说明str是字典树中某字符串的前缀}
0 0
- 字典树详解----串查找、排序、公共前缀之杀手锏
- 查找字典中某个公共前缀的所有单词
- 查找字典中具有某个公共前缀的所有单词
- hdu-1251 字典树公共前缀。
- HDU 1671 字典树 查找前缀
- POJ 3630 Phone List(字典树,公共前缀问题)
- hdu1251 字典树的应用(查询公共前缀)
- LeetCode14. Longest Common Prefix(字典树:最长公共前缀)
- 字典树(Trie树、单词查找树、前缀树)
- 查找字符串数组的最大公共前缀
- lintcode之最长公共前缀
- Trie树(字典树,前缀树,键树)分析详解
- poj2503-字典树&&二分查找&&快速排序
- 常用算法之Trie【字典树,前缀树】
- 最长公共前缀子串
- 利用字典树查找唯一标记某单词的最小前缀
- 字典树(前缀树)
- 【字典树】串集合查找
- datediff()统计两个日期时间段之间的间隔
- apchae commons-validator 初体验
- 谈谈使用VFW在windows下编程控制摄像头(二)
- 四元数与复数
- 算法总结
- 字典树详解----串查找、排序、公共前缀之杀手锏
- JQuery操作单选,复选,下拉框
- c++ 打印堆栈信息
- jQuery 一些方法技巧
- 数据库row_number()的简单用法
- 视频运行库AVICAP32.DLL常用函数列表
- iframe嵌套跳转,刷新,表单提交
- 好记性不如烂笔头——垃圾回收
- PostgreSQL:pgloader导入导出处理重复数据简单示例