void F ( int a[], int n ) { // args: array a[ ] of size n
for ( int k = n/2; k>0; k/=2 ) {
for ( int j = 0; j< n; j++ ) {
if ( a[j] >= a[k] ) break;
else { int m = a[j]; a[j] = a[k]; a[k] = m; }
}}}
现在,第一个for循环是2 + log base-2的n(2 +第二个循环)。就是这样。
第二个(嵌套)循环是一个问题。如果这是最佳/最差情况,那么解决方案分别是恒定和线性的。但是考虑到if语句成功有时间,嵌套循环的复杂性是什么?
到目前为止我尝试过的是2 +(n / 2)(2 + 1)+(n / 2)(2 + 3)= 2 + 4n
其中2是初始化和比较,(n / 2)(2 + 1)是if语句成功的时候,(n / 2)(2 + 3)是else语句。< / p>
但我认为这是完全错误的。我认为我缺少的是break语句只是结束循环,一切都变得混乱。应该只是n / 2
答案 0 :(得分:1)
你可能做的是找出算法实际进入if和else语句的概率。 然后,您可以通过将它们相加来对它们的执行机会进行加权来平均复杂性。你拥有的是平均复杂性(显然不要与最坏的情况复杂性相混淆)。
平均值= p * O(IF-STATEMENT)+(1-p)* O(ELSE-STATEMENT)其中p是执行if语句的概率,0 =&gt; p> = 1。
编辑:这里的概率我并不暗示随机性,您可以将其视为定义if和else语句上的调用之间比率的一种方式,并且您可以从if中的谓词中获得该比率语句来。