测量为数字供电的复杂性

时间:2010-12-06 07:10:20

标签: complexity-theory big-o asymptotic-complexity

我使用分而治之技术实现了一个为数字(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将按θ(nlg n)的顺序增长。

我不确定我的结论。

由于

1 个答案:

答案 0 :(得分:1)

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

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

尝试使用名为square的函数编写版本3,并包含square的定义

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