0

我使用分治技术实现了一个为数字 (a^n) 供电的程序。我实现了相同问题的两个版本:

版本 1:

def input_params():
    a=input('Input \'a\' & \'n\' for a^n:')
    n=input('')
    result=power(a,n)
    print (result)

def power(a,n):
    if n<=1:
        return a

    elif n%2==0:
        return pow(power(a,n/2),2)

    else:
        return pow(power(a,(n-1)/2),2)*a

  if __name__ == "__main__":
    input_params()

版本 2:

def input_params():
    a=input('Input \'a\' & \'n\' for a^n:')
    n=input('')
    result=power(a,n)
    print (result)

def power(a,n):
    if n<=1:
        return a

    elif n%2==0:
        return power(a,n/2)*power(a,n/2)

    else:
        return power(a,(n-1)/2)*power(a,(n-1)/2)*a



if __name__ == "__main__":
    input_params()

版本 3:

def input_params():
    a=input('Input \'a\' & \'n\' for a^n:')
    n=input('')
    result=power(a,n)
    print (result)

def power(a,n):
    if n<=1:
        return a

    elif n%2==0:
        return square(power(a,n/2))

    else:
        return square(power(a,(n-1)/2))*a

def square(num):
    return num*num

if __name__ == "__main__":
    input_params()

Q1:以上哪个版本的复杂度是θ(lg n)

Q2:如果版本 2 的复杂度为θ(lg n),为什么?因为虽然第 2 版中的问题大小是除以 2,但子问题的数量也是 2,所以我觉得第 2 版会按θ(nlg n).

我不确定我的结论。

谢谢

4

1 回答 1

1

在版本 1 中,没有答案,因为您使用了一个pow从未定义过的函数,因此无法真正说出复杂性是什么。

在版本 2 中,存在冗余计算,因此答案取决于您是否将这些冗余计算视为复杂性的一部分(因为它们很容易被忽略)。

尝试根据一个名为的函数编写版本 3,square并包含一个定义square

*在所有情况下,您都需要对所使用的基本操作( 、/和)的成本进行一些假设+。您可能想假设它们都花费 O(1),但您应该在分析中明确这一点。

于 2010-12-06T07:57:12.663 回答