- Double-Array Trie分为静态构建和动态构建两种情况,
动态构建过程中主要利用的公式是:base[s]+c=t; check[t]=s
静态构建的过程中利用动态转移公式是:base[s]+c=t ; check[t] =base[s] - 静态构建
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]之前是否使用过,防止冲突。 -
以关键词 bc、abc、 ab为例子来说明构建过程
-
关键词 bc、abc、 ab 排序后为ab 、abc、bc,排序后关键词的数组keywordsArray:[ab,abc,bc],关键词构建树的层次结构如图,
-
关键词 bc、abc、 ab 中的字有 a、b 、c,字的编码表如图:
-
按照树的层级来构建Double-Array Trie,状态root到状态a,b的过程,就是找到一个begin,满足checkArray[begin+2]=0、checkArray[begin+3] = 0,begin从1开始递增寻找,得到begin =1,满足条件;其中,postion是状态数组中的位置,state就是状态,usedArray表示begin是否之前使用过;
-
状态a到状态ab迁移过程,找到一个begin,满足checkArray[begin+3]=0,begin从1开始递增寻找,得到begin =2,满足条件;
-
状态ab到状态abc和ab#迁移过程,找到一个begin,满足checkArray[begin+4]=0、checkArray[begin+0]=0, begin从1开始递增寻找,得到begin =6,满足条件;
此时关键词ab结束,baseArray设置为-index-1=-1,index为关键词ab在关键词数组keywordsArray中的下标位置 -
状态abc到状态abc#迁移过程,找到一个begin,满足checkArray[begin + 0]=0,begin从1开始递增寻找,得到begin =7,满足条件,
此时关键词abc结束,baseArray设置为-index-1=-1-1=-2,index为关键词abc在关键词数组keywordsArray中的下标位置 -
状态b到状态bc迁移过程,找到一个begin,满足checkArray[begin + 4]=0,begin从1开始递增寻找,得到begin =4,满足条件;
-
状态bc到状态bc#迁移过程,找到一个begin,满足checkArray[begin + 0]=0,begin从1开始递增寻找,得到begin =9,满足条件;
此时关键词bc结束,baseArray设置为-index-1=-2-1=-3,index为关键词bc在关键词数组keywordsArray中的下标位置 -
最后,按照树结构层层迭代计算,得到baseArray和chekcAarray 双数组,baseArray和字母编码结合可以进行关键词的查询匹配。
-
DAT算法
于 2022-06-21 21:27:15 首次发布