我想知道这个算法的复杂性。在我的情况下,良好,中等和最差都是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];
}
答案 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)