簡體   English   中英

確定從循環內部調用的遞歸函數的時間復雜度

[英]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

  1. for(int i=0; i<arr.length; i++){} -這不會循環n次,因為您通過在遞歸函數for(int i=0; i<arr.length; i++){} char設置為0來更新數組。 如果char為0 ,則繼續。 所以就像O(n/2)

  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)

一些有用的資源-https://users.cs.duke.edu/~ola/ap/recurrence.html

遞歸階乘程序的復雜性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM