惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - amber lee zhao

(武义检察院)sqlplus执行sql脚本 windows下squid安装与配置 缓存服务器 System.Data.OracleClient requires Oracle client software version 8.1.7 or greater. Oracle Listener crash in Windows 【转】Session丢失原因分析 【转】Session丢失问题二 【转】Session丢失问题解决方法一 OracleMembershipProvider、OracleRoleProvider源代码 使用EnterpriseLibrary插入Oracle CLOB数据 使用System.Net.Mail发送邮件 - amber lee zhao 【转】oracle SQL性能优化 DataGridView导出为Excel文件 - amber lee zhao 使用HtmlAgilityPack批量抓取网页数据 OracleMembershipProvider与登录控件使用的技巧 - amber lee zhao 在ASP.NET中使用Quartz.net进行工作调度 结合OracleMembershipProvider开发简单的asp.net应用程序----配置web.config文件 C#版本的OracleMembershipProvider sharpICTCLAS 中在找出所有词组组合时的优化 .net下ICTCLAS原子分词和lucene的Token比较
Double-Array Trie分词词典简述 [转]
amber lee zhao · 2007-08-17 · via 博客园 - amber lee zhao

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 前面