【问题标题】:Randomized algorithm for string matching字符串匹配的随机算法
【发布时间】:2016-07-19 11:05:45
【问题描述】:

问题:

给定文本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) 时间内的所有匹配项。

图片:

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

这也可能是说 t 和 p 是 2D 数组,而您正试图从 t 2D 数组中的模式匹配一​​个“框”。

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

【问题讨论】:

    标签: string algorithm random pattern-matching


    【解决方案1】:

    问题要求您在同样是二维的t 数组中找到2D pattern 即由p 数组定义。

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

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

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


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

    您首先需要对t 数组逐行进行哈希处理并将值存储在类似hastT 的数组中,您可以使用Rolling hash algorithm

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

    然后当你生成随机对(i, j)时,你可以使用数组hashT在线性时间内得到对应t数组的哈希值,而不是需要二次时间和比较的蛮力比较(注意那里可能是哈希中的冲突,当哈希完全匹配时,您可以暴力破解)。

    要使用hashT找到对应的哈希,我们可以这样做,假设当前对(i, j)(3, 4)p数组的维度是2 x 3

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

    使用散列在线性时间内搜索的伪代码:

    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;
        }
    }
    

    【讨论】:

    • 非常感谢!你的解释太棒了!它帮助我以不同的方式思考问题。
    • 没问题,乐于助人。您可能想阅读这篇关于滚动哈希的帖子:quora.com/What-is-a-rolling-hash-and-when-is-it-useful
    • 很好,肯定会进一步澄清一些事情。
    猜你喜欢
    • 2013-07-02
    • 2011-09-16
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2016-07-19
    • 2021-11-06
    相关资源
    最近更新 更多