- 6
- 0
- 约3.43千字
- 约 7页
- 2018-03-28 发布于河南
- 举报
字典树及应用
Trie树(字典树)
Trie树就是字符树,其核心思想就是空间换时间。
举个简单的例子。
给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。
这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。
现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c,d,f之类开头的我显然不必考虑。而只要找以a开头的中是否存在abcd就可以了。同样的,在以a开头中的单词中,我们只要考虑以b作为第二个字母的……这样一个树的模型就渐渐清晰了……
假设有b,abc,abd,bcd,abcd,efg,hii这6个单词,我们构建的树就是这样的。
对于每一个节点,从根遍历到他的过程就是一个单词,如果这个节点被标记为红色,就表示这个单词存在,否则不存在。
那么,对于一个单词,我只要顺着他从跟走到对应的节点,再看这个节点是否被标记为红色就可以知道它是否出现过了。把这个节点标记为红色,就相当于插入了这个单词。
这样一来我们询问和插入可以一起完成,所用时间仅仅为单词长度,在这一个样例,便是10。
我们可以看到,trie树每一层的节点数是26^i级别的。所以为了节省空间。我们用动态链表,或者用数组来模拟动态。空间的花费,不会超过单词数×单词长度。
由字母a~z所组成的字符串的一个集合中,各个字符的长度之和为n。设计一个O(n)时间的算法,将这个集合中所有字符串依字典进行排序。注意,这里可能存在非常长的字符串。#include stdio.h#include malloc.htypedef struct tire{ struct tire *next[26]; char date; int cnt;}*_tire;void init_tire(_tire root, char *string){ _tire s; s=root; while(*string!=\0) { if(s-next[*string - a]==NULL) { s-next[*string - a] = (_tire)malloc(sizeof(struct tire)); (s-next[*string - a])-date = *string; s = s-next[*string - a]; for(int i=0;i26;i++) { s-next[i] = NULL; } } else { s = s-next[*string - a]; } string++; } s-cnt=1;}void print(_tire root, char *s, int i){ int j; s[i] = root-date; if(root-cnt==1) { s[i+1] = 0; puts(s); } for(j=0;j26;j++) { if(root-next[j]!=NULL) { print(root-next[j],s,i+1); } }}int main(){ _tire root; int m,i; char s[265]; root = (_tire)malloc(sizeof(struct tire)); puts(输入字符串个数:); for(i=0;i26;i++) { root-next[i]=NULL; } scanf(%d,m); getchar(); while(m--) { gets(s); init_tire(root,s); } puts(\n依字典排序后:); for(i=0;i26
您可能关注的文档
- 异地恋的写照.doc
- 吴日忠科研训练.doc
- DS5020配置详解.doc
- 经销商销售合同代理商销售合同.doc
- 德国矩陈夹具.doc
- 控规教材电子版10-附表.doc
- 办公室6S课题报告.ppt
- 差异性(新).ppt
- 思科网络课程设计2.doc
- 2010年小学毕业班质量检测.doc
- 25-26学年政治(部编版)选择性必修第二册课件:第1单元 周清1 民法中的人身权及财产权.pptx
- 25-26学年政治(部编版)选择性必修第二册课件:1.4.1 权利保障 于法有据.pptx
- 2025北京丰台区高二(上)期中地理(A卷)含答案.docx
- 2025北京三帆中学初三(上)开学考英语试题含答案.docx
- 2025北京一零一中初三9月月考语文试题含答案.docx
- 2025北京海淀区初三(上)期中道法试题含答案.docx
- 2025北京丰台区高一(上)期中政治(A卷)含答案.docx
- 25-26学年政治统编版必修4课件:3.3 唯物辩证法的实质与核心.pptx
- 25-26学年政治统编版必修4课件:7.2 正确认识中华传统文化.pptx
- 湖北省部分高中2026届高三上学期二模联考 历史试卷.docx
最近下载
- 卧床病人翻身拍背操作规范.pptx VIP
- 对口畜牧单招题库及答案.doc VIP
- 2025-2026学年道法统编版小学五年级全册必背知识点归纳.docx VIP
- 2024-2025学年上海市静安区六年级上学期期末考试英语试卷含详解.pdf VIP
- 学堂在线 雨课堂 学堂云 工程伦理2.0 章节测试答案.docx VIP
- 《穿戴甲》标准文本.docx VIP
- 山东省潍坊市高密市2024-2025学年六年级上学期期末语文试题.docx VIP
- 学堂在线 雨课堂 学堂云 大数据机器学习 章节测试答案.docx VIP
- 代购走私责任边界.docx VIP
- 2022年人教部编版三年级语文上册期末考试卷及答案【真题】.doc VIP
原创力文档

文档评论(0)