首页 » 算法技术手册 » 算法技术手册全文在线阅读

《算法技术手册》讨论4:nlogn算法的性能

关灯直达底部

性能指标已经很好地描述了同类高效算法的共同行为。为了更好地阐述实践中的行为,我们定义一个函数t(n),表示算法需要解决一个样本规模为n的问题的时间。解决问题的一个高效方法就是分治法,一个规模为n的问题将会被分成(大致相等)两个规模为n/2的子问题,这样来递归地解决问题,最后通过某些方法,将子问题的结果归并起来,作为最初问题的解。用数学语言来说,就是:

t(n)=2*t(n/2)+O(n)

也就是说,t(n)包括了解决两个子问题的开销以及归并结果的开销,归并结果的开销不会高于线性时间。在等式的右边,t(n/2)是解决规模为n/2的问题的时间,按此逻辑推理,t(n/2)能表示为:

t(n/2)=2*t(n/4)+O(n/2)

所以最初的等式可以写为:

t(n)=2*[2*t(n/4)+O(n/2)]+O(n)

我们再扩展一层,得到:

t(n)=2*[2*[2*t(n/8)+O(n/4)]+O(n/2)]+O(n)

最后一个等式归约到t(n)=8*t(n/8)+O(3*n)。将其推广到一般情况,我们可以说t(n)=2k*t(n/2k)+O(k*n)。这个扩展在n=2k,也就是k=log(n)时停止。扩展到最后,问题规模仅仅只是1了,t(1)是一个常数。因此我们能够得到闭合解为t(n)=n*c+O(n*log(n))。因为对于任何常数c来说,n*log(n)都比c*n要高阶,所以t(n)能够简写为O(n log n)。