该问题要求您找到2D pattern
,即阵列在t
阵列中定义,该阵列也是2D阵列。
这个问题的最明显的随机解决方案是生成两个随机索引i
和j
然后开始搜索该模式从(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;
}
}
太谢谢你了!你的解释很棒!它帮助我以不同的方式思考问题。 –
没问题,乐意帮忙。你可能想阅读这篇文章关于滚动哈希:https://www.quora.com/What-is-a-rolling-hash-and-when-is-it-useful – uSeemSurprised
不错,绝对澄清事情多一点。 –