算法 - 递归乘法函数的时间复杂度

时间:2017-11-02 08:27:13

标签: algorithm runtime time-complexity big-o

我将此作为测试问题来评估以下递归方法的时间复杂度。

def multiply(x,y)
if y = 0: 
   return 0
z = multiply(x,y/2) 
if y is even:
   return 2z
else :
   return x + 2z

我写了log(n),因为数字y持续减少2,递归调用很快就会在满足条件时结束。

1 个答案:

答案 0 :(得分:1)

如果函数意图在问题中进行零检查,则此函数将永远不会终止。

这是一个有效的python版本:

def multiply(x,y):
    if y == 0:
        return 0
    z = multiply(x,y/2)
    if y % 2 == 0:
        return 2 * z
    else :
        return x + 2 * z

无论你输入什么:这将以递归错误结束。所以复杂性是无限的。也许这是一个棘手的问题。

但是,如果老师的意思是这样的话:

def multiply(x, y):
    if 0.01 > y > -0.01:
        return 0
    z = multiply(x, y / 2)
    if y % 2 == 0:
        return 2 * z
    else:
        return x + 2 * z

然后复杂性看起来确实像log(n)

以下是一些复杂性基准测试代码,用于计算操作数:

counter = 0

def multiply(x, y):
    global counter
    counter += 1
    if 0.01 > y > -0.01:
        return 0
    z = multiply(x, y / 2)
    if y % 2 == 0:
        return 2 * z
    else:
        return x + 2 * z

for i in range(1000):
    counter = 0
    multiply(1, i)
    print(i, counter)

它打印一系列对数性的数字:

0 1
1 8
2 9
3 10
4 10
5 10
6 11
7 11
8 11
9 11
10 11
11 12
12 12
13 12
14 12
15 12
16 12
17 12
18 12
19 12
20 12
21 13
22 13
23 13
24 13
25 13
26 13
27 13
28 13
29 13
30 13
...