双数组 实现 Trie
NewSMTH
zhjin (sweptAway): 在开发中文分词器的时候, 一个高效的词典结构尤其重要。 词典
的一种常见高效的实现方式就是使用 Trie 结构, 但是传统的 Trie
结构的实现方式复杂, 也比较浪费内存。 双数组 是目前 Trie 结构
中的一种高效的实现方式, 检索速度快, 也比较节约内存。 这里简
要介绍两个比较实用的双数组实现
1. Darts (http://chasen.org/~taku/software/darts/)
Darts(Double-ARray Trie System) 是日本的 Taku kudo (也是 CRF++
的作者) 实现的一个双数组, 接口简单,只提供了一个约 500 行代码
的头文件 darts.h, 实现的逻辑也相对简单, 如果了解双数组的原理
的话,要读懂代码并不难。目前两个著名的开源日文分词系统 Mecab,
Chasen 都使用 Darts 构建词典, 检索速度快, 但是有点浪费内存。
Darts 的接口文档是日文的, 我把它的主要接口翻译成了中文,
可以参看我博客上的如下链接
http://zhjin.spaces.live.com/blog/cns!2FEA4AA78B600980!692.entry?&_c02_vws=1
2. Darts-clone (http://code.google.com/p/darts-clone/)
另外一个日本人 Susumu Yata 开发的一个双数组实现, 接口完全兼容
Darts, 因此叫做 Darts-clone, 实现算法可以参看论文
Yata, S.; Oono, M.; Morita, K.; Fuketa, M.; Sumitomo, T. & Aoe, J.
A compact static double-array keeping character codes.
Information Processing and Management, Vol. 43, No. 1, pp. 237-247, 2007.
从论文的署名顺利来看, 该作者应该是双数组的发明者 Junichi Aoe
的学生。 在 Darts 中, 双数组的每个节点要由 base 和 check 两个
32bit 整数来表示, Susumu Yata 的论文中给出了只用一个 32bit 整
数来同时表示 base 和 check
的简单方法, 同时又对只有单个分支的节点进行压缩,因此Darts-clone
相比于 Darts大大节约了内存。 另外, Darts-clone 在实现的时候把双
数组中的加法操作巧妙替换为位运算, 因此检索速度上也要比 Darts 稍
快一些。
有兴趣的读者可以参看 http://code.google.com/p/darts-clone/w/list
中给出的 Darts & Darts-clone 的性能对比。作者给了 Darts-clone 的两个
实现
Darts clone 0.32f 内存消耗为 Darts 的 1/2, 速度比 Darts 快
Darts clone 0.32e 内存消耗为 Darts 的 1/4, 速度比 Darts 慢
当然以上为粗略结果, 性能表现在不同数据集上略有差异��boycat (记得请冬子打球|我是乡下人,小地方来的): 赞~~~
【 在 zhjin (sweptAway) 的大作中提到: 】
: 在开发中文分词器的时候, 一个高效的词典结构尤其重要。 词典
: 的一种常见高效的实现方式就是使用 Trie 结构, 但是传统的 Trie
: 结构的实现方式复杂, 也比较浪费内存。 双数组 是目前 Trie 结构
: ...................jiju (Super.Jiju): zan
【 在 zhjin (sweptAway) 的大作中提到: 】
: 在开发中文分词器的时候, 一个高效的词典结构尤其重要。 词典
: 的一种常见高效的实现方式就是使用 Trie 结构, 但是传统的 Trie
: 结构的实现方式复杂, 也比较浪费内存。 双数组 是目前 Trie 结构
双数组 实现 Trie相关推荐
- 数据结构-----基于双数组的Trie树
Trie树简介 Trie树也称字典树,在字符串的查找中优势比较明显,适用于在海量数据中查找某个数据.因为Trie树的查找时间和数据总量没有关系,只和要查找的数据长度有关.比如搜索引擎中热度词语的统计. ...
- 双数组Trie树(DoubleArrayTrie)Java实现
http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...
- Ansj分词双数组Trie树实现与arrays.dic词典格式
http://www.hankcs.com/nlp/ansj-word-pairs-array-tire-tree-achieved-with-arrays-dic-dictionary-format ...
- 双数组trie树的基本构造及简单优化
一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...
- 用Python实现字典树(Trie)与双数组字典树(DATrie)
1. 字典树(Trie) 假如我们把字典中的词以记录的形式(无序)存入数据库中.现给定一串字符,要查找该字符串是否为字典中的词.因为数据库中的记录是无序的,所以,最朴素的方法就逐记录匹配.此方法简单, ...
- 双数组Trie的一种实现
An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...
- python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词...
#coding=utf-8 #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(1). ''' Python 字典 setdefault ...
- 关于双数组Trie查询词典构造总结
原贴:http://www.firtex.org/firtex_forum/archiver/?tid-241.html FirteX开发论坛 » FirteX开发者专区 » 关于双数组Trie查询词 ...
- 双数组trie树详解
目录 双数组trie树的构建 构建base array 构建check array 双数组trie树的查询 双数组trie树的构建 NLP中trie树常用于做快速查询,但普通的trie树由于要保存大量 ...
最新文章
- 用Construct 2制作入门小游戏~
- CSS Sprites (转)
- opensuse download
- sql 查询慢的48个原因分析
- python各版本区别_关于python中不同版本的print区别
- MBA已经全面***“中国式教育”!
- heap c语言数组实现,垃圾回收算法实现之 - 分代回收(完整可运行C语言代码)...
- 伪静态 apache重写
- 第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【8】
- JAVA根据时间增加1天
- ElasticSearch的REST APIs 之 索引的状态管理
- 阿里云视频直播视频存储回调功能的处理方法
- 企业信息管理系统(4)_用户查询
- 考研数据结构历年真题(选择题)整理
- 光伏产业 | 我国光伏银浆正逐步国产化替代,已打破国际垄断局面
- android 定时器封装
- AutoCAD 2013 .net插件创建向导现在支持Map 3D,Civil 3D,AutoCAD Architecture 和AutoCAD MEP...
- Linux中pidgin下运行QQ和MOC以及人人
- 【Python】京东抢购脚本
- Opencv最强案例——使用摄像头、OpenCV和Python扫描条形码和二维码。