Kompleksitas algoritma naif untuk menemukan substring Fibonacci terpanjang


10

Diberikan dua simbol dan , mari kita mendefinisikan string Fibonacci sebagai berikut:b kabk

F(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else

dengan menunjukkan penggabungan string.⋆

Dengan demikian kita akan memiliki:

  • F(0)=b
  • F(1)=a
  • F(2)=F(1)⋆F(0)=ab
  • F(3)=F(2)⋆F(1)=aba
  • F(4)=F(3)⋆F(2)=abaab
  • ...

Mengingat string yang dibentuk oleh simbol, kita mendefinisikan Fibonacci substring sebagai salah substring dari yang juga string Fibonacci untuk pilihan yang cocok dan .nSna bSab

Masalah

Diberikan , kami ingin menemukan substring Fibonacci terpanjang.S

Algoritma sepele

Untuk setiap posisi dari string , anggaplah bahwa mulai di sana (cukup untuk memeriksa bahwa simbol ke- dan -th berbeda). Jika itu masalahnya, periksa apakah dapat diperluas ke , lalu , dan seterusnya. Setelah itu, mulai lagi dari posisi . Ulangi sampai Anda mencapai posisi .S F ( 2 ) i ( i + 1 ) F ( 3 ) F ( 4 ) i + 1 niSF(2)i(i+1)F(3)F(4)i+1n

Kita harus melihat setiap simbol setidaknya sekali, jadi . Hanya ada dua untuk loop yang terlibat, sehingga kita dapat selanjutnya mengatakan bahwa itu adalah .O ( n 2 )Ω(n)O(n2)

Namun (agak tidak mengejutkan) algoritma naif ini berkinerja jauh lebih baik daripada algoritma kuadratik biasa (jika itu banyak bekerja pada posisi ke- , itu tidak akan melakukan banyak pekerjaan di posisi berikutnya).i

Bagaimana saya bisa menggunakan properti Fibonacci untuk menemukan batas yang lebih ketat untuk waktu eksekusi algoritma ini?

Jawaban:


5

Katakan bahwa terjadi pada beberapa posisi jika substring yang dimulai pada posisi tersebut kompatibel dengan atau komplemenasinya. Seberapa dekat kejadian ? Ambil sebagai contoh . Jika terjadi pada posisi maka tidak dapat terjadi pada posisi atauF(n) F ( n ) F ( 4 ) = a b a a b F ( 4 ) p p + 1 p + 2F(n)F(n)F(4)=abaabF(4)pp+1p+2 , tetapi dapat muncul pada posisi . Kita membiarkan ℓ ( n ) menjadi angka terkecil sehingga dua kejadian F ( ℓ ) dapat terjadi pada jarak ℓp+3ℓ(n)F(ℓ)ℓ. Anda dapat membuktikan dengan induksi bahwa untuk kita memiliki ℓ ( n ) = | F ( n - 1 ) | (misalnya, ℓ ( 4 ) = 3 ).n≥4ℓ(n)=|F(n−1)|ℓ(4)=3

Diberikan string dengan panjang , untuk setiap n, biarkan P ( n ) menjadi himpunan posisi di mana F ( n ) terjadi. Kami atas dapat terikat waktu berjalan prosedur Anda kira-kira dengan Σ n | P ( n ) | | F ( n ) | , di mana jumlahnya melebihi semua n sehingga | F ( n - 1 ) | ≤ N (katakanlah). Sejak kemunculan F ( nNnP(n)F(n)∑n|P(n)||F(n)|n|F(n−1)|≤N dipisahkan oleh setidaknya | F ( n - 1 ) | , Kita melihat bahwa waktu berjalan dibatasi oleh urutan Σ n | F ( n ) | ( NF(n)|F(n−1)| Karena panjang kata-kata Fibonacci meningkat secara eksponensial,Σn| F(n)| =O(N). Istilah yang tersisa adalah∑nO(N)=O(NlogN), karena jumlah berisilogNbanyak istilah. Kami menyimpulkan bahwa waktu berjalan adalahO(NlogN

∑n|F(n)|(N|F(n−1)|+1).
∑n|F(n)|=O(N)∑nO(N)=O(Nlog⁡N)log⁡N .O(Nlog⁡N)

Sebaliknya, waktu berjalan pada adalah Ω ( | F n | log | F n | ) , sebagaimana dapat dibuktikan dengan induksi. Kami menyimpulkan bahwa case run time terburuk pada string panjang N adalah Θ ( N log N ) .FnΩ(|Fn|log⁡|Fn|)NΘ(Nlog⁡N)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.