我做了一个实验计算排序算法的平均运行时间合并排序和快速排序大小为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)?
答案 0 :(得分:1)
一般来说,无法通过基准测试来检查算法的复杂性(甚至更少证明)。
因为在时间函数的低阶项之前变得可以忽略并且真实地出现了asymtotic行为需要大的N.同时,大N打破了恒定时间内存访问的常见假设。在现代机器上,这个假设根本不存在。
对于您的数据,在情节中,您无法通过linlog法来判断线性定律。
答案 1 :(得分:0)
对于基本双向合并排序,移动次数为n⌈log2(n)⌉,但比较次数因数据而异,但时间复杂度为O(n log(n))且变化在常数。快速排序运行时间会受到数据的极大影响,并且根据您的数字,我假设您正在测试伪随机数据。
一旦数组变得太大以至于缓存局部性成为问题,运行时将会增加。合并排序和快速排序的变体也会影响运行时间。对于较小的阵列,自下而上合并排序比自上而下快一点,因为自上而下的推送和弹出运行边界的索引对与堆栈之间的开销。更大的数组,大部分时间都花在合并部分,从上到下和自下而上合并排序可以是相同的。