【问题标题】:Stack & queue complexity堆栈和队列复杂度
【发布时间】:2015-10-28 02:38:46
【问题描述】:
def sumarray(a)
    q = Queue.new
    for i in 0..(a.length-1)
        q.enqueue(a[i])
    end
    sum = 0
    while q.length > 0
        sum = sum + q.dequeue
    end
    return sum
end

假设上述算法中使用的队列实现:

入队操作是 O(1) 出队操作是 O(k),其中 k 是当前队列中的元素数 考虑到队列操作,上述 sumarray 算法的整体复杂度是多少?

有人能解释一下复杂性是如何产生的吗?谢谢!

【问题讨论】:

  • 这是我必须划清界限的地方,说去谷歌大 O 表示法。那里有太多的信息可以解释这一点。让谷歌给你指路。

标签: ruby stack queue complexity-theory


【解决方案1】:

很明显,第一个循环是 O(n),其中 n=a.length

for i in 0..(a.length-1)
    q.enqueue(a[i])
end

第二个循环正在执行n 次,而q.dequeue 是 O(n),所以我们得到 O(n2)

while q.length > 0
    sum = sum + q.dequeue
end

所以总体复杂度是 O(n2) 中最差的

现在你可能会说,由于q 每次迭代都在变小,所以这个论点被过度简化了。因此,让我们总结所有q.dequeue 的复杂性。

O(n) + O(n-1) + O(n-2) + O(n-3) ... O(1)

这看起来像一个三角形数字序列吗?所以我们知道公式

n + (n-1) + (n-1) + ... + 1 = n*(n+1)/2

(n*n + n) / 2  

丢弃常数因子和低阶复杂度留下n*n

【讨论】:

  • 我认为你迭代 n 次是理所当然的。或者在问题的情况下k次。所以出队是迭代过程的一部分。您仍在实际循环中执行 O(n) 步骤。事实上,循环的每次迭代中的步骤也需要 O(k),因为出队步骤需要花费 O(k) 时间,这使得它进入 O(k^2)。因此,对于 k 次迭代,我们每次迭代都执行 k 步。这将等于 k*k = k^2。我仍然认为他应该在谷歌上搜索这个以查看他需要的尽可能多的示例。
  • 我的错,我的意思是她需要。成为开发者的诅咒。我们有时会忘记人类中还有另一种性别。幸运的是,它们在办公室变得越来越少见。一个非常受欢迎的变化:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 2014-07-21
  • 2015-11-16
  • 2019-03-07
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多