Java 优秀、一般和不良案例的复杂性

Java 优秀、一般和不良案例的复杂性,java,algorithm,complexity-theory,Java,Algorithm,Complexity Theory,我用java创建了这个方法,它指示整数数组是否被排序。它的复杂性是什么?我想如果好的是O(1),最坏的情况是O(n)在平均情况下 static boolean order(int[] a){ for(int i=0;i<a.length-1;i++){ if(a[i]>a[i+1]) return false; } return true; } 静态布尔顺序(int[]a){ 对于(int i=0;ia[i+1]),返回false; } 返回true; } 复杂性

我用java创建了这个方法,它指示整数数组是否被排序。它的复杂性是什么?我想如果好的是O(1),最坏的情况是O(n)在平均情况下

static boolean order(int[] a){
  for(int i=0;i<a.length-1;i++){
    if(a[i]>a[i+1]) return false;
  }
 return true;
}
静态布尔顺序(int[]a){
对于(int i=0;ia[i+1]),返回false;
}
返回true;
}

复杂性通常在最坏的情况下引用,在您的情况下是O(n)。

您没有告诉任何关于您的输入的信息。所以假设它是完全随机的。因此,对于任何2对相邻的配对,我们有50%的机会订购它们。这意味着我们有1个步骤的概率,2个步骤的概率为0.5,3个步骤的概率为0.25,k个步骤的概率通常为2^(-k)。让我们计算预期的步骤数:

我不知道如何计算这个级数的和,所以我使用了wolfram alpha,得到了,所以它是一个常数

据我所知,随机输入的平均情况是O(1)


我不确定这是计算平均复杂度的正确方法,但对我来说似乎很好。

你问的是平均复杂度?因为你的好的和最坏的情况在我看来都是正确的。平均情况取决于你输入的统计特性。。。也许您想补充一点,您希望平均情况假设输入分布均匀?是的,在平均情况下?如果您将比较任务分布到多个线程,不会更快吗?他们将在更短的时间内执行它,特别是如果数组的大小足够大的话。但是,这需要多核CPU来提供并行执行。@Enzo如果您认为平均情况是相关的,那么您需要考虑您的输入,我们无法预测将发生什么。@Qwerky在分析“平均情况”时,您通常使用随机输入,并计算期望值(平均值)成本的百分比-这将为您提供平均案例复杂性。例如,在这种情况下,应使用所有可能的置换,使每个置换概率为1/n!被选中。你不是说进行1次比较的概率是1/2,进行2次比较的概率是1/4,等等吗?还有一个打字错误?在你的等式中。。。(1/(2^-k))=2^k。这东西会爆炸。。。这不是你在文中所描述的。@thang是的,我的意思是1/2代表1,1/4代表2等等。我会修正公式中的打字错误,谢谢,它应该是k/2^k代表k=1,2,。。。因为k=1意味着1/2(1次迭代,1/2概率),k=2意味着2*1/4(2次迭代,1/4概率),等等…@thang-hm,不,我认为是k+1。因为你用1个概率做1个比较,用1/2做2个比较,用1/4做3个比较,等等。