- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我了解不良字符启发法的工作原理。当找到不匹配的字母x
时,只需移动模式,以使模式中最右边的x
与字符串中的x
对齐。而且很容易在代码中实现。
我想我也了解后缀启发式的工作原理。当找到合适的后缀s
时,请在模式中的不同位置找到相同的后缀,然后将其移动,以使模式中的s
与字符串中的s
对齐。但是我不明白如何在代码中做到这一点。我们如何查找模式中另一个位置是否存在相同的后缀?我们如何知道它的位置?代码:
void bmPreprocess1()
{
int i=m, j=m+1;
f[i]=j;
while (i>0)
{
while (j<=m && p[i-1]!=p[j-1])
{
if (s[j]==0) s[j]=j-i;
j=f[j];
}
i--; j--;
f[i]=j;
}
}
最佳答案
首先,我将使用p[i]
表示模式中的字符,m
模式长度,$
模式中的最后一个字符,即$ = p[m-1]
。
良好的后缀启发式案例1有两种情况。
情况1
考虑以下示例,
leading TEXT cXXXbXXXcXXXcXXX rest of the TEXT
cXXXbXXXcXXXcXXX
^
| mismatch here
XXX
中的子字符串
cXXXbXXXcXXXcXXX
是很好的后缀。不匹配发生在字符
c
。那么在不匹配之后,我们应该将4移到右边还是8?
b
导致错误
c
),
leading TEXT cXXXbXXXcXXXcXXX rest of the TEXT
cXXXbXXXcXXXcXXX
^
| mismatch occurs here again
leading TEXT cXXXcXXXbXXXcXXX rest of the TEXT
cXXXXcXXXbXXXcXXX
^
| mismatch happens here
c
加上后缀
XXX
为
cXXX
,与下一个(从右数起)匹配的
XXX
加上前一个字符相同那。在第二种情况下,
cXXX
与下一个匹配项(从右数起)加上该匹配项之前的字符不同。
XXX
),我们需要弄清楚这两种情况下的变化,(1)在GOOD SUFFIX和GOOD SUFFIX之前的字符(我们将其称为
c
),模式中的字符也匹配好后缀+下一个字符的下一个(从右数)匹配,(2)字符加GOF SUFFIX不匹配
0XXXcXXXcXXXcXXXcXXXcXXX
,并且在
c
的第一次测试失败后,则可以向右移动20个字符,并使
0XXX
与测试的文本对齐。
1 2
012345678901234567890123
0XXXcXXXcXXXcXXXcXXXcXXX
^ ^
0XXX
的位置将从20到23。
0XXX
从位置0开始,所以20-0 = 20。
0XXXaXXXbXXXcXXX
,如果
c
的第一次测试失败,则只能向右移动4个字符,并使
bXXX
与测试的文本对齐。
4
的计算方式,
0123456789012345
0XXXaXXXbXXXcXXX
bXXX
,它从位置8、12-8 = 4开始。如果我们设置
j = 12
和
i = 8
,则移位是
j - i
。
s[j] = j - i;
。
border
前缀又是
proper
后缀。例如,对于字符串
proper
,
XXXcXXX
是边框,
X
是边框,
XX
也是如此。但是
XXX
不是。我们需要确定模式后缀的最宽边界的起点,并且此信息保存在数组
XXXc
中。
f[i]
?
f[i]
,并且对于所有其他
f[i] = j
具有
f[k]
的字母,这意味着从位置
i < k < m
开始于位置
i
的后缀的最宽边框。我们想基于
j
查找
f[i-1]
。
f[i]
,在位置
aabbccaacc
处,后缀为
i=4
,其最宽边框为
ccaacc
(
cc
),因此为
p[8]p[9]
。现在我们想根据对
j = f[i=4] = 8
,
f[i-1] = f[3]
,...的信息来了解
f[4]
,对于
f[5]
,后缀现在为
f[3]
。在
bccaacc
位置,它是
j-1=7
!=
a
,它是
p[4-1]
。因此
b
不是边界。
bcc
边界必须以
bccaacc
开头,后缀的边界必须从positin
b
开始,在本例中为
j = 8
。
cc
在
cc
位置上的
c
边框最宽。因此,我们继续比较
j = f[8]
与
9
。他们又不平等了。现在后缀为
p[4-1]
,并且在位置
p[j-1]
处只有零长度的边框。所以现在是
p[9] = c
,它是
10
。因此,我们继续进行比较,将
j = f[9]
与
10
进行比较,它们不相等,那就是字符串的结尾。那么
p[4-1]
仅具有零长度的边框,使其等于10。
p[j-1]
的含义是这样的,
Position: 012345 i-1 i j - 1 j m
pattern: abcdef ... @ x ... ? x ... $
f[3]
处的字符
f[i] = j
与位置
@
处的字符
i - 1
相同,我们知道
?
或
j - 1
。边框后缀
f[i - 1] = j - 1;
从位置
--i; --j; f[i] = j;
开始。
@x ... $
上的字符
j-1
与位置
@
上的字符
i - 1
不同,
?
开始的宽度,即小于
j - 1
。其次,边框必须以
j
开头并以字符
x...$
结束,否则可以为空。
@...
(从位置j到m)中搜索以
$
开头的边框。然后,下一个边框应位于等于
x ... $
的
x
,即
j
。然后,我们将字符
f[j];
与
j = f[j];
之前的字符(在
@
处)进行比较。如果它们相等,则找到边界,否则,继续进行处理,直到j> m。以下代码显示了此过程,
while (j<=m && p[i-1]!=p[j-1])
{
j=f[j];
}
i--; j--;
f[i]=j;
x
p [j-1]
j-1
p [i]
p[i -1] !=
p [j]
, this is what we talked about in situation (2),
p [i -1]!=
matches
,因此我们从
, but
转换为
p[j-1]
,即
i
。
j
,当较短的后缀具有相同的边框时,将发生该测试。例如,您有一个模式
012345678
addbddcdd
s[j] = j - i;
和
if (s[j] == 0)
时,将设置
f[i - 1]
。但是,当您为
i = 4
计算
s[7]
时,如果没有测试
f[i-1]
,则将再次设置
i = 1
。这意味着,如果在位置
s[7]
不匹配,则将
if (s[j] == 0)
向右移动(将
6
与所占据的位置
3
对齐)而不是
bdd
(直到
cdd
移至位置
6
占据)。
void bmPreprocess1()
{
// initial condition, set f[m] = m+1;
int i=m, j=m+1;
f[i]=j;
// calculate f[i], s[j] from i = m to 0.
while (i>0)
{
// at this line, we know f[i], f[i+1], ... f[m].
while (j<=m && p[i-1]!=p[j-1]) // calculate the value of f[i-1] and save it to j-1
{
if (s[j]==0) s[j]=j-i; // if s[j] is not occupied, set it.
j=f[j]; // get the start position of the border of suffix p[j] ... p[m-1]
}
// assign j-1 to f[i-1]
i--; j--;
f[i]=j;
}
}
关于c - Boyer-Moore良好后缀的启发式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19345263/
我有一个表类别,它与一对多关系中的任务表相关,我正在尝试使用 Moor 执行连接。 我想返回与类别匹配的任务列表的列表。我该怎么做? Stream> watchAllCategories(
我还没有找到任何关于在 Flutter ORM moor 中内置 Enum 列的可能性的文档。创建枚举列的最佳方法是什么?我想要这个: enum PersistentType { File,
我还没有找到任何关于在 Flutter ORM moor 中内置 Enum 列的可能性的文档。创建枚举列的最佳方法是什么?我想要这个: enum PersistentType { File,
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我对 moor 的依赖: moor_flutter: ^2.1.1 moor_ffi: ^0.4.0 我有表格: netPoint = 关于 netPoint 的信息 netPointNetP
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8 年前关闭。 Improve this
我正在寻找 Moore-Penrose 算法计算伪逆矩阵的 Matlab 实现。 我尝试了几种算法,这个 http://arxiv.org/ftp/arxiv/papers/0804/0804.480
我正在开发一个 flutter 应用程序(当时仅适用于 Android,但计划稍后支持 iOS)。该应用程序以两种方式运行: 具有大部分业务逻辑的 Flutter UI(前台隔离,从 main 方法开
当我执行 update(table).replace(model) 时,我只想更新指定的列它替换与主键对应的所有数据。如何只更新指定的列而不编写自定义查询。 最佳答案 你必须用 Insertable
我正在尝试使用 2D 数组从 boyer moore 实现错误字符规则以进行子字符串搜索,我遇到了我看到我的 arr[0][1] 与 arr[1][0] 重叠的情况这引起了问题。我试图遍历 VS 中的
我正在尝试在大量文本中实现精确的文本搜索。为此,我找到了一些针对 c# 的 Boyer Moore 实现示例,但现在我无法理解它是如何工作的。 例如,如果我有字符串 this is sample te
根据我的理解,找到多数元素的 Boyer-Moore 多数表决算法是 O(1),即它是常数,与输入的大小不成比例。那为什么要wiki link提到对数空间 {\displaystyle O(\log
关于此算法中的两个转换规则(坏字符和好后缀),我有些不明白。他们是否一起工作,以及究竟是什么决定了在每种情况下或轮类中部署哪一个。 This综合解释以 SSIMPLE EXAMPLE 的示例结束,这让
在Boyer-Moore string search algorithm wiki 链接,据说 Boyer-Moore 的最坏情况复杂度是 O(m+n) 如果模式没有出现在文本中 O(mn) 如果模式
我不是专业程序员,所以请多多包涵。我正在四处寻找为什么 haystack 和 needle 的初始“对齐”不应该在 needle 的最后一个字符与 haystack 中的相同字符的第一次一致时进行,但
我正在研究 Boyer-Moore 算法(来自 here),我有一个快速的问题 - 第二遍的需要是什么(它基本上只是通过找到该元素的频率来“确认”)。第一个传递本身不是保证找到的元素是多数元素吗?我考
我将 flutter_moor 用于 SQLite 数据库。我有一个问题,我需要一个 double 的货币金额列,小数点后两位。 我发现有一个 RealColumn,但不知道如何正确实现它。 ///
我即将实现 Boyer-Moore 模式匹配算法的变体(具体来说是星期日算法),我问自己:我的字母表大小是多少? 这取决于编码(= 可能的字符数)还是我可以假设我的字母表包含 256 个符号(= 可以
我在项目中大量使用字符串,因此我正在寻找一个快速的库来处理它们。我认为 Boyer-Moore 算法是最好的。 有免费的解决方案吗? 最佳答案 您可以考虑实现 Boyer–Moore 算法的以下资源:
我是一名优秀的程序员,十分优秀!