堆栈&队列复杂性

时间:2015-10-28 02:38:47

标签: ruby stack queue complexity-theory

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算法的整体复杂性是什么?

有人可以解释复杂性是如何产生的吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

所以整体复杂性是O(n 2 )中最差的

现在你可以说,由于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