【问题标题】:First-Occurrence Parallel String Matching Algorithm首次出现的并行字符串匹配算法
【发布时间】:2011-01-19 20:25:45
【问题描述】:

首先,这功课。话虽如此,它是非常开放的,对于如何开始思考这个问题(或一般的并行算法),我们的指导几乎为零。我想要正确方向的指针,不是一个完整的解决方案。任何可能有帮助的读物也会非常好。

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

所以问题是,我会更成功地在进程之间分解文本并以这种方式扫描吗?还是最好进行某种进程同步搜索,其中第 j 个进程搜索模式的第 j 个字符?如果所有的进程都为它们的匹配返回真,这些进程将改变它们在匹配所述模式中的位置并再次向上移动,直到所有字符都匹配,然后返回第一个匹配的索引。

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

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

对于 i=0 到 t-l: 对于 j=0 到 p: 处理器 j 将 text[i+j] 与 pattern[i+j] 进行比较 在错误匹配上: 所有处理器终止当前比较,i++ 在所有处理器真正匹配时: 一次迭代 p 个字符,直到比较了 L 个字符 如果所有 L 比较返回 true: 返回 i(模式的位置) 别的: 我++

【问题讨论】:

  • 您提出的算法的问题在于处理器之间的通信开销过多。除非模式非常长,否则最好让每个处理器在特定点查找匹配,并在最早的匹配处终止。
  • 是否指定了 PRAM 型号?或者你可以假设吗? L处理器的限制也是你强加的还是问题?
  • L 处理器限制是我指定的。我假设内存没有共享,因为这是使用 MPI 的借口。

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


【解决方案1】:

恐怕断线不行。

一般来说,提前转义是很困难的,所以你最好把文本分成块。

但是让我们先在Dr Dobbs 上请 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

68 都包含字符串。

生产者将首先向进程提供 1、2 和 3,然后每个进程将按照自己的节奏前进(这取决于搜索的文本的相似性和模式)。

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

关键的想法是你不想看整个文本!太浪费了!

【讨论】:

  • +1 很棒的答案。任务早就上交了,但我很想看看它是如何工作的。我倾向于沉迷于有趣和有趣的问题数周。 :) 我确实希望其他人发现这个答案也有用并对其进行升级,因为它是我见过的最清晰的答案之一。
【解决方案2】:

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

编辑:我意识到您已经有了解决方案,并且正在寻找一种方法,而无需找到所有解决方案。好吧,我真的不认为这种方法是必要的。你可以想出一些早期的转义条件,它们并不难,但我认为它们一般不会提高你的表现(除非你对文本中匹配的分布有一些额外的了解)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2011-10-25
    • 2016-06-10
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多