【问题标题】:What is the time complexity of a modified quick sort algorithm?修改后的快速排序算法的时间复杂度是多少?
【发布时间】:2015-04-20 16:11:47
【问题描述】:

我们使用常规的快速排序算法。选择的枢轴是中位数,但为了找到中位数,它需要Theta(n^{2006/2005}) 最坏情况。

为什么算法的最坏情况等于Theta(n^{2006/2005})而不是Theta(n^{2006/2005} * logn)

【问题讨论】:

  • 您对 quicklsort 复杂性的说法从何而来?这个中值算法是什么?它还对数组进行部分排序吗?
  • 基于比较的排序算法不可能具有复杂性Theta(n^{2006/2005}),因此其中可能存在log n 因素。
  • @IVlad n^(1+epsilon) > nlogn 对于epsilon > 0 的每个值和足够大的n,如果这就是您所指的。
  • 好的,这是可能的。现在真的很好奇那个算法。
  • @IVlad 一个简单的算法,假设中位数也将数组部分排序到中位数,在这种复杂性中很容易实现,因为您不需要在数组的第一部分调用。我认为这取决于提供的更多细节。

标签: arrays algorithm sorting big-o time-complexity


【解决方案1】:

首先,您需要了解每个“迭代”不采用N^2006/2005,其中N 是原始数组的大小,实际上 - 因为这是一个超线性函数,所以在数组比在大数组中查找要容易。

为了正式证明这一点,我们首先定义递归复杂度公式:(为简单起见,我们假设中位数正好为n^2006/2005,但对于C*n^2006/2005 的上限很容易修改。)

T(n) = n^2006/2005 + 2T(n/2)

现在,我们可以通过证明通过归纳来展示它

T(n) <= 2* n^2006/2005

对于足够小的n 值,这里的基本子句是微不足道的。
假设每个k&lt;n,假设T(k) &lt;= 2*(n/2)^2006/2005 成立。

T(n) = n^2006/2005 + 2T(n/2) <= (i.h.) 
     <= n^2006/2005 + 2*(2*(n/2)^2006/2005) =
     = n^2006/2005 + 4 * (n/2)^2006/2005 =
     = (*) 2^(2004/2005) *n^(2006/2005) + n^(2006/2005)
     <= 2*n^(2006/2005)

(*) 等式来自wolfram alpha,您也可以使用公式上的一些代数推导出它。


还请注意,这与排序是Omega(nlogn) 的事实并不矛盾,因为n^(1+epsilon) &gt; nlogn 对应于每个epsilon&gt;0,以及足够大的n 值。

【讨论】:

  • 谢谢@amit。所以基本上你有直觉,算法的行为几乎就像:T(n) = 2T(n/2) + O(n),然后你通过归纳证明了它。
  • @AlonAlon 在注意到超线性函数在每次迭代中变得越来越便宜,并且所有大小为n/2^i 的子数组的总和如果比在大数组中找到中位数更便宜后,它变得更加清晰将主导对数因子。我假设你也可以在这里使用主定理,但没有尝试过——用归纳法感觉很舒服,因为它也让我明白我什么时候失败了——为什么会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多