【问题标题】:Brackets multiplication括号乘法
【发布时间】:2014-06-23 07:32:27
【问题描述】:

我需要有范式的多项式的数组系数,所以我需要乘以长括号序列:

(x-1)(x-2)(x-3)...(x-n)。

我怎样才能以最佳的时间复杂度做到这一点?

【问题讨论】:

    标签: c++ algorithm multiplication


    【解决方案1】:

    最佳可能时间复杂度不是一个好问题,因为最佳可能时间并不总是最佳可能复杂度,并且有大量变量会进入最佳可能时间。

    我强烈建议首先实施一种幼稚的方法(即首先想到什么)。完成后,看看它是否足够快,如果是,那才是最重要的。

    (顺便说一句,天真的解决方案可能是O(n),我认为最佳解决方案仍然是O(n)

    【讨论】:

    • 我认为这个问题实际上可以在恒定复杂度O(1) 中完成,使用 gamma 函数来计算阶乘,或者类似的东西(我的数学刚刚有点生疏)。跨度>
    • @rodrigo:很难从帖子中看出他们是否有代码暗示的1..n,或者实际上是array[0]..array[n-1]。尤其是当他们说“多项式的数组系数”时。
    • 也许我问错了问题。我只是不知道该怎么做。我需要将这些系数保存在一个数组中,我无法想出简单的算法......但我有一个想法。这仍然是 O(n^2),但我认为这就足够了。我不知道如何在 O(n) 中实现它,如果在每次乘法之后我必须添加具有相同 x 度数的系数。我的算法:两个数组。 i 乘法后的系数将在第一个,并且在从 1 到 n 的每一步中,我将执行操作 tab2[j] = tab1[j-1] * i,然后对于所有元素 tab1, tab1[ j] += tab2[j]。仍在寻找 O(n)。
    • @ago, 1..n,如拉格朗日公式。抱歉语法错误,在波兰我们的句子结构有点不同。
    • @user3608878:听起来您确实遇到了算法简化问题,您想在其中获取一个方程式并在一些中间步骤中进行烘焙。不幸的是,这不是最好的地方,math.stackexchange.com 可能会让你的运气更好
    【解决方案2】:

    我怀疑算法存在的复杂性优于 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多