trie 字典树 (前缀树)

什么是字典树

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

字典树的优点

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

字典树的性质

它有3个基本性质:

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

  1. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
  2. 每个节点的所有子节点包含的字符都不相同。

实现方法

搜索字典项目的方法为:

(1) 从根结点开始一次搜索;

(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

(4) 迭代过程……

(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

其他操作类似处理

树的构建

举个例子,如下:
  题目:给你100000个长度不超过10的单词。对于每一个单词,我们要判断它是否出现过,如果出现过,求得第一次出现的位置。
  如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n2 )。显对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c,d,f之类开头的我显然不必考虑。而只要找以a开头的中是否存在abcd就可以了。同样的,在以a开头中的单词中,我们只要考虑以b作为第二个字母的,一次次缩小范围和提高针对性,这样一个树的模型就渐渐清晰了。
  好比假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,我们构建的树就是如下图这样的:

三:查询

  Trie树是简单但实用的数据结构,通常用于实现字典查询。我们做即时响应用户输入的AJAX搜索框时,就是Trie开始。本质上,Trie是一颗存储多个字符串的树。相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串。和普通树不同的地方是,相同的字符串前缀共享同一条分支。下面,再举一个例子。给出一组单词,inn, int, at, age, adv, ant, 我们可以得到下面的Trie:

可以看出:
  每条边对应一个字母。
  每个节点对应一项前缀。叶节点对应最长前缀,即单词本身。
  单词inn与单词int有共同的前缀“in”, 因此他们共享左边的一条分支,root->i->in。同理,ate, age, adv, 和ant共享前缀"a",所以他们共享从根节点到节点"a"的边。

  查询操纵非常简单。比如要查找int,顺着路径i -> in -> int就找到了。

  搭建Trie的基本算法也很简单,无非是逐一把每则单词的每个字母插入Trie。插入前先看前缀是否存在。如果存在,就共享,否则创建对应的节点和边。比如要插入单词add,就有下面几步:
  1. 考察前缀"a",发现边a已经存在。于是顺着边a走到节点a。
  2. 考察剩下的字符串"dd"的前缀"d",发现从节点a出发,已经有边d存在。于是顺着边d走到节点ad
  3. 考察最后一个字符"d",这下从节点ad出发没有边d了,于是创建节点ad的子节点add,并把边ad->add标记为d。

五:Trie树的应用

第一:词频统计;第二: 前缀匹配;第三:去重

  适用范围:数据量大,重复多,但是数据种类小可以放入内存
  基本原理及要点:实现方式,节点孩子的表示方式
  扩展:压缩实现。

代码实现:

python

class TrieNode:def __init__(self):self.data = {}self.is_word = Falseclass Trie:def __init__(self):self.root = TrieNode()def insert(self,word):node = self.root # 插入结点时从根节点开始判断,根节点是一个空字典for char in word:child = node.data.get(char)if not child: # 如果当前结点没有该元素,则增加结点node.data[char] = TrieNode() # 本级字典添加新字典node = node.data[char] # 判断结点下移node.is_word = Truedef search(self,word):node = self.rootfor char in word:node = node.data.get(char)if not node:return Falsereturn node.is_word # 判断单词是否是完整的存在trie树中,存在返回 True,不存在返回Falsedef startsWith(self,prefix):node = self.rootfor char in prefix:node = node.data.get(char)if not node:return Falsereturn Trueif __name__ == '__main__':trie = Trie()trie.insert("cook")# print(trie)# print(trie.insert('cake'))

字典树实现_trie 字典树的实现方法相关推荐

  1. 前缀树(字典树,单词查找树,Trie树)

    参考网址:https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 概述 前缀树又名字典树,单词查找树,Tri ...

  2. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  3. 字典树(单词查找树、Trie)

    文章目录 单词查找树 1 基本概念 2 字典树的应用 3 字典树基本操作的实现 4 参考资料 单词查找树 1 基本概念   百度百科对字典树的介绍为:是一种树形结构,是一种哈希树的变种.   < ...

  4. 【字典树】2828 - 字典树

    字典树 先上个定义. 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是 ...

  5. 字典树(Trie/前缀树)

    目录 字典树的概念 字典树的逻辑 字典树的实现 易混点剖析 代码示例 字典树的概念 字典树(Trie)是一种空间换时间的数据结构,是一棵关于"字典"的树.主要用于统计.排序和保存大 ...

  6. 字符串处理【字典树】 - 原理 字典树详解

    字符串处理[字典树] - 原理 字典树详解 字典树,又称Trie树.单词查找树,是一种树形结构,也是哈希树的一种变种,主要用于统计.排序和存储大量的字符串(但不限于字符串),所以经常被搜索引擎系统用于 ...

  7. 字典树,01字典树,可持续化01字典树(总结+例题)

    目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...

  8. 字典树 与 01字典树

    字典树可以降低空间复杂度:01字典树可以降低时间复杂度. 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经 ...

  9. 字典树01字典树专题对字典树的理解

    对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...

最新文章

  1. oracle的cursor的介绍
  2. android volley http请求框架
  3. SAP OData service的执行是如何从Gateway系统转交到backend系统
  4. C语言中的位域的使用
  5. Linux网络编程 | socket选项设定 及 网络信息API
  6. 无法从服务器获得响应,什么是java.io.EOFException的,消息:无法从服务器读取响应。 预期读4个字节,...
  7. 发那科机器人点位编辑_发那科机器人指令编辑大全
  8. python移动文件(非文件夹)
  9. JavaScript基础知识总结(6张思维导图)
  10. 怎么在国内创建谷歌账号_如何在Google Wifi上创建和使用家庭标签
  11. 不知道这些你就OUT了,2019年最常见又实用的Android开发面试题
  12. java内存泄露 垃圾回收_Java中内存泄露及垃圾回收机制
  13. 基于R语言的量表网络分析笔记
  14. 软件项目投标标书规范格式
  15. SpringBoot整合Redis实现优惠券秒杀服务(笔记+优化思路版)
  16. 404-Thenbsp;requestednbsp;reso…
  17. 探索鼎龙湾德萨斯牛仔小镇,欣赏粤西非遗文化的魅力
  18. 如何在A4纸上打印标签
  19. 连接共享打印机提示【操作失败,错误为0x0000011b】
  20. RESTFUL概念,什么是RESTFUL

热门文章

  1. mongodb mapreduce用法
  2. Android推送分析
  3. Texture block combine command 纹理块合并命令
  4. Flash捕神--swf seeker 下载试用版
  5. 升级到ASP.NET2.0之后的疑问
  6. UVA11424 GCD - Extreme (I)【欧拉函数打表】
  7. CCF NOI1013 识别三角形
  8. 屈原的《离骚》《天问》《九歌》《楚辞》
  9. LaTex 加粗(加黑)的方式
  10. 数学概念的提出(一) —— 熵的定义式 H(x)=-log2(p(x))