找到最好和最坏的O()

时间:2019-06-20 14:10:45

标签: algorithm big-o

使用以下算法,试图确定最佳和最差的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是递归调用的数量。

对吗?

1 个答案:

答案 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