双数组tire树的笔记

参考https://github.com/komiya-atsushi/darts-java的源代码和http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE%9E%E7%8E%B0.html对双数组trie树的解读

核心!!!!:寻找转移至当前状态的状态,并记录该转移路径。(嗯!跟维特比方法一个道理)

我的认识:

1.存储兄弟节点,每一个节点为一个字,每个节点仅存储不同的字,例如一举、一举成名、万能在depth1仅存储一和万,其中最左节点等于父节点的left,right为右节点的left,最右节点的right等于父节点的right。注意的是若当前词的长度小于深度,则该节点为终止节点,例如一举长度为2,此时深度已经到了3,在深度3的时候该词并不扩展说明该词已经结束了。

2.在找到兄弟节点之后无非就是填充base和check数组,其中base数组用于存储词的位置,而check数组用于记录该词是从哪个哪个词转移过来的(即从哪个base转移过来的),在上链接代码中,通过子节点寻找父节点位置(begin值),子节点的词在哪里开始就代表着父节点的词从哪里结束,故子节点开始的位置代表了父节点的位置,同时该begin值需要满足使得该节点的兄弟节点都为0且满足该begin位置并没有被使用。

故思路就是通过寻找满足check[begin+a1..an] = 0 and used[begin] = false的begin值(满足约束条件的begin),使得check[begin+ai.code()] = begin(即表示了该节点是从哪个节点转移过来的),同时,该begin值也即是父节点的位置,通过递归子节点向父节点传递该begin值使得base[begin+ai.code] = begin,从而父节点找到自己“合理”的位置。

若当前节点没有子节点,给予当前节点的base一个负值,标志着结束

3.前缀树寻找结果,思路非常简单。即我在第二段也提到过,父节点的位置是子节点传递的,即是通过子节点找到的,故可以通过父节点的位置去找子节点,若满足了是一个路径上的且子base值为负,则找到一个词添加至结果即可,若不满足,把子节点作为当前值继续寻找直至找到满足条件。

前缀树还有一个特点就是如下代码,即不是一个前缀就没有必要再向下找了

if(b == check[p]){
   b = base[p];
}
else {
   return result;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值