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算法的整体复杂性是什么?
有人可以解释复杂性是如何产生的吗?谢谢!
答案 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