An Efficient Digital Search Algorithm by Using a Double-Array Structure笔记

双数组trie树实现的第一篇论文,日本人JUN-ICHI AOE 1989年撰写的.

大概看完,简单记录下,可能有不准确的地方.

trie树有静态和动态两种,静态的直接就是一个DFA,没什么好说的,使用内存什么都比较确定而且最少.动态的可以支持删除和插入,双数组做法就是一种实现.

为了保证字典中所有词都不是其他词的前缀,在每个词后面加上#标识.双数组是指base和check这两个数组,base数组和check数组,一个状态用一个数字表示(这个数字是从1开始数),一个状态转移s->t(边为'a'),表示为:

base[s] + 'a' = t check[t] = s

base[s] = 0 && check[s] = 0则表示状态s不存在.

这样看起来这两个数组中很可能存在大量的空洞,但是这里做了一个优化,对于可以通过前缀判断是哪个词的那个状态,base数组保存的是一个负数值,这个负值的相反数是一个tail数组的索引,这个数组该索引出保存尾部这些字符串(所以实际上加上这个tail数组还是三个数组了),减少了状态数,也就减少了对base和check数组的占用,插入新词时如果按照base + char有冲突,则根据分支数量选取分支数量较少的那个节点做修改,这个状态是从之前空的状态去找空位,因此空洞并不是无限增加的.删除时直接设置那个状态的base和check为0,可供下次插入出现冲突时使用.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值