用于字符串匹配的随机算法

时间:2016-03-31 06:37:03

标签: string algorithm random pattern-matching

问题:

根据字母t[1...n, 1...n]提供文字p[1...m, 1...m]n = 2m[0, Sigma-1],我们说p匹配t [i,j]所有t[i+k-1, j+L-1] = p[k,L]的if k,L。设计一个随机算法,以高概率在O(n^2)时间内找到所有匹配。

图片:

enter image description here

有人可以帮我理解这段文字的含义吗?我相信它说't'中有两个单词,而且模式也是两个单词,但两种模式的长度都是't'的一半。但是,从这里我不明白[i,j]的范围如何发挥作用。 if语句超出了我的想法。

这也可以说t和p是二维数组,你试图匹配t二维数组中模式的“框”。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

问题要求您找到2D pattern,即由p数组中的t数组定义,该数组也是2D。

此问题最明显的随机解决方案是生成两个随机索引ij,然后从(i, j)开始搜索模式。

为避免进行冗余搜索,您可以跟踪之前访问过的(i, j)对,可以使用简单的查找2D数组来完成。

在最坏的情况下,上述复杂性为O(n^3)

您还可以使用hashing比较字符串,将复杂度降低到O(n^2)

首先需要逐行散列t数组并将值存储在hastT之类的数组中,您可以使用Rolling hash algorithm

然后,您可以使用Rolling hash算法对p数组进行哈希处理,并在数组hashP中逐行存储哈希值。

然后,当您生成随机对(i, j)时,您可以在线性时间内使用数组t获取相应hashT数组的哈希值,而不是采用二次方的蛮力比较时间和比较(注意,当哈希匹配完全可以肯定时,哈希中可能存在冲突)。

要使用hashT查找相应的哈希,我们可以执行以下操作,假设当前对(i, j)(3, 4)p数组的维度为{ {1}}。

然后我们可以比较2 x 3找到结果,上面的逻辑来自hashT[3][7] - hash[3][3] == hashP[3]

使用散列进行线性时间搜索的伪代码:

rolling hash algo