簡體   English   中英

這種動態編程算法的時間復雜度是多少?

[英]What is the time complexity of this dynamic programming algorithm?

我正在從一本書中學習動態編程解決方案。 我理解問題的解決方案,但我不確定解決方案的時間復雜性,本書沒有提供。

我的問題:

給定無限數量的季度(25美分),硬幣(10美分),鎳幣(5美分)和便士(1美分),編寫代碼來計算代表n美分的方式的數量。

我的分析:

每個輸入必須經過4個“級別”,即25,10,5,1。 在第一級中,循環將執行n / 25次,在第二級中循環將執行最多(n / 25) (n / 10)次,第三級最多執行(n / 25) (n / 10) (n / 5),最后一級最多執行(n / 25) (n / 10)*(n / 5) n。 因此總運行時間為(n / 25) (n / 10)*(n / 5) n +(n / 25) (n / 10) (n / 5)+(n / 25) (n / 10) + n / 25,即O(N ^ 4)。 首先,我不確定我的歸納是否正確。 其次,如果我是對的,我想知道是否有更緊密的聯系,因為在每個級別我只計算了最大時間而不是平均時間。

解決方案如下:

int makeChange(int n) {
    int[] denoms = {25, 10, 5, l};
    int[][] map = new int[n + l][denoms.length]; // precomputed 
            vals
    return makeChange(n, denoms, 0, map);
}

int makeChange(int amount, int[] denoms, int index, int[][] map) {
    if (map[amount][index] > 0) {//retrieve value
        return map[amount][index];
     }
    if (index >= denoms.length - 1) return 1; // one denom remaining
    int denomAmount denoms[index];
    int ways = 0;
    for (int i= 0; i * denomAmount <= amount; i++) {
        //go to next denom, assuming i coins of denomAmount
        int amountRemaining = amount - i * denomAmount;
        ways += makeChange(amountRemaining, denoms, index + 1, 
             map);
    }
    map[amount][index] = ways;
    return ways;
}

寫入的算法是O(n 2 )。 分析遞歸函數時,可以將它們分成兩部分:

  1. 每個職能所做的工作
  2. 工作完成的次數

那么這只是將這兩個數字相乘的問題。 因為函數結果在這里被緩存,所以緩存中每個值的工作最多只能完成一次。 由於緩存大小為O(n),因此需要花費O(n)時間來填充。

對於在每個函數中完成的工作,有一個循環經歷O(n)次迭代。 將這些相乘得出O(n 2 )的估計值,這是通過粗略估計而產生的(輸入值加倍導致所花費的時間大約翻了四倍)。

只需遞歸思考計算復雜性。 要做到這一點,只需考慮25個硬幣的數量,然后考慮其他硬幣的數量。 如果T(n,i)顯示用最后idenoms表示n的方式的數量,我們將得到T(n,4) = T(n-25, 3) + T(n - 2 * 25, 3) + ... + T(n - n//25 * 25, 3) denoms T(n,4) = T(n-25, 3) + T(n - 2 * 25, 3) + ... + T(n - n//25 * 25, 3) n//25表示的整數除法n )。 現在,我們可以重復這一過程, 105 ,和1分別。

因此,尋找緊密結合的復雜性,你可以假設n是整除2510 ,和5多次獲得最壞的情況和嚴格的分析。

因此,嚴格的分析是:

T(n,4) = sum_{i=1}^{n/25} T(n-i*25, 3)
T(n,3) = sum_{i=1}^{n/10} T(n-i*10, 2)
T(n,2) = sum_{i=1}^{n/5} T(n-i*5, 1)
T(n,1) = 1

現在,我們可以從下到上進行計算。 T(n,2) = Theta(n/5)T(n,3) = Theta(n/10 * n/5)T(n,4) = Theta(n/25 * n/10 * n/5) = Theta(n^3) 正如可以看到的最終結果是Theta(n^3)和不depned上的精確值的漸進的分析DEOS n或通過整除51025

此外,您的計算錯誤,因為您沒有在代碼中考慮以下條件:

if (index >= denoms.length - 1) return 1; // one denom remaining 

n的最后一次是不正確的,它是1

暫無
暫無

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

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