我知道以下推理有问题,但我不确定它是什么。
FFT:
给出两个多项式
A = a_0 + a_1 x + a_2 x^2 + ... + a_n x^n
和
B = b_0 + b_1 x + b_2 x^2 + ... + b_n x^n
您可以计算产品的系数
AB = \sum _k = 0 ^ 2n ( \sum _ j = 0 ^ k (a_j b_{k-j}))x^k
在O(n log n )
时间。
因此我们可以计算两个向量(a_0, ..., a_n)
和(b_0, ..., b_n)
v_i = \sum j = 0 ^ k ( a_j b_{k-j})
时间内的向量O(n log n)
(通过将向量嵌入零中。)
鉴于上述情况,我们应该能够通过预处理其中一个来计算A =(a_0, ..., a_n)
和B =(b_0, ..., b_n)
A.B = \sum_j=0 ^ n a_j b_j
O(n log n)
的点积。向量说B
为B' = (b_n, b_{n-1}, ..., b_1, b_0)
,然后在O(n log n)
时间内计算卷积。
如果上述推理是正确的,那么这意味着我们可以通过在nxn
时间O(n^2 log n )
计算点积来在O(n log n)
时间内实现两个O(n)
矩阵的矩阵乘法次。
然而,我们知道矩阵乘法的最佳运行时间大约是O(n^2.4)
所以这似乎不太可能是正确的,这可能意味着步骤1,2或3是不正确的。
答案 0 :(得分:4)
产品中有n^2
个条目,而不是n
,因此此算法为O(n^2 * n * log n) = O(n^3 log n)
。
计算点积的最佳算法是O(n)
,而不是O(n log n)
。这就是为什么矩阵乘法的朴素算法是O(n^3)
。 (这是n^2
点产品,可以在O(n)
时间内完成。
答案 1 :(得分:2)
我想知道为什么在步骤3中你可以在O(n log n)时间内计算点积,因为众所周知点积可以在O(n)时间内计算出来?步骤2看起来像线性时间而不是O(n log n)步骤?
关于O(n ^ 2 log n)的结论也不符合逻辑。您不能将点积O(n)乘以AB矩阵 - 据我所知您必须采用O(n ^ 2)点积,导致(根据您的分析)O(n ^ 3 log n)不如标准O(n ^ 3)。这是因为你的奇怪的O(n log n)点积结果。