Ruby 堆栈和队列复杂性

Ruby 堆栈和队列复杂性,ruby,stack,queue,complexity-theory,Ruby,Stack,Queue,Complexity Theory,假设上述算法中使用的队列实现: 排队操作为O1 出列操作正常,其中k是队列中当前的元素数 考虑到队列操作,上述sumarray算法的总体复杂度是多少 有人能解释复杂性是如何产生的吗?谢谢 希望很明显,第一个循环位于n=a.length的位置 def sumarray(a) q = Queue.new for i in 0..(a.length-1) q.enqueue(a[i]) end sum = 0 while q.length >

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

排队操作为O1 出列操作正常,其中k是队列中当前的元素数 考虑到队列操作,上述sumarray算法的总体复杂度是多少


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

希望很明显,第一个循环位于n=a.length的位置

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
第二个循环执行了n次,q.dequeue处于打开状态,因此我们得到了On2

因此,总体复杂性是On2中最糟糕的

现在你可能会说,因为每次迭代q都变小了,所以这个论点过于简化了。因此,让我们将所有的q.出列复杂性相加

while q.length > 0
    sum = sum + q.dequeue
end
这看起来像一系列三角形数字吗?所以我们知道这个公式

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


去掉常数因子和低阶复杂度,剩下n*n

这就是我必须画线的地方,然后说go google big O符号。解释这一点的信息太多了。让谷歌给你指路吧。我认为你迭代了n次是有条件的。或者在问题的情况下是k次。因此,出列是迭代过程的一部分。您仍然在实际循环中执行步骤。循环的每个迭代中的步骤也采用Ok,因为出列步骤被指定为采用Ok时间,这一事实使它进入Ok^2。所以我们每次迭代都要做k步,每次迭代都是k步。这等于k*k=k^2。我仍然认为他应该在谷歌上搜索,看看他需要多少例子。我的错,我的意思是她需要。开发者的诅咒。我们有时会忘记人类中还有另一种性别。幸运的是,它们在办公室里越来越少了。一个非常受欢迎的变化:。
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