http://www.xuebuyuan.com/1991441.html

一、TRIE树简介(以下简称T树)

TRIE树用于确定词条的快速检索,对于给定的一个字符串a1,a2,a3,…an,则采用TRIE
树搜索经过最多n次匹配即可完成一次查找,而与词库中词条的数目无关。它的缺点是空间空闲率高。
 
二、Double-Array Trie(双数组索引树,以下简称DAT)
    1)、DAT简介
    DAT是TRIE树的一种变形,它是在保证TRIE树检索速度的前提下,提高空间利用率而提出的一种数据结构。它本质是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态,根据变量的不同,进行状态转移,当到达结束状态或者无法转移的时候,完成查询。
 
    2)、DAT结构
    DAT是采用两个线性数组(姑且叫它们为base和check数组)进行TRIE树的保存, base和check数组拥有一致的下标,(下标)即DFA中的每一个状态,也即TRIE树中所说的节点,base数组用于确定状态的转移,check数组用于检验转移的正确性。
 
    于是:我们有如下
 
[定义1]:从状态s输入c到状态t的一个转移必须满足如下条件
 
base[s] + c == t
check[base[s] + c] == s
3)、DAT匹配
基于[定义1] DAT的匹配过程如下:
假设当前状态为s,输入字符为c。
 
t = base[s] + c;
if check[t] = s then
     next state = t;
else
     fail;
endif
 
3)、DAT构造
基于[定义1] DAT的构造过程如下:
 
root_index = 1;
 
Procedure daInsertBranch(String key)
begin
   index = root_index;
   for i = 0 to key.length()
   begin
      character c = key.get(i)
      t = base[index] + c;       1
           [ 。。。此处执行冲突处理。。。]
      check[t] = index;           2
      index = t;
   end   
   base[t] *= -1;
end
 
4)、DAT冲突处理
在执行3的过程中,有可能在1处插入状态t时该位置已经被其他状态 t1所占用,这就产生了冲突。
解决冲突的基本思想是为t以及t的所有兄弟状态重新寻找一个合适的状态,相当于寻找一个合适的数组下标。
 
//  寻找适当的base值,也相当于为所有子状态寻找合适的下标
Procedure intdaFindBase(character c, int oldbase_index)
begin
   if check[ base[oldbase_index] + c ] != 0 then
   begin
      foreach character a in ALPHABET(字母表)
      begin
        if check[ base[oldbase_index] + a ] != 0 then
              Add a to child_list;
      end
      Add c to child_list; 
      base[oldbase_index]++;      
while ( not fit each character )
begin
        base[oldbase_index]++;
end
   end   
   return base[oldbase_index];
end
 
// 重新分配
Procedure intdaRelocateBase (int old_index, int new_index)
begin
    //拷贝所有节点到新的位置,并修改被拷贝节点的所有子节点的check值以保证
    //在移动之后仍然是其子节点
    foreach character c in child_list
        begin
            copy cell from old_index to new_index
            begin
                get all childs of old_index;
                check[child] = new_index;
           end
           //释放所有旧的节点
           free old_index cell;
        end
     base[oldbase_index] = newbase;
end 
 
 
 

冲突处理位于3)构造中的 2 前面

Double-Array Trie分词词典简述的更多相关文章

  1. 双数组字典树(Double Array Trie)

    参考文献 1.双数组字典树(DATrie)详解及实现 2.小白详解Trie树 3.论文<基于双数组Trie树算法的字典改进和实现> DAT的基本内容介绍这里就不展开说了,从Trie过来的同 ...

  2. double array trie 插入结点总结

    双数组Trie树索引的可操作性研究.pdf 提示:任一状态点的移动,会影响其Trie树中父节点的base值的选择以及兄弟结点位置的变动,而兄弟结点的移动又须变更相应的子节点的check值. 设待插入的 ...

  3. sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding

    1 概述 这是基于开源的sphinx全文检索引擎的架构代码分析,本篇主要描述index索引服务的分析.当前分析的版本 sphinx-2.0.4 2 index 功能 3 文件表 4 索引文件结构 4. ...

  4. Double Array Trie 的Python实现

    不多介绍,可自行Google,或者其它关键词: "datrie" 放代码链接: double_array_trie.py 因为也是一段学习代码,参考的文章都记在里面了,主要参考gi ...

  5. 【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

    B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...

  6. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...

  7. Save and read double array in a binary file

    ;} 32 bytes read 9.5 -3.4 1 2.1 "

  8. Solr 5.x集成中文分词word,mmseg4j

    使用标准分词器,如图: 使用word分词器 下载word-1.3.jar,注意solr的版本和word分词的版本 将文件word-1.3.jar拷贝至文件夹C:\workspace\Tomcat7.0 ...

  9. 双数组trie树的基本构造及简单优化

    一 基本构造 Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现.它本质上是一个确定的有限状 ...

随机推荐

  1. Oracle 取整函数

    ceil(n):ceil英文含义是天花板,天花板在上面,所以意为向上取整,即大于或等于n的整数. floor(n):floor英文含义是地板,地板在下面,所以意为向下取整,即小于或等于n的整数.

  2. 使用 IntraWeb (5) - 页面布局之 TFrame

    IW 对 TFrame(还是之前那个), 这在页面布局中很有用. 如果多个页面都有一个共同的部分(譬如页眉.页脚.菜单.边栏等), 可以将这些共同的部分放在一个 TFrame 中, 从而方便统一与修改 ...

  3. QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付

    QNJR-GROUP/EasyTransaction: 依赖于Spring的一个柔性事务实现,包含 TCC事务,补偿事务,基于消息的最终一致性事务,基于消息的最大努力交付事务交付 大规模SOA系统的分 ...

  4. 异步接收MSMQ消息

    在这部分,我们将使用ThreadPool 和MSMQ 进行消息收发.MSMQ 是一个分布式队列,通过MSMQ 一个应用程序可以异步地与另外一个应用程序通信. 在一个典型的场景中,我们要向维护一个队列的 ...

  5. HDU 4764 Stone (2013长春网络赛,水博弈)

    Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. Go 语言中的 new() 和 make()的区别

    本文是看了文章之后的心得. 在此感谢. 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似.不过解释两者之间的不同也非常容易. 他们所做的事情,和应用的类型也不相同 ...

  7. IOS NSLog 打印bool值

    输出BOOL值的方法:NSLog(@"%@",YES?@"YES":@"NO");%@输出字符串. NSLog(@"ifReadO ...

  8. DotNetty 学习

    [转载]http://www.cnblogs.com/littlegod/p/7699482.html DotNetty的学习是带着如下这些问题展开: 1. Socket基础框架方案: 通信模式:异步 ...

  9. jQuery Ajax 上传文件夹及文件

    我们先来看一下文件夹结构 这是上传处理的: 看一下系统日志: 升级 HTML5文件实现拖拽上传提示效果改进(支持三种状态提示) 拖拽过程详解: 1:文件未拖出文件选择框的时候提示:将要上传的文件或文件 ...

  10. 升级IOS8游戏上传自定义头像功能失效的问题

    为了支持arm64,之前已经折腾了很久,昨晚打包准备提交苹果审核时,测试那边的同事反馈说游戏上传自定义头像功能不可用了. 游戏上传自定义功能的简介:卡牌游戏最初是<比武招亲>中有一个充VI ...