详解字典树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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
python刷投票的脚本实现代码
Nov 08 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
python实现嵌套列表平铺的两种方法
Nov 08 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Python进度条的使用
May 17 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/10/09 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
JQuery 风格的HTML文本转义
2009/07/01 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
解密Python中的描述符(descriptor)
2015/06/03 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
python安装numpy&安装matplotlib& scipy的教程
2017/11/02 Python
python实现学生管理系统
2018/01/11 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
SQL SERVER面试资料
2013/03/30 面试题
生产车间班组长岗位职责
2014/01/06 职场文书
融资租赁计划书
2014/04/29 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
被告答辩状范文
2015/05/22 职场文书
2016党校学习心得体会
2016/01/07 职场文书
六年级作文之预言作文
2019/10/25 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python
讨论nginx location 顺序问题
2022/05/30 Servers
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python