Измерение сложности для питания числа - PullRequest
0 голосов
/ 06 декабря 2010

Я реализовал программу для питания числа (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 будет расти в порядке θ(nlg n).

Я не уверен в своем заключении.

Спасибо

1 Ответ

1 голос
/ 06 декабря 2010

В версии 1 ответа нет, так как вы используете функцию с именем pow, которую вы никогда не определяете, поэтому невозможно сказать, в чем сложность.

В версии 2 существуют избыточные вычисления, поэтому ответ зависит от того, считаете ли вы эти избыточные вычисления частью вашей сложности или нет (так как их легко можно опустить).

Попробуйте написать версию 3 в терминах функции с именем square и включить определение для square

Во всех случаях вам нужны некоторые предположения о стоимости основных операций (*, / и +), которые вы используете. Вы, вероятно, хотите предположить, что все они стоят O (1), но вы должны четко указать это в своем анализе.

...