算法 – 字符串相似性:Bitap如何工作?
我试图围绕
Bitap算法,但是我无法理解算法的步骤背后的原因.
我理解算法的基本前提,这是(如果我错了,纠正我): Two strings: PATTERN (the desired string) TEXT (the String to be perused for the presence of PATTERN) Two indices: i (currently processing index in PATTERN),1 <= i < PATTERN.SIZE j (arbitrary index in TEXT) Match state S(x): S(PATTERN(i)) = S(PATTERN(i-1)) && PATTERN[i] == TEXT[j],S(0) = 1 如果前一个子字符串PATTERN.substring(0,i-1)成功匹配且PATTERN [i]中的字符与TEXT中的字符相同,PATTERN.substring(0,i)将匹配TEXT的子字符串[J]. 我不明白的是这个位移的实现. The official paper detailing this algorithm basically lays it out,但我似乎无法想象应该怎么做.算法规范只是本文的前2页,但我将重点介绍重要的部分: 这是概念的位移版本: 这是一个示例搜索字符串的T [文本]: 这里是一个跟踪的算法. 具体来说,我不明白T表示什么,以及在当前状态下将条目置于其中的原因. 如果有人能帮助我了解究竟发生了什么,我将不胜感激 解决方法
T有点混乱,因为你通常会在位置上排名
从左到右的格局: 0 1 2 3 4 a b a b c …而位通常从右到左编号. 但写作 bit: 4 3 2 1 0 c b a b a T[a] = 1 1 0 1 0 c b a b a T[b] = 1 0 1 0 1 c b a b a T[c] = 0 1 1 1 1 c b a b a T[d] = 1 1 1 1 1 如果x出现在位置n,则T [x]的位n为0,如果不存在,则为1. 同样地,你可以想到这一点,如果现在的人物 现在到匹配程序.状态的位n中的0表示我们开始匹配n个字符之前的模式(其中0是当前字符).最初没有什么比赛. [start] 1 1 1 1 1 当我们消费字符试图匹配时,状态向左移动(将零移动) a 1 1 1 1 0 被移入的0位被保留,因为可以的当前字符 状态的位0现在为0意味着我们开始匹配模式 a b 1 1 1 0 1 …因为0位已经左移 – 想到这样说,我们开始匹配模式1个字符,而T [b]在同一个位置有一个0,告诉 a b d 1 1 1 1 1 d无法匹配;所有位都设置为1. a b d a 1 1 1 1 0 像之前一样. a b d a b 1 1 1 0 1 像之前一样. b d a b a 1 1 0 1 0 如果匹配从2个字符以前或当前字符开始,a是好的. d a b a b 1 0 1 0 1 如果匹配从1或3个字符开始,b是好的.位3中的0表示 a b a b a 1 1 0 1 0 …但下一个字符是一个,如果匹配开始4个字符是不好的 b a b a b 1 0 1 0 1 还好看 a b a b c 0 1 1 1 1 最后,如果比赛开始4个角色,c是好的.事实上一个0已经使它一直到顶部位意味着我们有一个匹配. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |