求(displaystylesum_{i=0}^na_i cdot b_i)
对于求(displaystylesum_{i=0}^na_i cdot b_i) 把b数组翻转一下, 等价于求(displaystylesum_{i=0}^na_i cdot b_{n-i}), 这不就是一个卷积嘛, 时间复杂度(Theta(nlog_n))
你可能会说时间复杂度变得更差了,还带了大常数, 别急, 它在求解许多个乘机时有妙用
如求
[Max_{j=0}{displaystylesum_{i=j}^{j+n-1}a_i cdot b_{i-j} }
]
其中a和b是两个数组, b数组的长度是n, 你想求从a的每一个位置开始,与b按位相乘的最大值
如果按照上面的做法, 设:
[c_j = displaystylesum_{i=j-n+1}^{j}a_i cdot b_{i-(j-n+1)}
]
所求就是c数组n以上的项的最大值, 到这已经可以解决一些题目了, 如礼物
如果应用到字符串问题上呢?
有字符串s和t, 假设他们只有四种字符, 求t在s中所有出现的位置
妈妈我会KMP, KMP显然可以(O(n))解决,但是它太优秀了,所以我们要一个(Theta(nlog_n))的算法
一个一个字符考虑, 比如字符c,温两个多项式,在原串中此位置是否为c, 是为1, 否为0
对于从某个位置开始匹配, 如果按位相乘(displaystylesum_{i=0}^na_i cdot b_i) 所得不就是b和a有多少位置都是c嘛, 如果枚举所有字符,并将答案相加,如果恰好等于n,那么说明完全匹配上了
这个是可以用我们上面提到的多项式优化的