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在当前位置看到a
b
是好的 以前

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
一直到最高位意味着我们有一个匹配项。

很抱歉打断了这么一个老问题,但您如何扩展此算法,使其能够处理有错误的搜索?