Double-Array Trie 原理解析
为了减少Trie树结构的空间浪费,同时保证Trie[/size]树查询的效率,有研究者提出了用三个线性数组表示Trie树的方法,并在此基础上进一步改进,用两个数组来表示Trie树,也就是双数组Trie树(Double-Array Trie)
base数组和check数组中的元素是一一对应的, base数组中的每一个元素相当于Trie树的一个节点,其值做状态转移的基值,check值相当于校验值,用于检查该状态是否存在。对于从状态s到状态t的一个转移,必须满足如下两个条件:
2. check[t] = s
令i为数组下标,base[i]和check[i]均为0时表示该位置为空,base[i]为负值时表示该状态为一个可结束状态。
以上这些摘抄自
双数组Trie树算法的优化及其应用研究
王思力1,2 张华平1,2 王斌1
1中国科学院计算技术研究所 北京 100080
1中国科学院研究生院 北京 100039
Email: {wangxiaofei,zhanghp,wangbin}@software.ict.ac.cn
在我以前的帖子里有这个文章我就不多发了. 当时在写这个东西时.也很迷茫,其实我个人认为.双数组的难点是字典生成时解决冲突.他的查询和载入都是十分方便高效的.甚至比一般hash创建字典的查询都简单.
下面我先画一个图来说明字典的构成.
1.假设我们有词典如下
- 中国
- 中心
- 中国人
- 国家
- 国民
其中所包含汉字
- 中 A
- 国 B
- 心 C
- 人 D
- 家 E
- 民 F
汉字后面的字母 ABCDEF代表了.此字的字符编码.初始可以默认为.(int)'中',(提示:char可以转换成int.int4字节,char是两个字节.char的字符编码范围是0-65535.)
如果没有异议,就继续往下看 如果有异议.那就别看了.
于是我们的base[] 就有了如下.
- base[中] = base[A] = AV
- base[国] = base[B] = BV
- base[心] = base[C] = CV
- base[人] = base[D] = DV
- base[家] = base[E] = EV
- base[民] = base[F] = FV
注意这里的 AV,BV....FV,是需要解决冲突的地方,即.在词典的构造初期.他的值是可变的.
基本的字有了?当然没这么简单..词还没有加进去呢.每一个词的从左到又的每一个部分都是一个base节点..完整的词典应该是这样的.
- base[中] = base[A] = AV
- base[国] = base[B] = BV
- base[心] = base[C] = CV
- base[人] = base[D] = DV
- base[家] = base[E] = EV
- base[民] = base[F] = FV
- base[base[中]+国] = base[AV+B] = GV
- ......
- base[base[中]+国]+人]=base[GV + D] = HV
- ......
- base[base[国]+民] = base[BV+F] = KV
是不是有点头大了?哈哈.其实就是一堆引用.不停的引用.
base[]就算是有了..既然是双数组..肯定还需要一个数组的..那就是check[] . check[]相当简单的. 为了方便阅读我把上面的数组转换成伪数组吧.满足条件如下
- base[中] check[中] = -1
- base[国] check[国] = -1
- base[心] check[心] = -1
- base[人] check[人] = -1
- base[家] check[家] = -1
- base[民] check[民] = -1
- base[中国] check[中国] = 中
- base[中心] check[中心] = 中
- base[中国人] check[中国人] = 中国
- base[国家] check[国家] = 国
- base[国民] check[国民] = 国
check[]是用来验证这个词是从那个位置转换过来的.他的值是上一个数组的位置.这样就不会出现base[中] + 国 = base [国] + 家 而差生冲突的情况了.
而你在构建词典时需要解决的冲突也就是这些.
现在词典有了..如果做查询..那是相当easey的....下面是我的java查询代码
- checkValue = baseValue;
- baseValue = base[checkValue] + charHashCode;
- if (check[baseValue] == checkValue || check[baseValue] == -1) {
- return status[baseValue];
- }
- return 0;
就这么几行...看不大懂吧????其实我也看不懂了唉..好长时间没碰了..但是原理就是那样的...这里需要说明了下..我引入了另一个数组status[] 他是干嘛的..这个是一个状体数据..记录当前位置词的状态...词是否结束...是否有下一个.....这些可以不理会..这个文章..主要是让你理解双数组的基本含义..你理解了么..如果没理解...就...提问吧..我会的一定回答..也希望有相关爱好的人和我一起讨论.
好了不多说了...我试着写写分词..我会边写边博客的..争取把写的途中每个步骤都记录下来..我们一起参考..进步
由于本人水平有限.难免出错.望不吝赐教
Double-Array Trie 原理解析的更多相关文章
- double array trie 插入结点总结
双数组Trie树索引的可操作性研究.pdf 提示:任一状态点的移动,会影响其Trie树中父节点的base值的选择以及兄弟结点位置的变动,而兄弟结点的移动又须变更相应的子节点的check值. 设待插入的 ...
- 双数组字典树(Double Array Trie)
参考文献 1.双数组字典树(DATrie)详解及实现 2.小白详解Trie树 3.论文<基于双数组Trie树算法的字典改进和实现> DAT的基本内容介绍这里就不展开说了,从Trie过来的同 ...
- sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding
1 概述 这是基于开源的sphinx全文检索引擎的架构代码分析,本篇主要描述index索引服务的分析.当前分析的版本 sphinx-2.0.4 2 index 功能 3 文件表 4 索引文件结构 4. ...
- Double Array Trie 的Python实现
不多介绍,可自行Google,或者其它关键词: "datrie" 放代码链接: double_array_trie.py 因为也是一段学习代码,参考的文章都记在里面了,主要参考gi ...
- 标准Trie字典树学习一:原理解析
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 字典树Trie学习一:原理解析 2.字典树Tr ...
- 【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介
B 树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...
- 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现
本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...
- Request 接收参数乱码原理解析二:浏览器端编码原理
上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“C ...
- Skinned Mesh原理解析和一个最简单的实现示例
Skinned Mesh 原理解析和一个最简单的实现示例 作者:n5 Email: happyfirecn##yahoo.com.cn Blog: http://blog.csdn.net/n5 ...
随机推荐
- ios优秀的第三方框架
1.数据请求,object-c AFNetworking 网址:https://github.com/AFNetworking/AFNetworking swift Alamofire 网址:h ...
- pop3_用Java发送图文并茂的HTML邮件
package com.syj; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.i ...
- 未能加载文件或程序集“System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项
在发布网站时遇到如题错误. 错误消息详细信息:未能加载文件或程序集“System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=3 ...
- centos中安装tomcat+jenkins
1) 安装tomcat 安装tomcat6: http://www.cnblogs.com/itech/p/3506011.html 安装tomcat7: http://www.cnblogs.com ...
- Revit API布置卫浴装置
//放置卫浴装置 [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public clas ...
- 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...
- CSS background-position用法
相信很多喜欢研究网页界面的童鞋都遇到过一个奇妙的现象:网页中很多图片素材被合成在一张图片上. 起初小菜模仿网站的时候,经常遇到这个现象,那时候也不知道这时什么技术,人家的整张图片素材不会利用,只能用p ...
- 浅析iOS程序设计模式(基于MVC)
接触iOS手机开发有一段时间了.总体来说,苹果公司设计的开发环境还是非常人性化的.很容易上手,也方便深入. 在组织大型项目的代码文件时,我们常用MVC的思想.MVC的概念讲起来非常简单,就和对象(ob ...
- Android 实时视频编码—H.264硬编码
from://http://www.cnblogs.com/skyseraph/archive/2012/04/04/2431771.html 1 硬编码 & 软编码 硬编码:通过调用And ...
- Linux学习13-CentOS安装ab做压力测试
前言 网站性能压力测试是服务器网站性能调优过程中必不可缺少的一,测试环境准备好了后,如何对网站做压力测试? 压力测试的工具很多,如:ab.http_load.webbench.siege.jmeter ...