DAT算法

  1. Double-Array Trie分为静态构建和动态构建两种情况,
    动态构建过程中主要利用的公式是:base[s]+c=t; check[t]=s
    静态构建的过程中利用动态转移公式是:base[s]+c=t ; check[t] =base[s]
  2. 静态构建

    DAT思想:base[s] + c = t; check[t] = base[s] ==> begin + c = t; check[t] = begin;
    从状态s到状态t1、t2...tn的过程,就是找到一个begin使得,满足:check[t1] = begin,check[t2] = begin,...check[tn] = begin,且check[ti]没有被使用过;
    简化一下,就是找到一个begin,使得满足check[begin+ci] = 0,没有冲突。

    DAT算法中用到三个数组:checkArray、baseArray、usedArray;
    baseArray记录状态的base[s]的地址;
    checkArray记录上一个状态的基地址base[s],不同状态父节点一致,checkArray记录的base[s]的地址是相同的,不同状态父节点不一致,checkArray记录的base[s]的是不相同的;
    usedArray记录base[s]之前是否使用过,防止冲突。

  3. 以关键词 bc、abc、 ab为例子来说明构建过程

    1. 关键词 bc、abc、 ab 排序后为ab 、abc、bc,排序后关键词的数组keywordsArray:[ab,abc,bc],关键词构建树的层次结构如图,

    2. 关键词 bc、abc、 ab 中的字有 a、b 、c,字的编码表如图:

    3. 按照树的层级来构建Double-Array Trie,状态root到状态a,b的过程,就是找到一个begin,满足checkArray[begin+2]=0、checkArray[begin+3] = 0,begin从1开始递增寻找,得到begin =1,满足条件;其中,postion是状态数组中的位置,state就是状态,usedArray表示begin是否之前使用过;

    4. 状态a到状态ab迁移过程,找到一个begin,满足checkArray[begin+3]=0,begin从1开始递增寻找,得到begin =2,满足条件;

    5. 状态ab到状态abc和ab#迁移过程,找到一个begin,满足checkArray[begin+4]=0、checkArray[begin+0]=0, begin从1开始递增寻找,得到begin =6,满足条件;
      此时关键词ab结束,baseArray设置为-index-1=-1,index为关键词ab在关键词数组keywordsArray中的下标位置

    6. 状态abc到状态abc#迁移过程,找到一个begin,满足checkArray[begin + 0]=0,begin从1开始递增寻找,得到begin =7,满足条件,
      此时关键词abc结束,baseArray设置为-index-1=-1-1=-2,index为关键词abc在关键词数组keywordsArray中的下标位置

    7. 状态b到状态bc迁移过程,找到一个begin,满足checkArray[begin + 4]=0,begin从1开始递增寻找,得到begin =4,满足条件;

    8. 状态bc到状态bc#迁移过程,找到一个begin,满足checkArray[begin + 0]=0,begin从1开始递增寻找,得到begin =9,满足条件;
      此时关键词bc结束,baseArray设置为-index-1=-2-1=-3,index为关键词bc在关键词数组keywordsArray中的下标位置

    9. 最后,按照树结构层层迭代计算,得到baseArray和chekcAarray 双数组,baseArray和字母编码结合可以进行关键词的查询匹配。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值