【发布时间】:2014-06-23 07:32:27
【问题描述】:
我需要有范式的多项式的数组系数,所以我需要乘以长括号序列:
(x-1)(x-2)(x-3)...(x-n)。
我怎样才能以最佳的时间复杂度做到这一点?
【问题讨论】:
标签: c++ algorithm multiplication
我需要有范式的多项式的数组系数,所以我需要乘以长括号序列:
(x-1)(x-2)(x-3)...(x-n)。
我怎样才能以最佳的时间复杂度做到这一点?
【问题讨论】:
标签: c++ algorithm multiplication
最佳可能时间复杂度不是一个好问题,因为最佳可能时间并不总是最佳可能复杂度,并且有大量变量会进入最佳可能时间。
我强烈建议首先实施一种幼稚的方法(即首先想到什么)。完成后,看看它是否足够快,如果是,那才是最重要的。
(顺便说一句,天真的解决方案可能是O(n),我认为最佳解决方案仍然是O(n))
【讨论】:
O(1) 中完成,使用 gamma 函数来计算阶乘,或者类似的东西(我的数学刚刚有点生疏)。跨度>
1..n,或者实际上是array[0]..array[n-1]。尤其是当他们说“多项式的数组系数”时。
我怀疑算法存在的复杂性优于 O(n^2)。给定根 [1..n] 的多项式系数可以通过Vieta's theorem 表示,其中每个系数都是根积的复数和。这是一个相当有效的 Delphi 示例(改编自一些 Fortran 数值库)。
对于 n =3,它产生 [-6, 11, -6, 1] 系数:
(x-1)*(x-2)*(x-3)=x^3-6*x^2+11*x-6
procedure CalcPolyCoeff(const N: Integer; var Coeff: TArray<Integer>);
var
i, k: Integer;
begin
if N = 0 then
Exit;
SetLength(Coeff, N + 1);
Coeff[0] := -1;
Coeff[1] := 1;
for k := 2 to N do begin
Coeff[k] := 1;
for i := k - 2 downto 0 do
Coeff[i + 1] := Coeff[i] - k * Coeff[i + 1];
Coeff[0] := -k * Coeff[0];
end;
【讨论】: