一、诞生原因

传统字符串比较时,需要将待比较的字符串与字符串集合中每一个串进行比较,结果比较浪费时间。

Trie 树的发明就是为了解决上述问题。

二、基本信息

又称字典树,是一种树形结构,是一种哈希树的变种。

三、原理

通过树形结构,将字符串集合中各个串的前缀统一为一个,这样每次查找串时相同的前缀的串仅需要比对同一个前缀就行了。

栗子:假如字符串集合中仅仅包含 26 个英文字母并且都为小写,那么该字符串集合组成的 Trie 树的部分如下图所示:

每个节点实际上是一个包含 26 个元素的数组,数组的索引是字符的 Ascii 码值 - a 字符的 Ascii 码值的差值,栗子:b - a = 98 - 97 = 1,这样就找到了 b 元素对应的下一个节点的 a 字符元素所在的节点。

上图中每一个(子节点 n),都是包含了 26 个元素的数组,每个元素有可能有子节点,有的有可能是 null,为 null 就说明当前的字符串到此为止。

根据上述说明可以知道,Trie 树查找是十分高效的,但是建 Trie 树是比较耗费时间的,并且相当耗费内存,是一个明显以空间换时间的策略。

四、时间复杂度

  1. 建 Trie 树的过程的时间复杂度为 O(n),n 为字符串集合中所有字符的数量,即:所有的字符串长度和。

  2. 匹配字符串的时间复杂度为 O(k),k 为待匹配的字符串的长度。

五、应用场景

搜索引擎中,输入部分的字符之后其下拉列表可以显示出以当前字符串为前缀的部分完整的字符串。其原理是后台早在之前就已经创建了 Trie 树,当用户输入了部分字符串前缀时,系统直接搜索 Trie 树,到达前缀最后的节点之后,将该节点之后字符串罗列出来就完成了上述功能。

参考:极客时间《数据结构与算法之美》王争

这门课真心推荐,内容很经典、栗子很形象,里面还包含了很多面试题目。真是居家旅行必备良药。

(SAW:Game Over!)

数据结构与算法 / 字符串匹配 / Trie 树相关推荐

  1. 数据结构与算法 / 字符串匹配 / BF、PK 算法

    零.前言 为了下面便于说明,先定义两个名词,分别是主串和模式串.在字符串 A 中查找字符串 B,则 A 为主串,B 为模式串. 假设,主串中字符数量为 L1,模式串的字符数量为 L2 . 一.BF 算 ...

  2. 头歌-数据结构与算法-字符串匹配

    第1关:实现朴素的字符串匹配 #include <stdio.h> #include <stdlib.h> #include "mystr.h" #prag ...

  3. 数据结构-----基于双数组的Trie树

    Trie树简介 Trie树也称字典树,在字符串的查找中优势比较明显,适用于在海量数据中查找某个数据.因为Trie树的查找时间和数据总量没有关系,只和要查找的数据长度有关.比如搜索引擎中热度词语的统计. ...

  4. 算法学习之Trie树

    算法学习之Trie树 by MPS [定义]   trie树又名字母树,是针对字符串的匹配,查找的一种高效手段,是哈希表的一种变种,但青出于蓝胜于蓝.我这个蒟蒻也是表示啃了两天才啃出来这些皮毛,当做学 ...

  5. 数据结构与算法(C++)– 树(Tree)

    数据结构与算法(C++)– 树(Tree) 1.树的基础知识 树(tree): 一些节点的集合,可以为空集 子树(sub tree): 树的子集 根(root): 树的第一个节点 孩子和父亲(Chil ...

  6. C++KMP算法字符串匹配(附完整源码)

    C++KMP算法字符串匹配 C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) #include <iostr ...

  7. 数据结构与算法(C#实现)系列---树

    Heavenkiller(原创) 首先我们给树下一个定义: 树是一个有限的.非空的结点集, T={r} or T1 or T2 or-or Tn 它具有下列性质: 1.集合指定的结点r叫做树的根结点 ...

  8. kmp算法字符串匹配C语言实现

    kmp算法字符串匹配 在leetcode做题时,有道题就是写一个strstr函数,先用思路最简单的直接两个循环做,提示时间超过限制.就查了查kmp的资料 翻了下算法导论,感觉像在看数学书,看不太懂,最 ...

  9. 11_JavaScript数据结构与算法(十一)树

    JavaScript 数据结构与算法(十一)树 树结构 什么是树? 真实的树: 树的特点: 树一般都有一个根,连接着根的是树干: 树干会发生分叉,形成许多树枝,树枝会继续分化成更小的树枝: 树枝的最后 ...

最新文章

  1. react-navigation
  2. Python scrapy爬取京东,百度百科出现乱码,解决方案
  3. C# Winform只能输入数字的TextBox---补充
  4. 提高SQL执行性能方案:如何让你的SQL运行得更快
  5. pandas读取前几行数据_csv – 读取大pandas数据帧前几行的方法
  6. 什么是Springmvc以及如果编写第一个入门程序
  7. c语言设计通讯录管理程序,C语言程序的设计学生通讯录管理系统方案.docx
  8. android 添加桌面快捷方式
  9. @程序员,CSDN卫衣、背包、鼠标垫......福利来啦!!!
  10. 从源码分析ArrayList集合
  11. SOAPUI接口测试学习网站
  12. CSP 201903-2 二十四点 python (python有如神助)
  13. linux http error 401,出现HTTP: 401 的时候的解析思路
  14. nginx配置长链接
  15. The requested operation requires elevation问题解决
  16. python 多版本共存
  17. iOS直播类APP开发流程解析
  18. 你好,李焕英!贾玲痛哭,一句话戳痛2.3亿中国人
  19. java中accept什么意思_java – Visitor模式中`accept`方法的需要是什么
  20. 计算机三维造型 试题,2012上图杯三维建模试题要求

热门文章

  1. rhel 6下配置网络yum源(虚拟机环境下)
  2. html关于强制显示、隐藏浏览器的滚动条
  3. py-faster-rcnn GPU跑demo预测分数低
  4. 安徽省公务员计算机专业知识,安徽省公务员考试计算机专业知识编程题
  5. synchronized(xxx.class)
  6. ansible roles和django项目的整合
  7. Scriptis安装(基于Linkis开发的数据分析工具)
  8. 【视频】详解Scala中的类及与Java的详细区别
  9. ionic安装及入门示例
  10. postgresql常用数据类型:数值、日期、字符串类型