详解字典树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 字符串格式化输出(format/printf)
Jul 21 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
Python使用wxPython实现计算器
Jan 30 Python
python实现批量解析邮件并下载附件
Jun 19 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
PyQt5 多窗口连接实例
Jun 19 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
python集合常见运算案例解析
Oct 17 Python
python 读取更新中的log 或其它文本方式
Dec 24 Python
python给list排序的简单方法
Dec 10 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 Smarty date_format [格式化时间日期]
2010/03/15 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
考试没考好检讨书
2014/01/31 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
迎国庆演讲稿
2014/09/15 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
电影红河谷观后感
2015/06/11 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android