有人可以提供一个O(n * log n)算法,该算法接受长度为n的数组,该数组包含该范围内的元素 {1,2,3 .... n}作为输入并检查数组是否包含2b = a + c?我知道如何在O(n * n)中进行,但我需要将其优化为O(n * log n)。
答案 0 :(得分:2)
如果你不知道答案,请不要嘲笑这些问题。我通过评论中发布的链接自己找到了答案。 来源:O(nlogn) Algorithm - Find three evenly spaced ones within binary string
解决方案是, 设L = [1,2,4,5,8]。
对于L中的每个k,用项xk创建多项式p。对于上面的例子,我们使多项式p(x)=(x + x2 + x4 + x5 + x8)。这一步是O(n)。
使用快速傅立叶变换求多项式q = p2。对于上面的例子,我们得到多项式q(x)= x16 + 2x13 + 2x12 + 3x10 + 4x9 + x8 + 2x7 + 4x6 + 2x5 + x4 + 2x3 + x2。这一步是O(n log n)。
忽略除了对应于x2k的所有项,对于L中的某些k。对于上面的例子,我们得到项x16,3x10,x8,x4,x2。如果您选择执行此步骤,则此步骤为O(n)。
这里的关键点:L中任何x2b的系数恰好是L中的对(a,c)的数量,使得a + c = 2b。 [CLRS,Ex。 30.1-7]一个这样的对是(b,b)总是(因此系数至少为1),但如果存在任何其他对(a,c),那么系数至少为3,来自(a,c) )和(c,a)。对于上面的例子,由于AP(2,5,8),我们将x10的系数精确地设为3。 (由于上述原因,这些系数x2b将始终为奇数。并且q中的所有其他系数将始终为偶数。)
因此总时间复杂度不会超过O(n * logn)。
三江源。