算法的运行时和输入大小如何告诉您算法的时间复杂度?

时间:2017-09-25 01:28:04

标签: algorithm sorting time-complexity quicksort mergesort

我做了一个实验计算排序算法的平均运行时间合并排序和快速排序大小为n的数组,我不知道如何证明合并排序和快速排序是结果中的O(log2(n))。

结果在这里:

n       mergeSort:       # mergeSort:    quickSort:      quickSort
        mean runtime     mean runtime/   mean runtime    mean runtime/
        (nanosecs)       (n*log2(n))     (nanosecs)      (n*log2(n))
10      49833           1500            17048           513             
100     31245           47              58956           88              
1000    363917          36              158396          15              
10000   2050911         15              1306825         9               
100000  15513647        9               13075212        7               
1000000 183957966       9               153438217       7               
2000000 376220756       8               317621177       7   

我注意到,当n增加时,平均运行时间除以n * log2(n)似乎变得恒定,那么这是否意味着当n增加时,时间复杂度变得更接近nlog2(n)?

2 个答案:

答案 0 :(得分:1)

一般来说,无法通过基准测试来检查算法的复杂性(甚至更少证明)。

因为在时间函数的低阶项之前变得可以忽略并且真实地出现了asymtotic行为需要大的N.同时,大N打破了恒定时间内存访问的常见假设。在现代机器上,这个假设根本不存在。

对于您的数据,在情节中,您无法通过linlog法来判断线性定律。

enter image description here

答案 1 :(得分:0)

对于基本双向合并排序,移动次数为n⌈log2(n)⌉,但比较次数因数据而异,但时间复杂度为O(n log(n))且变化在常数。快速排序运行时间会受到数据的极大影响,并且根据您的数字,我假设您正在测试伪随机数据。

一旦数组变得太大以至于缓存局部性成为问题,运行时将会增加。合并排序和快速排序的变体也会影响运行时间。对于较小的阵列,自下而上合并排序比自上而下快一点,因为自上而下的推送和弹出运行边界的索引对与堆栈之间的开销。更大的数组,大部分时间都花在合并部分,从上到下和自下而上合并排序可以是相同的。