详解字典树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中for循环的使用方法
May 14 Python
解密Python中的描述符(descriptor)
Jun 03 Python
python清除字符串里非字母字符的方法
Jul 02 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
Python学习思维导图(必看篇)
Jun 26 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
Python转换itertools.chain对象为数组的方法
Feb 07 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
apache配置虚拟主机的方法详解
2013/06/17 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
jQuery的三种$()
2009/12/30 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
JS实现吸顶特效
2020/01/08 Javascript
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
python 读取文件并替换字段的实例
2018/07/12 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
中科创达面试题
2016/12/28 面试题
法学专业个人求职信
2013/09/26 职场文书
借款担保书范文
2014/05/13 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
党员个人整改措施
2014/10/24 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL