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. java读取记事本文件第一个字符遇到的一个坑

    记事本数据是这样的: Faq_faqTitle=常见问题_标题Faq_faqKeyword=关键字Faq_faqDescription=FAQ描述...... 文件编码:utf-8有签名 然后用jav ...

  2. .net加载失败的程序集重新加载

    在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...

  3. STM32F4, USB HS with ULPI and Suspend/Wakeup

    Hi guys,I am in need of your help, unfortunately STs documentation is lacking some information here. ...

  4. .NET对象的创建、垃圾回收、非托管资源的手动处理

    本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没 ...

  5. UINavigationController 、UINavigationBar 、UINavigationItem 超清晰直观详解(扩展)

    ios开发中如何隐藏各种bar 状态条Status Bar [UIApplication sharedApplication].statusBarHidden = YES; 或者 // iOS3.2+ ...

  6. iOS-如何让xcode自动检查内存泄露

    在project-setting中找到 “Run Static Analyzer” 键,然后把值修改为“YES”.这样在编码的时候,xcode就可以自动为我们检查内存泄露了.

  7. FieldExists

    import arcpy import os import sys def FieldExists(TableName,FieldName): desc = arcpy.Describe(TableN ...

  8. arcengine Annotation研究的一些学习资料(转)FeatureWeight

    转自chanyinhelv原文Annotation研究的一些学习资料 下面是我最近对Annotation研究的一些学习资料,收集于此,供大家学习之用. 一.Annotation要素类介绍 在GeoDa ...

  9. 一键GHOST优盘版安装XP/win7系统

    系统的安装方法有各种各样,一键GHOST优盘版也是其中的一种系统安装方法,也是俗称的U盘系统安装.下面豆豆来详细介绍下使用一键GHOST优盘版系统安装方法. 一.安装: 所谓"优盘" ...

  10. Spring Websocket实现文本、图片、声音、文件下载及推送、接收及显示(集群模式)

    相关环境 Nginx,Spring5.x当前(要选择4.0+),tomcat8.x,Quartz 2.x集群(实际运用是Quartz的集群模式和单机模式共存的) 测试面页:http://sms.rey ...