详解字典树Trie结构及其Python代码实现


Posted in Python onJune 03, 2016

字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不过 Trie 的 key 只能是字符串。
Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关。Hash 表号称是 O(1) 的,但在计算 hash 的时候就肯定会是 O(k) ,而且还有碰撞之类的问题;Trie 的缺点是空间消耗很高。
至于Trie树的实现,可以用数组,也可以用指针动态分配,我做题时为了方便就用了数组,静态分配空间。
Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
Trie树中每个单词都是通过character by character方法进行存储,相同前缀单词共享前缀节点.
可以看到,每条路径组成一个单词.上面这颗树存了to/tea/ted/ten/inn这些词.

Trie树的基本性质可以归纳为:
(1)根节点不包含字符,除根节点意外每个节点只包含一个字符。
(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3)每个节点的所有子节点包含的字符串不相同。

性质
(1)根节点不包含字符,除根节点外的每个节点只包含一个字符。
(2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3)每个节点的所有子节点包含的字符串不相同。

基本思想(以字母树为例):
1、插入过程
对于一个单词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走,直到单词遍历完,将最后的节点标记为红色,表示该单词已插入Trie树。
2、查询过程
同样的,从根开始按照单词的字母顺序向下遍历trie树,一旦发现某个节点标记不存在或者单词遍历完成而最后的节点未标记为红色,则表示该单词不存在,若最后的节点标记为红色,表示该单词存在。

应用
(1)词频统计
比直接用hash节省空间
(2)搜索提示
输入前缀的时候提示可以构成的词
(3)作为辅助结构
如后缀树,AC自动机等的辅助结构

实现
虽然Python没有指针,但是可以用嵌套字典来实现树结构.对于非ascii的单词,统一用unicode编码来插入与搜索.

#coding=utf-8 
class Trie: 
  root = {} 
  END = '/' 
  def add(self, word): 
    #从根节点遍历单词,char by char,如果不存在则新增,最后加上一个单词结束标志 
    node = self.root 
    for c in word: 
      node=node.setdefault(c,{}) 
    node[self.END] = None 
 
  def find(self, word): 
    node = self.root 
    for c in word: 
      if c not in node: 
        return False 
      node = node[c] 
    return self.END in node
Python 相关文章推荐
Python+selenium 获取一组元素属性值的实例
Jun 22 Python
把pandas转换int型为str型的方法
Jan 29 Python
python实现画循环圆
Nov 23 Python
Python线程条件变量Condition原理解析
Jan 20 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
Keras实现支持masking的Flatten层代码
Jun 16 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
python利用pandas分析学生期末成绩实例代码
Jul 09 Python
Python Matplotlib绘制条形图的全过程
Oct 24 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 #Python
Python中的descriptor描述器简明使用指南
Jun 02 #Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 #Python
深入理解Python变量与常量
Jun 02 #Python
Python中的Descriptor描述符学习教程
Jun 02 #Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 #Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 #Python
You might like
PHP中的traits简单使用实例
2015/05/13 PHP
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
决策树的python实现方法
2014/11/18 Python
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python实现把数字转换成中文
2015/06/29 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
详解python运行三种方式
2019/05/13 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Python如何输出整数
2020/06/07 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers