`
ansjsun
  • 浏览: 203874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Double-Array Trie 原理解析

阅读更多
    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[] 他是干嘛的..这个是一个状体数据..记录当前位置词的状态...词是否结束...是否有下一个.....这些可以不理会..这个文章..主要是让你理解双数组的基本含义..你理解了么..如果没理解...就...提问吧..我会的一定回答..也希望有相关爱好的人和我一起讨论.
   好了不多说了...我试着写写分词..我会边写边博客的..争取把写的途中每个步骤都记录下来..我们一起参考..进步
                                            由于本人水平有限.难免出错.望不吝赐教
  • 大小: 20.9 KB
分享到:
评论
5 楼 kannju 2014-08-08  
原来java和c++还不同,真不知道
4 楼 kannju 2014-08-08  
char是两个字节? 好吧,我石化了
3 楼 ansjsun 2011-11-10  
EastonSoft 写道
EastonSoft 写道
看是看懂了,但是如何解决冲突还是没什么头绪。


说句心里话,这比那个教授写的好理解些。

呵呵..我大致看了下有个地方写的还是有些不妥..双数组其实原理也没那么复杂..复杂在解决冲突上面...得不停的回滚数组...这个时间是不可控的..如果单纯为了分词不建议用这个算法了..词典生成不方便
2 楼 EastonSoft 2011-11-10  
EastonSoft 写道
看是看懂了,但是如何解决冲突还是没什么头绪。


说句心里话,这比那个教授写的好理解些。
1 楼 EastonSoft 2011-11-10  
看是看懂了,但是如何解决冲突还是没什么头绪。

相关推荐

    double-array-trie原理与算法

    double-array-trie原理与算法实现探索,dat算法分析

    基于Double-Array Trie树的垃圾邮件过滤器的 php扩展,它可以检测文本消息中是否存在垃圾邮件_C语言php

    基于Double-Array Trie树的垃圾邮件过滤器的php扩展,它可以检测短信中是否存在...过滤关键词扩展,用于检查一段文本中是否出现敏感词,基于Double-Array Trie树实现。 更多详情、使用方法,请下载后阅读README.md文件

    go-darts:用于golang的Double-ARray Trie系统

    这是Double-ARray Trie System的GO实施。 它是的克隆 Dart可以用作简单的哈希字典。 您还可以非常快速地执行通用前缀搜索,这对于形态分析至关重要,例如用于CJK文本索引/搜索的单词拆分。 参考 消息 支持从构建...

    darts-clone-java:用Java编写的DARTS(Double-ARray Trie System)克隆

    darts-clone-java 用Java编写的Double-ARray Trie System克隆。 该库基于称为“快速高效”库的 。入门设置要使用Maven添加依赖项,请使用以下命令: < dependency> < groupId>...

    xfilter:关键词过滤扩展, 用于检查一段文本中是否出现敏感词, 基于 Double-Array Trie 树实现

    关键词过滤扩展,用于检查一段文本中是否出现敏感词,基于 Double-Array Trie 树实现。 依赖环境 PHP 7 + libdatrie (Version >= 0.2.4) 安装 因为本项目依赖于 libdatrie, 所以需要先安装 , 再安装本扩展。 $ wget ...

    ahocorasick:使用Double Array Trie的Aho-Corasick算法的更快,更高效的Golang实现

    为了提高性能并减少内存使用,该程序使用Double Array Trie而不是常用的Linked List Trie 。 在基准测试中, it is 10 times faster than the most popular AC algorithm implement in golang @ github and tenth ...

    双数组 DoubleArray Trie树的数组实现 双数组字典

    双数组Trie(Double-ArrayTrie)是trie树的一个简单而有效的实现,由两个整数数组构成,一个是base[],另一个是check[]。设数组下标为i,如果base[i],check[i]均为0,表示该位置为空。如果base[i]为负值,表示该状态为...

    aho-corasick-node:基于DoubleArray Trie的Aho-Corasick字符串匹配算法的Node实现

    aho-corasick-node 基于DoubleArray Trie的Aho-Corasick字符串匹配算法的Node实现。安装npm install aho-corasick-node --save用法建造const AhoCorasick = require ( 'aho-corasick-node' ) ;const keywords = [ 'b...

    double_array Trie

    Trie,又称前缀树或字典树,是一种高效的字符串搜索数据结构。它是一种数字化的搜索树,由Edward Fredkin于1960年引入,并以“trie”命名,由“retrieval”一词简化而来。Trie可以被视为一种确定性有限自动机(DFA)...

    libdatrie_0.1.2.orig.tar.gz_TRIE_double array_double array trie_

    "double array trie" 是双数组Trie的完整表达,它是一种优化的字典树实现,特别适合于大量词汇的快速查找。 **描述分析:** "Double Array Trie 的实现" 描述了libdatrie库的核心功能,即提供了一个双数组Trie的...

    IT笔试面试--Trie树前缀树常考题目及解析

    ##### 双数组(Double-Array) 这是一种高效的Trie树实现方式,通过两个数组来存储节点信息,从而大幅度减少了存储空间的需求。双数组结构包括一个基本数组和一个检查数组,基本数组用来存储节点信息,检查数组用来...

    AhoCorasickDoubleArrayTrie:基于Double Array Trie的Aho Corasick算法的极快实现

    基于Double Array Trie结构的Aho Corasick算法的极快实现。 它的速度是幼稚实现的5到9倍,也许是迄今为止最快的实现;-) 介绍 您可能听说过Aho-Corasick算法可以快速解析带有巨大词典的文本,例如: 在文本中寻找...

    数据结构实验报告-----trie树

    通过这次实验,我们不仅掌握了Trie树的基本原理和实现方法,也锻炼了编程技巧和问题解决能力。同时,对源代码进行良好的注释和接口说明,有助于提高代码的可读性和维护性,这也是软件工程实践中不可或缺的一部分。

    HAT-trie - A Cache-conscious Trie-based Data Structure for Strings - 2007 (CRPITV62Askitis)-计算机科学

    HAT-trie: A Cache-conscious Trie-based Data Structure for StringsNikolas Askitis Ranjan SinhaSchool of Computer Science and Information Technology, RMIT University, Melbourne 3001, Australia. Email: {...

    前端开源库-doublearray

    双数组Trie,又称DA-Trie或Double-Array Trie,是由日本学者原田博之提出的。它的核心思想是将Trie树的路径分解成两个独立的数组,一个存储字符,另一个存储跳转信息。这种设计使得数据访问更快,占用内存更少,相比...

    双数组 Trie源码

    **双数组 Trie(Double-Array Trie)源码详解** 在计算机科学中,Trie,也称为前缀树或字典树,是一种用于存储键值对的数据结构,它以高效的键查找速度著称。双数组 Trie(Double-Array Trie,DART)是 Trie 结构的...

    rust-darts:Rust中的Double Array Trie

    在IT领域,数据结构是构建高效算法的基础,而Double Array Trie(DART)是一种高效、紧凑的字符串查找数据结构。本文将深入探讨Rust编程语言中的`rust-darts`库,它为开发者提供了实现DART的功能。 Double Array ...

    an efficient implemention of double array trie

    本文档主要介绍了一种高效的字典树(Trie)结构实现方法——双数组字典树(Double Array Trie)。该实现方式旨在结合矩阵形式的快速访问特性和列表形式的紧凑性,从而在减少内存占用的同时保持较高的查询效率。 ###...

    php-ext-trie-filter-php7.zip

    在本例中,“trie-filter”可能是这个扩展的核心功能,可能是一个基于Trie数据结构的过滤器或搜索工具。 描述“php-ext-trie-filter-php7”进一步确认了这个项目是关于PHP7的扩展,并且主要涉及“trie-filter”特性...

Global site tag (gtag.js) - Google Analytics