渐近运行时间分析 - 硬币变换算法

时间:2015-02-14 19:13:31

标签: python algorithm recursion asymptotic-complexity coin-change

我需要帮助找到以下算法的渐近运行时间,即Big O(n) - > change_slow()。我尝试过硕士方法和其他技巧,但似乎无法找到答案。

这是硬币更改问题,使用以下数据范围处理:

for i in range(50, 950, 50):
    data.append(([1,10,25,50],i))

for i in range(50, 600, 50):
     data.append(([1,3,4,17,31],i))

以下是算法:

coins = item[0]
amount = item[1]

coins_needed = [j for j in change_slow(amount, coins, [])]


def change_slow(a, v, c):
    if(len(v) == 0):
        pass
    elif(sum(c) == a):
        yield c
    elif(sum(c) > a):
        pass
    else:
        for i in change_slow(a, v[:], c + [v[0]]):
            yield i
        for i in change_slow(a, v[1:], c):
            yield i

T(n)=?

形式的等式是什么

1 个答案:

答案 0 :(得分:0)

这不会给你一个确切的答案(递归关系),但你可以通过在改变输入的同时计算步数来实验性地找到它。

steps = 0

def change_slow(a, v, c):
    global steps
    steps += 1
    if(len(v) == 0):
        pass
    elif(sum(c) == a):
        yield c
    elif(sum(c) > a):
        pass
    else:
        for i in change_slow(a, v[:], c + [v[0]]):
            yield i
        for i in change_slow(a, v[1:], c):
            yield i

print "\n== Varying number of coins =="

for i in range(1, 40):
    coins = range(1, i+1)
    result = list(change_slow(19, coins, []))
    print "%s\t%s" % (len(coins), steps)
    steps = 0

print "\n== Varying the amount =="

for i in range(1, 1000):
    result = list(change_slow(i, [1,2,3,4,5,6,7,8,9,10], []))
    print "%s\t%s" % (i, steps)
    steps = 0

绘制此数据:

https://plot.ly/~skryskalla/11

增加硬币数会导致步数线性增加,而增加数量会使步数增加呈指数级增长。