Sorting 推断mergesort的运行时?

Sorting 推断mergesort的运行时?,sorting,time-complexity,mergesort,Sorting,Time Complexity,Mergesort,我试图解决以下问题,这要求我将mergesort的运行时外推到更大的输入。问题是: 用户运行代码: int a=(int*) malloc (N*sizeof(int)); for (i=0; i<N; i++) { a[i] = rand(); } mergesort (a,N); inta=(int*)malloc(N*sizeof(int)); 对于(i=0;i来说,mergesort的运行时是Θ(n logn)。对于足够大的n(就像这里的数字),将运行时建模为cn logn

我试图解决以下问题,这要求我将mergesort的运行时外推到更大的输入。问题是:

用户运行代码:

int a=(int*) malloc (N*sizeof(int));
for (i=0; i<N; i++)
{
   a[i] = rand();
}
mergesort (a,N);
inta=(int*)malloc(N*sizeof(int));

对于(i=0;i来说,mergesort的运行时是Θ(n logn)。对于足够大的n(就像这里的数字),将运行时建模为cn logn形式的函数并不是不合理的

解决这个问题的一种方法是考虑n=109的运行时与n=107的运行时的比率

C109日志109/c(107日志107)

=102对数109/对数107

=102(9/7)

=128.6

因此,您预计n=109的运行时间约为n=107的运行时间的128.6倍。由于n=107的运行时间为5.3s,您预计n=109的运行时间约为681.6s。因此,列表中最好的答案是68s

这种方法——查看运行时的比率——是一种非常好的近似运行时的方法。我们也可以通过直接求解c来解决这个问题,因为运行时的形式是cn log n,并且我们知道一个特定值n的输出。我选择使用比率方法的原因是它通常有助于“注视”运行时。例如,由于运行时为Θ(n log n)您将输入大小增加了100倍,猜测运行时在n项上至少会增加100倍,然后在log n项上可能会增加一个较小的额外项,这并不是不合理的。仅此一点就可以让您猜测运行时大约为680秒


希望这有帮助!

注意,通过使用比率方法,对数的基数是多少并不重要。为了简单起见,我采用了假设基数为10的计算c的方法,得到了c=7.57e-8,但最终得到了相同的681值。太棒了!我永远不会选择比率方法。感谢你们两位的即时回复。templatetypedef than非常感谢您把这一点说得这么清楚。我真的很感谢您花时间。@Rorrik比您花这么多时间提供这么有用的信息!@Rorrik因为所有日志都是彼此的倍数(这是更改基本公式的有趣结果之一),您选择什么基本都不重要。您只需要选择一个并坚持下去即可。:-)