双数组树过程理解(Double-arrayTrie)

双数组字典树(Double-array Trie)由Jun-Ichi Aoe于1989年提出,由base和check数组构成,用于快速状态转移。本文介绍了DAT的定义、构建过程和理解,通过深度优先遍历构建节点,并利用base和check数组建立词典树。在检索时,base和check数组协同工作,实现高效查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

双数组字典树由日本人Jun-Ichi Aoe在1989年提出,它由base和check两个数组组成,状态转移的复杂度为常数。这两个数组里面存在的内容为链接数组的下标,但是为了节约空间,在数据定义以及存储上各有千秋,除非看最原始的实现方式,否则各个博客中或者教程中的版本各有那么一点的不同,而本节就是其中的一种方式。

双数组的定义

原始的双数组定义如下:

p = base[b] + c
check[p] = base[b]

需要注意的是,这两个步骤都是赋值操作,里面涉及到的参数为b、c和base[b]的取值(这两步式子可以合为check[ base[b] + c ] = base[b]。其次,c通常也是定的,一般用符对应这的hash码。所以这里面的变量只有base[b]和b的值待定,这也就成了构建双数组数的关键。

那么问题来了,这两个值是随便定义的吗,这个~,应该说视情况而定比较合适,不同的思路执行方式不同。在我们这里,base[b]的值分两种情况,如果是字符串结尾,则设定,如果不是字符串结尾,则自己指定(但要满足一定的条件)。b的值由check数组产生。这个地方比较难描述,如果看到这一段如果比较懵,先看一下下一节 双数组树的构建

双数组树的构建

这里借鉴hanlp的双数组树的构建方法,其主体流程为:

存在
不存在
父节点
判断是否有子节点
定义父节点在base数组的值同时可以推到出check数组的定义
父节点在base数组的值设置为当前词在字典中的索引
  1. 定义根节点。
    为根节点分配下标0,初始化 base[0]=1; check[0]=0; 这俩个可以随便定义,看个人喜好。以根节点为最初的父节点开始深度优先遍历,每一层的兄弟节点按照字符的散列值升序排列。
    比如:“lie”、“人民”、“浙江”、“民生”,“like”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值