Algorithm While循环的Big-O

Algorithm While循环的Big-O,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,我有这个算法,我正试图计算它的复杂性 A = {a_1, a_2, a_3, ...} w = 0 while A != empty a' = argmin(A) #a' is the element with smallest y_a if (N_a' + w > C) A = A - {a'} else x_a' = x_a' + 1 w = w + N_a' Update the y_a' value in A us

我有这个算法,我正试图计算它的复杂性

A = {a_1, a_2, a_3, ...}
w = 0
while A != empty
   a' = argmin(A)  #a' is the element with smallest y_a
   if (N_a' + w > C)
      A = A - {a'}
   else
      x_a' = x_a' + 1
      w = w + N_a'
      Update the y_a' value in A using x_a'
A是一个集合,如果条件N_A'+w>C为真,我们将从集合中删除一个元素,直到集合为空。我知道该算法至少在上运行,但如果if语句为false,它可以运行得更多。假设更新的最后一行需要固定的时间


我如何计算这里的复杂性

让我们首先确定then和else分支在最坏情况下运行的频率。在then分支中,集合A变小一个元素,因此只能执行n次,其中n是A中元素的初始数量。else分支最多可以执行C次。如果n_A'=1,则必须>=1。C是常数,所以这是O1。因此,总迭代次数为On

现在关键点是用于A的数据结构。必须支持三个操作:查找最小值、删除最小元素和最后一行中的更新。当我们选择一个最小堆时,这些操作中的每一个都可以在OLOGN中完成。请注意,在这种情况下,更新不是O1次。总运行时间现在位于日志n上

简单的最小搜索,即对A使用uordered数组,分别对、O1和O1执行min、remove元素和update操作。因此,总运行时间将为*n

使用一个有序数组来表示,我们得到三个操作的运行时间分别为O1、O1和On。每次迭代都会执行min search O1操作,以此类推。remove elemnt O1操作位于then分支中,因此执行次数为,update On操作位于else分支中,因此执行次数为。综合所有这些因素,可以得到一个On的运行时。
但是,如果必须在开始时对集合进行排序,则我们再次处于日志n上。

即使您总是选择这种情况,由于minA和A操作的收缩,所做的工作也比On要多。他们通常会服用奥龙。如果没有更多的信息,关于else一案就无从谈起。如果你运气不好,每次你有一个无限循环时,都会使用else。它不可能是一个无限循环,因为C的值。在某个点,当我们到达C时,循环将终止,除非N_a'为零或负-N_a'是一个正整数。如果没有细节,就不可能指定运行时间,或者即使算法终止。非常清楚的分析和解释,但我会回来与您讨论。您能看看这个问题吗?