算法时间复杂度的计算方法

时间:2019-02-19 09:11:14

标签: sorting time-complexity

虽然在某种程度上熟悉直观地确定算法的复杂性,但我对如何实际计算算法有些迷惑。

对于以下代码,我知道如何确定复杂性吗?

list = [...]
start = list[0]
end = null 
remove list[0] from list

while(list.length > 0) {
  for(i = 0; i < list.length; i++) {
    if(list[i] is immediately before start or immediately after end) {
       link list[i] to start or end (populate end if null)
       remove list[i] from list
    } 
  }
}

这假定一个有效的数据集(必须排序的元素的连续链接列表)。出于说明目的也进行了简化;

因此,在最佳情况下,如果列表已排序,则为O(n),因为您只需要通过即可对其进行处理并将其弹出。

我无法确定是最坏的情况,因为每一次“ while”迭代,数据集都会变小至少1个元素(通常为2个或更多),因为它假定数据集将始终有效。因此,它显然小于O(n ^ 2)(我认为)。欢迎所有想法。

谢谢!

更新 绘制出来后,似乎是O(nlogk(n)),其中k = n ^(2 /(n + 1)) 这算作O(nlog(n))吗?我不清楚。

1 个答案:

答案 0 :(得分:1)

Big O表示法旨在为函数的增长率提供上限,因此您必须考虑最坏的情况。

在最坏的情况下,我假设在每次迭代中数据集都会变小1个元素,因此您要执行的操作数将受到n + n-1 + n-2 ... + 2 + 1的约束,而(n+1)*n / 2等于{% for field in form %} {{ field|as_crispy_field }} {% endfor %} ,即O(n ^ 2)