使用以下算法,试图确定最佳和最差的O()。
minCoin(total, C[]) {
if (total == 0) {return 0}
min = MAX_VALUE
for (i in C.length) {
if (C[i] > total) {continue}
value = minCoin(total - C[i], C)
if (value < min) {min = value}
}
min = MAX_VALUE ? min : min++
return min
}
最佳:O(1),因为如果total == 0,则返回
最差:O(nT),因为n =数组中的硬币数量,T =我们正在制造的总数。
我还认为最坏的情况可能是O(2 ^ n),其中n是递归调用的数量。
对吗?
答案 0 :(得分:2)
目前的复杂度约为O(2 ^ n),所以它是指数级的。
但是,如果通过备注将其转换为动态编程,则复杂度将为O(nT)。
通过动态编程解决:
memoization[total]={-1}// initially every index holds -1
minCoin(total, C[]) {
if (total == 0) {return 0}
if(memoization[total]!=-1) return memoization[total];
min = MAX_VALUE
for (i in C.length) {
if (C[i] > total) {continue}
value = minCoin(total - C[i], C)
if (value < min) {min = value}
}
min = MAX_VALUE ? min : min++
return memoization[total]=min
}
计算完总计后,我们将总计的记忆值从-1更改为其结果。因此,如果我们再次获得总计,我们将只返回备忘录[total],因为我们将结果存储在上面。
有关DP的详细信息: https://www.nativescript.org/blog/support-for-androidx-in-nativescript