Algorithm 首次出现并行字符串匹配算法

Algorithm 首次出现并行字符串匹配算法,algorithm,language-agnostic,parallel-processing,string-matching,Algorithm,Language Agnostic,Parallel Processing,String Matching,首先,这是家庭作业。这就是说,这是一个非常开放的领域,对于如何开始思考这个问题(或一般的并行算法),我们几乎没有任何指导。我想要指向正确方向的指针,而不是完整的解决方案。任何有帮助的阅读都会很好 我正在研究一种有效的方法,使用并行算法匹配大量文本中第一次出现的模式。模式是简单的字符匹配,不涉及正则表达式。我已经设法找到了一种找到所有匹配项的可能方法,但这需要我查看所有匹配项并找到第一个匹配项 所以问题是,我是否能更成功地在进程之间分解文本并以这种方式扫描?或者最好是让第j个进程搜索模式的第j个字

首先,这是家庭作业。这就是说,这是一个非常开放的领域,对于如何开始思考这个问题(或一般的并行算法),我们几乎没有任何指导。我想要指向正确方向的指针,而不是完整的解决方案。任何有帮助的阅读都会很好

我正在研究一种有效的方法,使用并行算法匹配大量文本中第一次出现的模式。模式是简单的字符匹配,不涉及正则表达式。我已经设法找到了一种找到所有匹配项的可能方法,但这需要我查看所有匹配项并找到第一个匹配项

所以问题是,我是否能更成功地在进程之间分解文本并以这种方式扫描?或者最好是让第j个进程搜索模式的第j个字符时进行某种进程同步搜索?如果随后所有进程都为其匹配返回true,则这些进程将改变其在匹配所述模式中的位置并再次上移,直到所有字符都已匹配,然后返回第一个匹配的索引

到目前为止,我所做的是非常基本的,而且很可能不起作用。我不会实现这一点,但任何指点都将不胜感激

对于p处理器,使用长度为t的文本和长度为L的模式,以及L处理器的上限:

for i=0 to t-l: for j=0 to p: processor j compares the text[i+j] to pattern[i+j] On false match: all processors terminate current comparison, i++ On true match by all processors: Iterate p characters at a time until L characters have been compared If all L comparisons return true: return i (position of pattern) Else: i++ 对于i=0到t-l: 对于j=0到p: 处理器j将文本[i+j]与模式[i+j]进行比较 关于假匹配: 所有处理器终止当前比较,i++ 在所有处理器进行真正匹配时: 一次迭代p个字符,直到比较完L个字符 如果所有L比较都返回true: 返回i(模式位置) 其他: 我++
给定一个长度为L的模式,在p个处理器上搜索长度为N的字符串,我只需在处理器上拆分该字符串。每个处理器将采用长度为N/P+L-1的块,最后一个L-1与属于下一个处理器的字符串重叠。然后每个处理器将执行boyer-moore(两个预处理表将共享)。每次完成后,他们将结果返回给第一个处理器,该处理器维护一个表

Process Index
   1    -1
   2    2
   3    23
在所有进程都响应后(或者经过一点思考,您可以提前退出),您将返回第一个匹配。这应该是O(N/(L*P)+P的平均值

使第i个处理器与第i个字符匹配的方法需要太多的进程间通信开销


编辑:我意识到你已经有了一个解决方案,并且正在寻找一种不用找到所有解决方案的方法。我真的不认为这种方法是必要的。您可以提出一些早期转义条件,它们并没有那么困难,但我认为它们总体上不会提高您的性能(除非您对文本中匹配项的分布有更多的了解)。

我担心断开字符串不行

一般来说,早期转义是困难的,所以你最好把文本分成几段

但让我们先请Herb Sutter解释一下并行算法的搜索。我们的想法是利用分布的不均匀性来获得早期回报。当然,萨特对任何比赛都感兴趣,这不是手头的问题,所以让我们适应

这是我的想法,假设我们有:

  • 长度为
    N
  • p
    处理器
  • 启发式:
    max
    是块应包含的最大字符数,可能比模式长度大一个数量级
现在,您需要将文本分成
k
相等的块,其中
k
最小,
size(chunk)
最大,但低于
max

然后,我们有一个经典的
Producer-Consumer
模式:向
p
进程提供文本块,每个进程在接收到的文本块中寻找模式

提前逃跑是通过挂上旗帜来完成的。您可以设置找到模式的块的索引(及其位置),也可以只设置一个布尔值,并将结果存储在进程本身中(在这种情况下,一旦进程停止,您必须遍历所有进程)。关键是,每次请求块时,生产者都会检查标志,如果找到匹配项,则停止向进程提供信息(因为进程已按顺序分配块)

让我们举一个例子,使用3个处理器:

[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ]
                      x       x
6
8
都包含字符串

制作人首先将1、2和3输入到流程中,然后每个流程将按照自己的节奏前进(这取决于搜索的文本和模式的相似性)

假设我们先在
8
中找到模式,然后再在
6
中找到它。然后,处理
7
的过程结束并尝试获取另一个块,制作者停止它-->这将是无关的。然后,处理
6
的过程结束,结果是,因此我们知道第一次出现在
6
中,我们知道它的位置


关键是你不想看全文!太浪费了

您提出的算法的问题是处理器之间的通信开销太大。除非模式非常长,否则最好让每个处理器在特定点查找匹配项,并在最早的匹配项上终止。是否指定了婴儿车型号?或者你能假设什么?L处理器限制是您强加的还是问题?L处理器限制由我指定。