这几天在看Hadoop的排序,用到了有TotalSortPartition,其中用到了一种叫做trie树的数据结构,每次看到这种自己之前没有听过的数据结构就想去看一下原理,然后再网上看几篇博客,有时间再看一下相关的论文。

trie树,又称为字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构。之前有见到过说多个字符串共用前缀可以节省内存,今天来专门来学习一下这个trie树。

trie这个单词很奇怪,其实它并不是一个独立的单词,而是来自于retrieve的中间部分,retrieve有从中检索、取回的意思。

英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。

下面直接给出一个trie的例子。

(图片来自Google)

怎么样,给出了一张图片是不是秒懂了trie树,trie树的这种共享公共前缀的方式在某些情况下可以节省很多内存空间,但是如果这些词都没有公共前缀的话,效果就不是很好了。

trie树的性质

(1)根节点不包含字符,除了根节点之外的每个节点都包含一个字符。

(2)从根节点到某一个节点,路径上经过的字符连接起来,即为该节点对应的字符串。

(3)每个节点的所有子节点包含的字符串不相同。(我感觉这条性质可以从性质一推导出来。)

trie树的基本实现

实现方法有以下几种:

1. 对每个节点开一个字符集大小的数组,对应的下标是子节点所表示字母,内容则是这个子节点在大数组上的位置;

2. 每个节点挂一个链表,按一定的规则记录每个儿子是谁;

3. 左儿子右兄弟表示法记录这棵树;(左儿子右兄弟是什么鬼?)

4. 我在想为啥不可以用树来记录这个数据结构呢,trie不是本来就是一棵树么?

trie树的高级实现

可以采用双数组(Double-Array)实现,利用双数组可以大大减少内存的使用量。

trie树的应用

字符串检索

字符串检索,事先将一些字符串(字典)的有关信息保存到trie树中,查找另外一些未知字符串是否出现或者出现的频率。

字符串的最长公共前缀

对给定字典建立trie树之后,求两个串的最长公共前缀长度是多少,就是求最多的公共祖先个数。

并查集(Disjoint Set),可以采用经典的Tarjan算法。Least Common Ancestor,LCA

求出字母树的欧拉序列(Eule Sequence),转为经典的最小值查询,Range Minimum Query,简称RMQ问题

排序

trie树是一颗多叉树,只要前序遍历整棵树,输出相应的字符串便是按字典排序的结果。

在Hadoop的TotalOrderPartitioner中的应用

Map 阶段。本阶段涉及两个组件,分别是Mapper和Partitioner。其中,Mapper 可采用 IdentityMapper,直接将输入数据输出,但 Partitioner 必须选用TotalOrderPartitioner,它将上一个步骤中获取的分割点保存到 trie 树中以便快速定位任意一个记录所在的区间,这样,每个Map Task产生R(Reduce Task个数)个区间,且区间之间有序。TotalOrderPartitioner 通过trie树查找每条记录所对应的Reduce Task编号。如图所示, 我们将分割点保存在深度为2的trie树中,假设输入数据中有两个字符串"abg"和"mnz",则字符串"abg"对应partition1,即第2个Reduce Task,字符串"mnz"对应partition3,即第4个Reduce Task。

作为其他数据结构和算法的辅助结构

后缀树,AC自动机等。

Trie树是一种非常重要的数据结构,它在信息检索,字符串匹配等领域有广泛的应用,同时,它也是很多算法和复杂数据结构的基础,如后缀树,AC自动机等,因此,掌握Trie树这种数据结构,对于一名IT人员,显得非常基础且必要!

(1)wiki:http://en.wikipedia.org/wiki/Trie

(2) 论文《浅析字母树在信息学竞赛中的应用》

(3)  论文《Trie图的构建、活用与改进》

(4)  博文《An Implementation of Double-Array Trie》:

http://linux.thai.net/~thep/datrie/datrie.html

(5) 论文《An Efficient Implementation of Trie Structures》:

