Java:这个算法的优秀,平均和最差情况复杂度是多少?

时间:2013-01-23 12:38:49

标签: java algorithm complexity-theory

我想知道这个算法的复杂性。在我的情况下,良好,中等和最差都是O(n ^ 2)

public char getModa(char[] a){
   int ii[] =new int[a.length];
   char[] t= new char[a.length];

   for(int i=0;i<a.length;i++){
    for(int j=0;j<a.length;j++){
       if(a[j]==a[i]){ 
          ii[i]++;
          t[i]=a[j];
       }
     }
   }
   int cc=0;
   for(int i=0;i<ii.length;i++){
     if(ii[i]>ii[cc]) cc=i;
   }
   return a[cc];
 }

4 个答案:

答案 0 :(得分:5)

所有案例的复杂性(最佳/平均/最差)为O(n^2),瓶颈是(i,j)range([0,a.length),[0,a.length))的双重迭代。

为了澄清为什么它确实是O(n^2)而不是O(n^3),因为最后一个循环不是'嵌套'在瓶颈的一侧,所以3循环的复杂性是基本上O(n^2+n),但自O(n^2+n) = O(n^2)以来,这就是答案。

实际上 - 对于相同长度的数组,根本没有变化 - 算法具有相同的迭代次数,无论输入究竟是什么。

答案 1 :(得分:1)

嵌套for循环中的代码运行(a.length)^ 2次,最后一个for循环内的代码运行ii.length = a.length次。所以,我们总共有(a.length)^ 2 + a.length次迭代,得到O(a.length ^ 2)。

迭代量(以及复杂性)仅取决于a的大小,而不取决于其中的值。因此,在最佳和最差情况下都是一样的。

答案 2 :(得分:1)

您的复杂性为O(N^2)

如果使用哈希表,可能会在O(N)复杂度中解决类似问题。

答案 3 :(得分:0)

for循环直接取决于数组a的长度。

所有情况都是O(n*n)

最后一个for循环不会影响程序的复杂性,因为它已经是O(n*n)