[英]Determining Time Complexity of a Recursive Function Calling From inside a Loop
我不確定,是不是以前曾問過這個問題。 好吧,我正在檢查數組中字符的頻率。 我在確定復雜性方面非常虛弱,因此我認為這個社區可以幫助我理解這一點! 非常抱歉,如果我以抽象的形式發布它! 如果有人可以幫助我,那就太好了!
這是我的代碼:
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!");
}
}
}
此問題的運行時復雜度應該是多少?
由於有一個for循環和內部for循環,因此有一個遞歸函數,其運行時復雜度為O(n),這使得最差的時間復雜度為O(n ^ 2),其中n是char數組的長度。
讓我們嘗試分解; 我說的是最壞情況下的復雜性。
n = length of the array
for(int i=0; i<arr.length; i++){}
-這不會循環n
次,因為您通過在遞歸函數for(int i=0; i<arr.length; i++){}
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)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.