http://www.google.com.hk/url?sa=t&source=web&cd=4&ved=0CDEQFjAD&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.14.8665%26rep%3Drep1%26type%3Dpdf&ei=qaehTZiyJ4u3cYuR_O4B&usg=AFQjCNF5icQbRO8_WKRd5lMh-eWFIty_fQ&sig2=xfqSGYHBKqOLXjdONIQNVw

(6)数据结构之Trie树

Trie树学习的更多相关文章

  1. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  2. Trie树学习2

    数组实现的Trie树 字符容量有限,能够使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include < ...

  3. Trie树学习1

    Trie树.也称为字典数,前缀树,每一个单词的每一个字母依照顺序相应一个节点.有重合的前缀就共享节点. 理想情况下(满的情况).假若全部的单词都是N长,则树共同拥有N层,每层都是26个子节点. 在程序 ...

  4. LeetCode 14. Longest Common Prefix字典树 trie树 学习之 公共前缀字符串

    所有字符串的公共前缀最长字符串 特点:(1)公共所有字符串前缀 (好像跟没说一样...) (2)在字典树中特点:任意从根节点触发遇见第一个分支为止的字符集合即为目标串 参考问题:https://lee ...

  5. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  6. 标准Trie字典树学习一:原理解析

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 字典树Trie学习一:原理解析 2.字典树Tr ...

  7. 字典树trie的学习与练习题

    博客详解: http://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html http://eriol.iteye.com/bl ...

  8. [学习笔记]我们追过的神奇异或(Trie树系列)

    引言 刚学了\(Trie\)树,写篇博客巩固一下. 题目 首先安利一发\(Trie\)树模板 1.Phone List 2.The XOR largest pair 3.The xor-longest ...

  9. Trie 树进阶学习笔记

    前言 没脑子选手发现自己什么都不会 ... \(\text{More and more vegetables, What should I do?}\) 正文 Trie 树简介 大概是人类的话都知道吧 ...

随机推荐

  1. sed 中如何替换换行符

    使用如下解决方案: sed ':a;N;$!ba;s/\n/ /g' 这将在一个循环里读取整个文件,然后将换行符替换成一个空格. 说明: 通过 :a创建一个标记 通过N追加当前行和下一行到模式区域 如 ...

  2. poj 2324 Anniversary party(树形DP)

    /*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...

  3. BindDepthStencilState

    nx sdk里面有这么一个接口 真坑 对于stencil fun op有两组值分别对应front back face 现在调用这个接口只能设置back 不能设置front跟了memory 有段全是0把 ...

  4. 【JUnit】Junit命令行执行、参数化执行、Main方法执行

    参考资料: main方法执行:http://stackoverflow.com/questions/2543912/how-do-i-run-junit-tests-from-inside-my-ja ...

  5. 配置多层NAT和端口映射实现外网访问内网

    配置多层NAT和端口映射实现外网访问内网 背景和原理 通过配置NAT可以实现内网中不能直接访问外网的主机通过NAT代理访问内网,配置方法这里不再赘述(前文有介绍).本文以两层的NAT代理做模拟,通过端 ...

  6. 修改PHP上传文件的大小限制(post)

    在PHP的默认配置情况下,当上传的文件大小超出一定的限制时,我们将得到如下的错误提示信息: Warning: POST Content-Length of 625523488 bytes exceed ...

  7. 转:svn 更新指定文件夹

    通常由于创建很多个branch和tag,当我们要去checkout指定tag和branch的时候,会不得不把整个branch/tag目录checkout出来.是不是有点傻??!!! 那么如何有选择ch ...

  8. Elasticsearch 的 Update更新

    Update更新操作允许ES获得某个指定的文档,可以通过脚本等操作对该文档进行更新.可以把它看成是先删除再索引的原子操作,只是省略了返回的过程,这样即节省了来回传输的网络流量,也避免了中间时间造成的文 ...

  9. Solidworks 如何快速完全定义草图

    工具-尺寸标注-完全定义草图

  10. android Activity的onPause()与onResume()

    官方文档地址:http://www.android-doc.com/training/basics/activity-lifecycle/pausing.html#Resume Pause和Resum ...