【问题标题】:Time complexity of a prefix sum algorithm前缀和算法的时间复杂度
【发布时间】:2018-09-13 01:40:06
【问题描述】:

鉴于以下伪代码,我想知道在尝试确定时间复杂度时我的思维过程是否正确。

for i = 0 to n-1
   Add the numbers A[0] thru A[i].
   Store the result in B[i].

该算法将循环 n 次,并且由于最后一次迭代将需要最多的计算量(n 次计算),该算法将总共进行 n^2 + f(n) 次计算。其中f(n) 是次数为n^2 的多项式 或更少。 因此该算法是二次的O(n^2)

【问题讨论】:

  • 但是B[i] = B[i-1]+a[i],没有理智的实现会在每次迭代中重复整个部分求和。您的算法可能是O(n^2),但前缀求和不是。
  • 这不应该是理智的,这只是时间复杂度的练习。

标签: algorithm time-complexity computer-science prefix-sum


【解决方案1】:

由于Add the numbers A[0] thru A[i]. 的时间复杂度为\Theta(i),因此您的代码的时间复杂度为\Theta(1 + 2 + 3 + ... + \Theta(n)) = \Theta(n^2)。因此,您对代码的分析是正确的。

【讨论】:

    【解决方案2】:

    我们可以用以下代码替换您的代码

        for i 0 to n - 1
            for j 0 to i
                b[i] += a[j]   <---
    

    为了找到这个算法的大O,我们需要计算有多少 执行第 3 行的次数。

    为了简单起见,假设所有 a[i] 元素都等于 1 所以如果我们在 i 为 0 到 n -1 时找到 b[i] 的总和 然后我们找到第 3 行运行的次数。

    i: b[i]
    0: 1
    1: 2
    2: 3
    ..
    n - 1: n
    

    因此所有 B[i] 的总和为 n * (n + 1) / 2 这是 O(n^2)

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多