详解字典树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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
Python环境变量设置方法
Aug 28 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
Python方法的延迟加载的示例代码
Dec 18 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 Python
python链表类中获取元素实例方法
Feb 23 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 开发工具
2006/12/06 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
python文件操作整理汇总
2014/10/21 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
教学大赛获奖感言
2014/01/15 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
利用python进行数据加载
2021/06/20 Python
详细分析PHP7与PHP5区别
2021/06/26 PHP
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript