Sorting 跟踪运行时复杂性

Sorting 跟踪运行时复杂性,sorting,big-o,Sorting,Big O,对于任何方法,计算运行时复杂性的最佳方法是什么?对于像bubblesort这样的非递归方法,很容易做到这一点 outer-for loop { inner-for loop { compare and exchange } } 要进行检查,最好的方法是在最内部的循环中放置一个计数器。但是,当方法是递归的时候,我应该把计数器放在哪里,例如merge sort sort(int[] array){ left = first-half

对于任何方法,计算运行时复杂性的最佳方法是什么?对于像bubblesort这样的非递归方法,很容易做到这一点

outer-for loop
{
   inner-for loop
      {
           compare and exchange
      }
}
要进行检查,最好的方法是在最内部的循环中放置一个计数器。但是,当方法是递归的时候,我应该把计数器放在哪里,例如merge sort

sort(int[] array){

    left = first-half
    right = second-half

    sort(left);
    sort(right);
   ret merge(left, right);

}

merge(int[] left, right)
{
    count = length(left + right);
    int[] result;
    loop-count-times
    {
       compare and put in result;
    }

  return result;
}
因为这是合并排序,所以big(o)是o(n logn),所以一个100整数的数组应该返回一个正好为200的big-o。柜台在哪里?如果我把它放在排序的顶部(…),我得到的平均值是250280300,这应该是错误的。这个柜台最好放在哪里

参考资料:


谢谢。

我想你对大O符号的概念有点误解了。如果复杂度为O(n logn)且n的值为100,则没有严格的规则规定程序应该以200的大O执行。它只给了我们一个上限。例如,考虑具有O(N2)复杂度的选择排序。即使n是100,如果列表已经排序,内部循环中设置的计数器也不会给出1002作为结果。所以在你们的情况下,你们得到的答案(250280300等等)是完全正确的。因为所有的答案都受到k乘以n logn的限制,其中k是一个任意常数

因为这是合并排序,所以big(o)是o(n logn),所以一个100整数的数组应该返回一个正好为200的big-o

甚至不接近右边

使用大Ordo表示法表示的计算复杂性不会告诉您将执行多少步骤/计算操作。它之所以被称为“渐进的且不完全相同的复杂性”是有原因的:它只提供了一个函数,该函数相对于输入的大小接近算法的运行时间(更精确地说,给出了一个更高的界限)。

所以
O(n log n)
并不意味着对于100个元素,将执行200个操作(顺便说一句,为什么对数的底必须是10?),它告诉您,如果您增加输入的大小,(平均情况)运行时间将与添加的输入数据的数量成比例,乘以此附加数据数量的对数

要点:如果要计算递归函数的调用次数,应将计数器作为参数输入,如下所示:

void merge_sort(int array[], size_t length, int *counter)
{
    (*counter)++;
    // apply the algorithm to `array`:
    merge_sort(array, length, counter);
}
int num_calls = 0;
merge_sort(array, sizeof(array) / sizeof(array[0]), &num_calls);
printf("Called %d times\n", num_calls);
这样称呼它:

void merge_sort(int array[], size_t length, int *counter)
{
    (*counter)++;
    // apply the algorithm to `array`:
    merge_sort(array, length, counter);
}
int num_calls = 0;
merge_sort(array, sizeof(array) / sizeof(array[0]), &num_calls);
printf("Called %d times\n", num_calls);

我同意这两种回答,但是,根据维基百科(参考文章),合并排序的最坏情况是nlog n。我由此假设,每种情况都会产生nlog n复杂性。另一方面,快速排序可以在n*logn和n^2之间变化(最坏的情况),但是合并排序不会。如果函数f(n)是O(n logn),则f(n)所花费的时间小于或等于(k*n*logn),其中k是常数。你在分析中没有考虑这个常数。哦,是的,这是一个很好的观点。我忘了,现在看起来很复杂。