无法解决此指数排序算法的时间复杂度

时间:2014-04-11 17:07:31

标签: algorithm sorting time-complexity exponential

A[n];
Sort(p,r) 
{
    if (A[p] > A[r]) then
        A[p]<->A[r];    //exchange
    if (p+1 >= r) then
        return;
    q <- (r-p+1) / 3;
    Sort(p, r-q);    // 2/3 of head
    Sort(p+q, r);    // 2/3 of tail
    Sort(p, r-q);    // again, 2/3 of head
 }

各位大家好。 这是我学习的问题。 该算法适用于排序。 n time 15 0.004 16 0.008 17 0.017 18 0.034 19 0.072 20 0.143 21 0.283 22 0.572 23 1.154 24 2.296 25 4.604 26 9.23 27 18.517 以上是n的时间。 (例如:如果n为15,则按此工作。排序(0,14))

时间复杂度似乎是2 ^ n指数。正确?

但我不知道它是怎么回事,因为我认为它的T(n)= 3T((2/3)* n)+ 1 = 3 ^ n。 它与我实时得到的东西不匹配...... 需要一些帮助。

2 个答案:

答案 0 :(得分:0)

我不知道该说什么...
我查看了您发布的代码,我认为T(n) = 3⋅T((2⋅n/3) + 1是正确的。 但是然后主定理说T(n) = O(nlog3/2(3)) ≈ O(n2.7095)或类似的东西。我根本看不到指数时间。所以我用PHP编写了一个测试。

function WiredSort($p, $r, &$A)
{
    if($A[$p] > $A[$r])
    {
        $temp = $A[$p];
        $A[$p] = $A[$r];
        $A[$r] = $temp;
    }

    if($p + 1 >= $r)
        return;

    $q = round(($r-$p+1)/3);
    WiredSort($p, $r-$q, $A);
    WiredSort($p+$q, $r, $A);
    WiredSort($p, $r-$q, $A);
}

致电WiredSort(0,n-1,$A)运行
对于n=100,在0.056003秒,
对于n=110,在0.056003秒,
对于n=1000在0.390766秒。

这对我来说也不是指数级。

您从哪里获得数据?

答案 1 :(得分:0)

从使用方程T(n) = 3*T(2/3*n) + 1上的主数定理的时间复杂度得到T(n) = O(n^(log(3/2)(3)) = O(n^(2.7))而不是O(3^n)所以在你的问题实现中存在一些非常错误,否则你无法获得指数该算法的增长