特别声明:

  博文主要是学习过程中的知识整理,以便之后的查阅回顾。部分内容来源于网络(如有摘录未标注请指出)。内容如有差错,也欢迎指正!

系列文章:

1. 字典树Trie学习一:原理解析

2.字典树Trie学习二:Java实现方式之一

一、基本概念(来源于网络)

Trie树又称字典树、单词查找树、前缀树等,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

  优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

  缺点:基于空间换时间的思想,所以系统中若存在大量的没有公共前缀的字符串则会消耗大量内存。(使用左儿子右兄弟的方法建树的话,可能相对会好一些,有兴趣的小伙伴可以自己研究下。)

核心思想:空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

三个特性:

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

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

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

  例:and, as, at, cn, com构建的Trie树如下,

二、Trie树的基本操作

  假设存在字符串str,Trie树的根结点为root,i=0,p=root

  1.插入

    1)取str[i],判断p->next[str[i]-'a']是否为空,若为空,则建立结点temp,并将p->next[str[i]-‘a’]指向temp,然后p指向temp;若不为空,则p=p->next[str[i]-'a'];
    2)i++,继续取str[i],循环1)中的操作,直到遇到结束符'\0',此时将当前结点p中的isStr置为true。
 
  2.查找  
    1)取str[i],判断判断p->next[str[i]-‘a’]是否为空,若为空,则返回false;若不为空,则p=p->next[str[i]-'a'],继续取字符。
    2)重复1)中的操作直到遇到结束符'\0',若当前结点p不为空并且isStr为true,则返回true,否则返回false。
 

  3.删除

    可以递归删除整棵树

三、Trie树的复杂度

  1. 插入、查找的时间复杂度均为O(N), N为字符串的长度。

  2.英文字符为例,空间复杂度是26^n, 可采用<双数组实现>来改善。

四、Trie树的应用场景

1.字符串检索、词频统计

将已知的一些字符串(字典)的有关信息实现保存到trie树里,查找另外一些未知字符串是否出现过或者出现频率。

例如:

将要匹配词作为词典,再给出一段文本或者文章。匹配判断文本或文章中是否存在词典中的词。

2.字符串最长公共前缀

Trie树利用多个字符串的公共前缀来节省存储空间,反之,当我们把大量字符串存储到一棵trie树上时,我们可以快速得到某些字符串的公共前缀。

3.排序

只要先序遍历整棵树,输出相应的字符串便是按字典排序的结果

参考:

数据结构之Trie

最新文章

  1. WPF入门:数据绑定
  2. EXCEL中多级分类汇总空白字段填充
  3. Glacierskating测试记录
  4. 【微服务】SpringBoot、SpringCloud相关
  5. C#编程利器之三:接口(Interface)【转】
  6. Apache开启rewrite
  7. php 图形验证码的3种方法
  8. WINAPI 变量(2861个)
  9. [Effective C++ --012]复制对象时勿忘其每一个成分
  10. iOS arc下控制某一文件为非arc
  11. mysql @value := 用法
  12. Java基础语法(一)---关键字、常量、变量、运算符
  13. Python学习札记-eval函数
  14. Node.js 虚拟机
  15. 分享一些 Windows 平台上的神器
  16. vue 组件复用不刷新
  17. 查看那些进程使用了swap
  18. MySQL数据库-pymysql模块操作数据库
  19. 用Web Services来整合.NET和J2EE
  20. asp.net 中日期的格式化显示的方法

热门文章

  1. 渗透日常之 花式实战助你理解CSRF
  2. sublime text 显示 typescript高亮
  3. django入门-初窥门径-part1
  4. [flex] as3.0 实现基于air的简单浏览器
  5. mxonline实战12, 课程评论,相关课程推荐,课程视频页
  6. Jmeter中一些概念的理解——90%响应时间、事务、并发
  7. JavaScript的几种(原型)继承
  8. spring中scope的prototype与singleton区别
  9. K8s的POD连接数据库时报错
  10. c常用函数