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(k1)F(k2)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?

wil93
sumber

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 ).n4(n)=|F(n1)|(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(n1)|N dipisahkan oleh setidaknya | F ( n - 1 ) | , Kita melihat bahwa waktu berjalan dibatasi oleh urutan Σ n | F ( n ) | ( NF(n)|F(n1)| Karena panjang kata-kata Fibonacci meningkat secara eksponensial,Σn| F(n)| =O(N). Istilah yang tersisa adalahnO(N)=O(NlogN), karena jumlah berisilogNbanyak istilah. Kami menyimpulkan bahwa waktu berjalan adalahO(NlogN

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN)logN .O(NlogN)

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Θ(NlogN)

Yuval Filmus
sumber