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。 它与我实时得到的东西不匹配...... 需要一些帮助。
答案 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)
所以在你的问题实现中存在一些非常错误,否则你无法获得指数该算法的增长