Kompleksitas algoritma Fibonacci rekursif

13

Menggunakan algoritma Fibonacci rekursif berikut:

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

Jika saya memasukkan angka 5 untuk menemukan fib (5), saya tahu ini akan menghasilkan 5 tetapi bagaimana saya memeriksa kompleksitas algoritma ini? Bagaimana cara menghitung langkah-langkah yang terlibat?

pelawak
sumber
Saya sedang mencari yang sama, dan saya kagum pada video ini oleh MyCodeSchool. Saya sarankan memeriksa ini.
snbk97

Jawaban:

23

Sebagian besar waktu, Anda dapat mewakili algoritma rekursif menggunakan persamaan rekursif. Dalam hal ini persamaan rekursif untuk algoritma ini adalah . Kemudian Anda bisa menemukan bentuk persamaan yang tertutup menggunakan metode substitusi atau metode ekspansi (atau metode lain yang digunakan untuk menyelesaikan perulangan). Dalam hal ini Anda mendapatkan T ( n ) = Θ ( ϕ n ) , di mana ϕT(n)=T(n-1)+T(n-2)+Θ(1)T(n)=Θ(ϕn)ϕadalah rasio emas ( ).ϕ=(1+5)2

Jika Anda ingin mengetahui lebih lanjut tentang cara mengatasi rekurensi, saya sangat menyarankan Anda untuk membaca bab 4 dari Pengantar Algoritma .

ees_cu
sumber
0

sebagai alternatif untuk pengulangan hubungan / analisis matematika (tapi bukan pengganti ) latihan empiris sederhana, tampaknya tidak diajarkan sangat sering di kelas tetapi sangat informatif, adalah untuk menghitung # eksekusi fungsi, dan kemudian grafik hitungan untuk rentang input n kecil , dan kemudian kurva sesuai hasilnya. hasil umumnya akan cocok dengan pendekatan matematika teoretis.

materi pendukung yang baik untuk latihan ini dapat ditemukan di bab 3 online gratis, waktu yang berjalan dari algoritma / Yayasan Ilmu Komputer , Ullman

vzn
sumber
1) Merencanakan sama sekali tidak menggantikan analisis formal. Itu mudah dibodohi. 2) Saya pikir Anda salah menggambarkan sumber yang Anda kutip. Mereka menyebutkan merencanakan, tetapi bukan sebagai cara untuk menentukan "kompleksitas". 3) FWIW, saya tidak setuju dengan pendekatan dan itu digunakan sebagai Ullman menyajikannya, tapi itu bukan kesalahan Anda.
Raphael
1
jawabannya dimulai dengan dasarnya penafian Anda, mengatakan merencanakan bukan pengganti untuk analisis matematika . merencanakan adalah metode ilmiah dan mengatakan / mengobservasinya kadang-kadang dibodohi adalah mempelajari / membangkitkan aspek statistik data, yang merupakan aspek terpenting dari analisis ilmiah . berpikir untuk mengatakan itu "mudah dibodohi" agak dramatis, ada "patologis" kasus di mana ia gagal tetapi mereka biasanya "dibuat-buat" ... pertanyaannya adalah untuk memeriksa kompleksitas algoritma dan analisis empiris adalah aspek kunci / sudut itu, dan jelas bukan satu-satunya sudut dll ...
vzn
0

Hasil dari fib (n) adalah jumlah dari semua panggilan rekursif yang dikembalikan 1. Oleh karena itu ada persis fib (n) panggilan rekursif mengevaluasi fib (1). Jadi waktu eksekusi adalah Ω (fib (n)); Anda harus menunjukkan bahwa panggilan yang mengembalikan 0 dan panggilan rekursif lainnya tidak menambah signifikan hal ini.

Alasan yang sama akan berlaku untuk fungsi yang didefinisikan secara rekursif yang mengembalikan 1, atau 0, atau hasil dari panggilan rekursif lain.

gnasher729
sumber
Ω
Jangan ragu untuk mengedit jawaban jika Anda sangat menyukainya.
gnasher729
0

T(n)=T(n-1)+T(n-2) T(n)>2T(n-2)T(n-1)>T(n-2)T(n)=Ω(cn)

wabbit
sumber