Algorithm 字符串相似性:Bitap到底是如何工作的?
我正试图对算法进行思考,但我很难理解算法步骤背后的原因 我理解算法的基本前提,即(如果我错了,请纠正我):Algorithm 字符串相似性:Bitap到底是如何工作的?,algorithm,bit-manipulation,similarity,Algorithm,Bit Manipulation,Similarity,我正试图对算法进行思考,但我很难理解算法步骤背后的原因 我理解算法的基本前提,即(如果我错了,请纠正我): 两个字符串:模式(所需字符串) 文本(要仔细阅读的字符串,以查看是否存在模式) 两个索引:i(目前正在处理模式中的索引),1很抱歉不允许其他人回答,但我很确定我现在已经明白了 探索该算法的基本概念是用二进制表示匹配状态(在原始帖子中定义)。原帖中的文章对其进行了正式解释;我将试着用口语来表达: 让我们看一下STR,它是一个由给定字母表中的字符创建的字符串 让我们用一组二进制数字来表示STR
两个字符串:模式(所需字符串)
文本(要仔细阅读的字符串,以查看是否存在模式)
两个索引:i(目前正在处理模式中的索引),1很抱歉不允许其他人回答,但我很确定我现在已经明白了
探索该算法的基本概念是用二进制表示匹配状态(在原始帖子中定义)。原帖中的文章对其进行了正式解释;我将试着用口语来表达:
让我们看一下STR
,它是一个由给定字母表中的字符创建的字符串
让我们用一组二进制数字来表示STR
:STR\u binary
。该算法要求该表示向后(因此,第一个字母对应于最后一个数字,第二个字母对应于第二个到最后一个数字,等等)
让我们假设RANDOM
指的是一个字符串,其中包含来自相同字母表的随机字符STR
在STR\u BINARY
中,给定索引处的0表示,RANDOM
将STR
从STR[0]
匹配到
STR[(STR\u二进制中的0对应的STR中字母的索引)]
。空空格视为匹配项。1表示RANDOM
与这些相同边界内的STR
不匹配
一旦理解了这一点,算法就会变得更简单。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
当我们使用试图匹配的字符时,状态会向左移动(这会在
到底部位,第0位)和/或与当前字符的表项合并。第一个字符是a
;在T[a]
中向左和/或向内换档给出:
a
1 1 1 1 0
移入的0
位被保留,因为a
的当前字符可以
开始模式的匹配。对于任何其他字符,该位将被设置为
1
a b d a
1 1 1 1 0
状态的第0位现在是0
,这意味着我们开始在上匹配模式
当前角色;继续,我们得到:
a b
1 1 1 0 1
…因为0
位已左移-可以将其视为我们在1个字符之前开始匹配模式-并且T[b]
在相同位置有一个0
,说明
如果我们开始匹配1个字符,则a在当前位置看到ab
是好的
以前
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
和以前一样
a b d a b
1 1 1 0 1
b d a b a
1 1 0 1 0
a
如果匹配是在2个字符之前开始的,或者是在当前字符上开始的,则该匹配是良好的
d a b a b
1 0 1 0 1
b
如果匹配在1或3个字符之前开始,则该选项很好。第3位中的0
表示
我们几乎匹配了整个模式
a b a b a
1 1 0 1 0
…但下一个字符是a
,如果匹配从4个字符开始,则该字符无效
以前不过,短距离的比赛可能还是不错的
b a b a b
1 0 1 0 1
看起来还不错
a b a b c
0 1 1 1 1
最后,c
是好的,如果匹配在之前开始4个字符。事实是
0
一直到最高位意味着我们有一个匹配项。很抱歉打断了这么一个老问题,但您如何扩展此算法,使其能够处理有错误的搜索?