问题:
根据字母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)
时间内找到所有匹配。
图片:
有人可以帮我理解这段文字的含义吗?我相信它说't'中有两个单词,而且模式也是两个单词,但两种模式的长度都是't'的一半。但是,从这里我不明白[i,j]的范围如何发挥作用。 if语句超出了我的想法。
这也可以说t和p是二维数组,你试图匹配t二维数组中模式的“框”。
任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
问题要求您找到2D pattern
,即由p
数组中的t
数组定义,该数组也是2D。
此问题最明显的随机解决方案是生成两个随机索引i
和j
,然后从(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