我不确定,是不是以前曾在SO中问过这个问题。好吧,我正在检查数组中字符的频率。我在确定复杂性方面非常虚弱,因此我认为这个社区可以帮助我理解这一点!非常抱歉,如果我以抽象的形式发布它!如果有人可以帮助我,那就太好了!
这是我的代码:
class SearchAChar{
private static int getOccurance(char [] a, char k, int l, int r, int count){
if(l == r) return count;
if(a[l] == k){a[l]='0';count++;}
return getOccurance(a, k, l+1, r, count);
}
public static void main(String [] args){
char [] arr = {'a', 'e', 'b', 'c', 'b', 'c', 'd','a'};
for(int i=0; i<arr.length; i++){
if(arr[i] == '0') continue;
System.out.println("Occurance of : " +arr[i] + " is "+ getOccurance(arr, arr[i], i, arr.length, 0) +" times!");
}
}
}
此问题的运行时复杂度应该是什么?
答案 0 :(得分:3)
由于存在一个for循环,并且在for循环内部,存在一个递归函数,其运行时复杂度为O(n),这使得最差的时间复杂度为O(n ^ 2),其中n是长度的字符数组。
答案 1 :(得分:1)
让我们尝试分解;我说的是最坏情况下的复杂性。
n = length of the array
for(int i=0; i<arr.length; i++){}
-这不会循环n
次,因为您通过在递归函数中将seeed char设置为0
来更新数组。如果char是0
,则继续。就像O(n/2)
。
getOccurance(a, k, l+1, r, count)
-在每个字符上递归,直到长度==增量。
表示递归函数调用堆栈的最佳方法是使用树。例如,此图像显示了如何构建计算斐波那契的调用堆栈。
但是您的getOccurance
函数不会像上面的fibonacci函数图片中那样两次调用自身。所以我们可以说它的调用就像在树的一个分支中一样。换句话说,这里我们看到调用堆栈序列就像0,1,2... n-1
,因此,我们可以计算复杂度O(n)
。
如果将这两个步骤放在一起,我们就会得到。 O(n/2 * n)
但是也正如@Coderino提到的-在最坏的情况下,不考虑非主导术语。
总之,以上代码的复杂度为O(n^2)
。