[英]What's time complexity of this Algorithm for breaking words? (Dynamic Programming)
[英]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 )。 分析遞歸函數時,可以將它們分成兩部分:
那么這只是將這兩個數字相乘的問題。 因為函數結果在這里被緩存,所以緩存中每個值的工作最多只能完成一次。 由於緩存大小為O(n),因此需要花費O(n)時間來填充。
對於在每個函數中完成的工作,有一個循環經歷O(n)次迭代。 將這些相乘得出O(n 2 )的估計值,這是通過粗略估計而產生的(輸入值加倍導致所花費的時間大約翻了四倍)。
只需遞歸思考計算復雜性。 要做到這一點,只需考慮25個硬幣的數量,然后考慮其他硬幣的數量。 如果T(n,i)
顯示用最后i
個denoms
表示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
)。 現在,我們可以重復這一過程, 10
, 5
,和1
分別。
因此,尋找緊密結合的復雜性,你可以假設n
是整除25
, 10
,和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
或通過整除5
, 10
或25
。
此外,您的計算錯誤,因為您沒有在代碼中考慮以下條件:
if (index >= denoms.length - 1) return 1; // one denom remaining
n
的最后一次是不正確的,它是1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.