详解字典树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网络爬虫采集联想词示例
Feb 11 Python
Python+django实现文件上传
Jan 17 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
详解python配置虚拟环境
Apr 08 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
python实现接口并发测试脚本
Jun 25 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 Python
Python新手学习raise用法
Jun 03 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
zf框架的校验器InArray使用示例
2014/03/13 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
php7性能提升的原因详解
2019/10/13 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
输入框过滤非数字的js代码
2014/09/18 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
python 中的int()函数怎么用
2017/10/17 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Django 解决由save方法引发的错误
2020/05/21 Python
学python最电脑配置有要求么
2020/07/05 Python
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
护理专业毕业生自我鉴定
2013/10/08 职场文书
环境工程专业个人求职信
2013/12/05 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
php访问对象中的成员的实例方法
2021/11/17 PHP
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android