详解字典树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写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
Python集合操作方法详解
Feb 09 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
Django启动时找不到mysqlclient问题解决方案
Nov 11 Python
python实现PolynomialFeatures多项式的方法
Jan 06 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 for 循环使用的简单实例
2016/06/02 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
jquery异步调用页面后台方法‏(asp.net)
2011/03/01 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
利用python开发app实战的方法
2019/07/09 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
linux比较文件内容的命令是什么
2015/09/23 面试题
毕业自我评价范文
2013/11/17 职场文书
自我鉴定写作要点
2014/01/17 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
护士旷工检讨书
2015/08/15 职场文书