【问题标题】:Uncertain of my Big O analysis我的大 O 分析不确定
【发布时间】:2015-11-01 05:59:56
【问题描述】:
int RiskSort(int* PlayerA, int* PlayerB,int Length){
    int i,j;
    int Losses = 0;
    for(i=0;i<Length-Losses;i++){
         printf("%d,%d\n",PlayerA[i],PlayerB[i]);
        if(PlayerB[i]<PlayerA[i]){
                for(j=i;j<((Length-1)-Losses);j++){
                    Swap(&PlayerB[j],&PlayerB[j+1]);
                }
                i--;
                Losses++;
        }

    }
return Losses;

}

我刚刚写了这个,我得到了 O(n log n) 作为我的答案,这是家庭作业,但大 O 部分只是我的学习方式。

再次感谢

编辑:我从第一个 for 循环中获得 N 次,并且在 if 上获得 N-1-X 次传递,我不确定如何注释它,因为它限制了我称之为 log n 的传递次数(可能不准确,但我找不到不看代码并在线选择的指南)

编辑 2:只是想让这个功能更高效

int RiskSortB(int* PlayerA, int* PlayerB,int Length){
int i,j;
int Losses = 0;
for(i=0;i<Length-Losses;i++){
j=i+1;
if(PlayerB[i]<PlayerA[i])
    Losses++;

while(PlayerB[i]<PlayerA[i]&&j<Length){
    if(PlayerB[j]>=PlayerA[i]){
        Swap(&PlayerB[i],&PlayerB[j]);
        if(j!=(Length-Losses))
            Swap(&PlayerB[j],&PlayerB[Length-Losses]);
    }
    j++;
}


}

return Losses;
}

因此,由于每个 for 循环调用最大 Swap 的时间量为 2,这意味着它的 O(2N) 但常数并不重要,所以它的 O(N) 对吗?

【问题讨论】:

  • 为什么你认为它是 O(n log n)?编辑您的问题以解释您的推理。
  • 嵌套的 for 循环通常但不总是表示O(N-squared)
  • 有没有办法确定它是否为 O(N^2)?
  • 随便一瞥,最好的情况是O(N),最坏的情况是很接近O(N^2),但实际上它会比这更快。仔细观察,它看起来像是优化的冒泡排序

标签: c big-o


【解决方案1】:

假设PlayerB 的每个元素都会导致“损失”。对于第一个元素,您执行 Length-1 交换。对于第二个元素,您执行 Length-2 交换。对于第三个元素,您执行 Length-3 交换。等等。

总共有多少次掉期?多达 1 + 2 + ... + (n-1)。当你看到这个整数序列时,应用高斯公式:整数之和 1..n = n * (n + 1) / 2 = (n2 + n) / 2。即O(n2).

(sum(1..n) 和 sum(1..(n-1)) 之间的差异不影响 big-O。)

【讨论】:

  • 感谢您的分析,这对您有很大帮助!
猜你喜欢
  • 2014-05-14
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多