当字母表由5个符号{a,b,c,d,#}组成时,我试图解决精确的模式匹配问题,其中特殊符号#匹配任何符号(包括其自身)。
例如,如果T = ab#aca#ab#a和P = da#ac则P从T中的位置3开始。我试图找到一个O(nlogn)时间算法来确定是否有模式P长度为n的长度n出现在长度为2n的文本T中,假设在T和P中出现#符号(可能是O(n)次)。
有关如何使用卷积解决问题的任何建议?
答案 0 :(得分:7)
我认为您可以按照浮点精度处理任意字母大小的问题。对于n个字符的字母表,将文本字符映射到(复数)n个统一的根。对于模式字符,将#映射到0,并将普通字符映射到相应文本字符的乘法逆,以及统一的第n个根。
然后使用卷积定理在每个点处计算出该点上文本的点积与模式。如果文本和模式匹配,产品的每个组件都是0(在外卡)或1,从r * r ^ -1,所以如果你有匹配,结果将是m,其中m是数字模式中的非通配符字符。如果没有匹配,那么点积的所有组件都不会是1.将这些复数视为二维向量,这些向量与向量表示1的点积将小于m,所以不匹配不会导致结果m并且看起来像匹配。
我注意到,如果将文本分成几倍于模式长度的缓冲区,则可以合理有效地使用该长度的FFT,因此复杂度不是n log n,其中n是长度要搜索的文本,但是n log m,其中m是模式的长度。尽管如此,在我相信这是一种竞争方法之前,我需要看到基准时间,甚至与天真的搜索进行比较。
答案 1 :(得分:0)
BNDM算法可以处理通配符as this implementation shows,并且在平均情况下满足您的速度要求。但是,它具有O(nm)最坏情况的复杂性。
为什么要在这里要求卷积?
答案 2 :(得分:0)
我对如何做到这一点有一个想法。
计算T和P之间的互相关函数。通过卷积T和P来完成。对于长信号,通过快速傅立叶变换最有效地完成卷积,并且它需要与N * log(N)成比例的时间:
Cross-correlation
Convolution
Fast Fourier transform
然后查找互相关函数的最大值。它将告诉T和P对齐的位置。
卷积必须处理“#”作为一种特殊情况,除非保证在T中找到P,否则必须在最后明确检查。