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

时间:2010-02-22 22:00:21

标签: algorithm language-agnostic parallel-processing string-matching

要预先做好,这个作业。话虽如此,它是非常开放的,我们几乎没有关于如何开始考虑这个问题(或一般的并行算法)的指导。我想指向正确的方向,不是完整的解决方案。任何可能有帮助的阅读都会很好。

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

所以问题是,我是否会在流程和扫描方式之间取得更多成功?或者最好是进行某种类型的进程同步搜索,其中第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++

2 个答案:

答案 0 :(得分:4)

给定长度为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个字符匹配的方法需要过多的进程间通信开销。

编辑:我意识到你已经有了解决方案,并且正在寻找一种方法,而无需找到所有解决方案。我真的不认为这种方法是必要的。你可以提出一些早期的逃生条件,它们并不那么困难,但我认为它们不会在一般情况下提高你的表现(除非你有一些额外的知识在你的文本中分配匹配)。 / p>

答案 1 :(得分:4)

我担心打破字符串是行不通的。

一般来说,早期逃避很困难,所以你最好不要破坏文本。

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

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

  • 长度为N
  • 的文字
  • p处理器
  • 启发式:max是块应包含的最大字符数,可能比模式长度的M大一个数量级。

现在,您想要的是将文本拆分为k个相等的块,其中k最小,size(chunk)最大但不如max

然后,我们有一个经典的Producer-Consumer模式:p进程用文本块进行处理,每个进程在它接收的块中查找模式。

早期逃脱是通过举旗来完成的。你可以设置你找到模式的块的索引(及其位置),或者你可以设置一个布尔值,并将结果存储在进程中(在这种情况下你必须经历所有的进程一旦停止)。关键是每次请求一个块时,生产者都会检查该标志,并在找到匹配时停止提供进程(因为已按顺序为这些进程提供了块)。

让我们举个例子,有3个处理器:

[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ]
                      x       x

68都包含字符串。

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

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

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