如何计算算法的运行时间?

时间:2014-10-03 09:04:57

标签: c++ runtime

在我试图弄清楚如何计算运行时间时,我看到了这段代码。据我所知,两个for循环计算为n^2,但交换部分会让我失望。我想了解交换部分是否对最坏情况的运行时有任何影响,这只是O(n^2)吗?

for(i = -1; i < N; i++) {
    for(j = 0; j < N-1; j++) {
        if a[j] > a[j + 1] {
            swap( a[j], a[j + 1] )
        }
    }
}

3 个答案:

答案 0 :(得分:0)

确定最坏的情况,考虑最坏情况的数据设置,然后使用time命令测量程序工作的实时,时间命令显示时间,经过时间,CPU时间(sys和用户)

答案 1 :(得分:0)

for(int i = 0; i < N-1; ++i) {
    for(int j = 0; j < N-1; ++j) {
        if a[j] > a[j + 1] {
            swap(a[j], a[j + 1]);
        }
    }
}

比较次数恒定为(n-1)*(n-1)。交换次数取决于输入数组。最坏的情况是反向排序的数组:{n,n-1,n-2,...,2,1}这会产生n *(n-1)/ 2个交换。

对于bubblesort,只要内部循环没有产生交换,你就可以暂停:

for(int i = 0; i < N-1; ++i) {
    bool hasSwap = false;
    for(int j = 0; j < N-1; ++j) {
        if a[j] > a[j + 1] {
            swap(a[j], a[j + 1]);
            hasSwap = true;
        }
    }
    if(!hasSwap)
        break;
}

现在比较的次数也取决于输入数组。

答案 2 :(得分:0)

最坏情况下的计算复杂度为O(n ^ 2),如您所描述的那样,只要整体复杂性涉及主要项为O(n ^ 2),则可以忽略比较和交换,代码可以是改写如下:

for(i = -1; i < N; i++)
  for(j = 0; j < N-1; j++)
    function...

你应该看看big-O简化的规则:

  • 如果f(x)是几个术语的总和,则保留增长率最大的术语,并忽略所有其他术语。
  • 如果f(x)是多个因子的乘积,则省略任何常数(产品中不依赖于x的项)。