我想在巨大的矩阵中找到一个子矩阵,所以我谷歌找到了Baker-Bird算法。
但是,遗憾的是我无法理解它,关于它的教程很少见。
我找不到一些可供学习的示例代码。
所以我想问一下,我可以研究一些简单的示例代码或伪代码吗?
提前谢谢。答案 0 :(得分:4)
好的,通过研究Kent Munthe Caspersen给出的链接(http://www.stringology.org/papers/Zdarek-PhD_thesis-2010.pdf第30页),我理解Baker-Bird算法是如何工作的。
要使子矩阵显示在矩阵中,其列必须单独匹配。您可以向下扫描每列以查找匹配项,然后扫描此后处理矩阵以查找指示在同一位置连续匹配的列的行。
假设我们正在寻找格式
的子矩阵a c a
b b a
c a b
我们在每列中搜索列匹配'abc''cba'或'aab',并在新矩阵中标记相应单元格中完整匹配的末尾 - 例如A,B或C.本文中的算法是构造一个状态机,它根据旧的状态号转换到一个新的状态,接下来是哪个字母,然后查找指示我们刚刚匹配一列的状态,这更复杂但效率更高因为它只需扫描每一列而不是每个不同列匹配一次,我们感兴趣)
完成此操作后,我们沿着每一行扫描,查找表示连续列匹配的连续值 - 在这种情况下,我们在矩阵行中查找字符串'ABC'。如果我们找到它,这里有一个子数组匹配。
通过使用上述状态机方法以及字符串搜索算法的选择(有许多具有不同时间复杂度:(其中有很多:http://en.wikipedia.org/wiki/String_searching_algorithm)
来实现加速(请注意,整个算法当然可以翻转为先行而不是列,它们是相同的。)
答案 1 :(得分:1)
这篇博士论文第31-33页的例子如何: http://www.stringology.org/papers/Zdarek-PhD_thesis-2010.pdf