【问题标题】:Method for calculating the time complexity of an algorithm计算算法时间复杂度的方法
【发布时间】:2019-02-20 01:35:23
【问题描述】:

虽然对直观地确定算法的复杂性有点熟悉,但我对如何实际计算它有点迷茫。

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

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)) 吗?我不清楚。

【问题讨论】:

    标签: sorting time-complexity


    【解决方案1】:

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

    在最坏的情况下,我会假设在每次迭代中数据集将减小 1 个元素,因此您要执行的操作数将受 n + n-1 + n-2 ... + 2 + 1 的约束,它等于 (n+1)*n / 2,即 O(n^ 2)

    【讨论】:

    • 感谢您的回答,但 (n * (n+1)) / 2 != n^2 除非 n = 0 或 1,否则这不是预期的数据集。这种等价性是如何达到的?我假设 n^2 相当于数据集每次迭代都不会变小。
    • 你不能自己比较这些计算的结果,只能比较它们的 O 比较顺序。 (n²+n)/2 因子的限制,因此它确实是 O(n²)。大 O 表示法表示的是算法运行所需的时间如何与其接收的输入成比例,在这种情况下,即使常数
    猜你喜欢
    • 2011-06-21
    • 2016-02-27
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多