Складність рекурсивного алгоритму Фібоначчі


13

Використовуючи наступний рекурсивний алгоритм Фібоначчі:

def fib(n):
   if n==0:
      return 0
   elif n==1
      return 1
   return (fib(n-1)+fib(n-2))

Якщо я введіть число 5, щоб знайти fib (5), я знаю, що це виведе 5, але як я вивчити складність цього алгоритму? Як обчислити етапи, що стосуються?



Я шукав те саме, і я натрапив на це відео від MyCodeSchool, я рекомендую перевірити це.
snbk97

Відповіді:


23

У більшості випадків ви можете представляти рекурсивні алгоритми, використовуючи рекурсивні рівняння. У цьому випадку рекурсивним рівнянням для цього алгоритму є . Тоді ви можете знайти закриту форму рівняння, використовуючи метод підстановки або метод розширення (або будь-який інший метод, що використовується для вирішення рецидивів). У цьому випадку ви отримуєте , де - золоте співвідношення ( ).T(n)=T(n1)+T(n2)+Θ(1)T(n)=Θ(ϕn)ϕϕ=(1+5)2

Якщо ви хочете дізнатися більше про те, як вирішити рецидиви, я настійно рекомендую вам ознайомитись з розділом 4 Введення в алгоритми .


0

як альтернатива рекуррентним відносинам / математичному аналізу (але не заміни ), простою емпіричною вправою, очевидно, що не вивчається дуже часто на заняттях, але дуже інформативною, є підрахунок числа виконання функції, а потім графік підрахунку для діапазону малих n входів, а потім крива підходить до результату. результати, як правило, повністю відповідають теоретичному математичному підходу.

хороший супровідний матеріал для цієї вправи можна знайти у вільній онлайн-главі 3, час роботи алгоритмів / Основи інформатики , Уллман


1) Графік жодним чином не замінює формальний аналіз. Це легко обдурити. 2) Я думаю, ви неправильно представляєте джерело, яке ви цитуєте. Вони згадують змову, але не як спосіб визначення "складності". 3) FWIW, я не погоджуюся з підходом і його використанням, як це представляє Уллман, але це не ваша вина.
Рафаель

1
відповідь починається по суті з вашого відмови, кажучи, що складання тексту не є заміною математичного аналізу . складання тексту є науковим методом, і сказати / дотримуватися його іноді обманюють - це дізнатися про / викликати статистичні аспекти даних, що є ще одним головним аспектом наукового аналізу . Подумайте сказати, що це "легко обдурити", це досить драматично, є "патологічні" випадки, коли він не вдається, але вони, як правило, "надумані" ... питання полягало в вивченні складності алгоритму, а емпіричний аналіз є ключовим аспектом / кут на це, і, очевидно, не єдиний кут тощо.
vzn

0

Результатом fib (n) є сума всіх рекурсивних викликів, які повернулися 1. Тому є точно fib (n) рекурсивні виклики, що оцінюють fib (1). Отже час виконання дорівнює Ω (fib (n)); вам потрібно буде показати, що дзвінки, що повертаються до 0, та інші рекурсивні дзвінки не суттєво додають до цього.

Це ж міркування стосується будь-якої рекурсивно визначеної функції, яка або повертає 1, або 0, або результат іншого рекурсивного виклику.


"принаймні O (fib (n))" - це не має жодного сенсу. Ви хочете використовувати . Ω
Рафаель

Не соромтесь відредагувати відповідь, якщо ви сильно відчуваєте її.
gnasher729

0

Нижня межа інтуїтивно зрозуміла: оскільки ОтжеT ( n ) > 2 T ( n - 2 ) T ( n - 1 ) > T ( n - 2 ) T ( n ) = Ω ( в н )T(n)=T(n1)+T(n2) T(n)>2T(n2)T(n1)>T(n2)T(n)=Ω(cn)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.