string - 字符串匹配的随机算法

标签 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] 对于所有 k,L。设计一种随机算法,以高概率在 O(n^2) 时间内找到所有匹配项。

图片:

enter image description here

谁能帮我理解这段文字的意思?我相信这是在说“t”中有两个词,模式也是两个词,但两个模式的长度都是“t”的一半。但是,从这里我不明白 [i,j] 的范围是如何发挥作用的。那个 if 语句让我难以理解。

这也可能是说 t 和 p 是二维数组,而您正在尝试从 t 二维数组中的模式匹配“框”。

如有任何帮助,我们将不胜感激,谢谢!

最佳答案

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

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

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

上面的复杂度在最坏的情况下是O(n^3)


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

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

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

然后在生成随机对(i, j)时,可以使用数组hashT得到对应t数组的hash > 在线性时间内而不是需要二次时间的暴力比较并进行比较(请注意,哈希中可能存在冲突,您可以在哈希完全匹配时进行暴力比较)。

要使用hashT 找到相应的散列,我们可以执行以下操作,假设当前对(i, j)(3, 4)p 数组的维度是 2 x 3

然后我们可以通过比较hashT[3][7] - hash[3][3] == hashP[3]来求出结果,以上逻辑来自rolling哈希算法

使用哈希在线性时间内搜索的伪代码:

hashT[][], hashS[]

i = rand(), j = rand();

for(int k = i;k < i + lengthOfColumn(p);i++){
    if((hashT[i][j + lengthOfRow(p)] - hashT[i][j-1]) != hashP[i]){
        //patter does not match.
        return false;
    }
}

关于string - 字符串匹配的随机算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36325870/

相关文章:

python - 如何在matplotlib中显示LaTeX f字符串

c# - 多次比较字符串

java - 为什么这个算法使用Java中的按位与运算符?

algorithm - 点与高度图之间的距离

mysql - 查询优化以查找随机样本

string - 给定一个字符串,原始字符串在其所有唯一子字符串的排序(字典顺序)序列中的排名是多少

javascript - 正则表达式返回未定义

python - 在 Python 中连接两个字符串并删除第一个 ',' 之前的所有内容的最有效方法是什么?

html - 从一个 URL 获取不同的图像

java - 在 Java 中生成唯一的随机数