2015-08-08 5 views
2

Следующая функция вычисляет a^b. предположим, что у нас уже есть первичный список, который содержит все необходимые простые числа и сортируется от малого до большого. Код написан на python.Как определить временную сложность этого алгоритма?

def power(a,b): 
    if b == 0: 
     return 1 

    prime_range = int(sqrt(b)) + 1 
    for prime in prime_list: 
     if prime > prime_range: 
      break 
     if b % prime == 0: 
      return power(power(a, prime), b/prime) 

    return a * power(a, b-1) 

Как определить его временную сложность? стр. Код не идеален, но, как вы видите, идея использует простые числа, чтобы уменьшить количество арифметических операций. Я все еще ищу идеальную реализацию, поэтому, пожалуйста, помогите, если вы придумаете что-то. Спасибо!

+0

На каком языке вы используете? Вы можете измерять время работы программно. –

+0

Даже sqrt() вашего языка - это реализация. Невозможно найти общую сложность этой функции, если вы не предоставите необходимые данные. –

+0

Вы действительно хотите измерить временную сложность? Против «Как определить временную сложность» или «Как измерить время работы»? – Stef

ответ

1

Худший случай, когда для петли exausted. Но в этом случае b становится разделенным на 2 в следующем рекурсивном вызове.

В худшем случае мы разделим Ь на коэффициент 2 в приблизительно SQRT (б) операции на каждом шаге до б досягаемости 1.
Таким образом, если мы устанавливаем уравнения

F (1) = 1 и Р (п) = F (п/2) + SQRT (п)

мы получаем using woflram alpha

F (п) = (1 + SQRT (2)) (SQRT (2) SQRT (п) -1)
и это
O (sqrt (b))

+1

Если вы хотите фактическое доказательство для рекурсии (без wolfram alpha), вы просто имеете' sqrt (n) + sqrt (n/2) + sqrt (n/4) + sqrt (n/(2^log2 (n))) '(потому что' 2^log2 (n) = 1'), что является просто «sqrt (n) * sum ((1/sqrt (2))^I)' с 'I = 1..log2 (n) ', используя формулу для суммы геометрической серии, вы получите желаемый ответ;) – Holt

+0

Если' b' является простым, оно не будет разделено на 2. –

+0

@Juan Lopes, если b является простым, тогда первый цикл будет превышен (есть условие для проверки против простых чисел

Смежные вопросы