En uzun Fibonacci alt dizisini bulmak için saf bir algoritmanın karmaşıklığı


10

ve iki sembol verildiğinde , Fibonacci dizesini şu şekilde tanımlayalım :b kabk

F(k)={bif k=0aif k=1F(k1)F(k2)else

ile dize birleştirmeyi belirtir.

Böylece sahip olacağız:

  • 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
  • ...

Bir dizge verilen oluşturduğu sembolleri, bir Fibonacci herhangi biri gibi alt dize tanımlayan substring arasında , aynı zamanda, uygun bir seçim için Fibonacci dizesi ve .nSna bSab

Sorun

verildiğinde , en uzun Fibonacci alt dizisini bulmak istiyoruz.S

Önemsiz bir algoritma

dizesinin her bir konumu için , orada başladığını varsayalım th ve -th sembollerinin farklı olup olmadığını kontrol etmek yeterlidir ). Bu durumda, , ardından ve daha genişletilip genişletilemeyeceğini kontrol edin . Bundan sonra, konumundan tekrar başlayın . konumuna ulaşıncaya kadar tekrarlayın .S F ( 2 ) i ( i + 1 ) F ( 3 ) F ( 4 ) i + 1 niSF(2)i(i+1)F(3)F(4)i+1n

Her sembole en az bir kez bakmalıyız, bu yüzden . İlgili döngüler için sadece iki tane vardır, bu yüzden bunun olduğunu söyleyebiliriz .O ( n 2 )Ω(n)O(n2)

Bununla birlikte (biraz şaşırtıcı bir şekilde) bu naif algoritma, normal kuadratik algoritmalardan çok daha iyi performans gösterir (eğer pozisyonunda çok fazla iş yaparsa, sonraki pozisyonlarda çok fazla iş yapmaz).i

Bu algoritmanın yürütme süresi için daha sıkı sınırları bulmak için Fibonacci özelliklerini nasıl kullanabilirim?

Yanıtlar:


5

Bu konumda başlayan alt dize veya onun tamamlaması ile uyumluysa , nin bir konumda meydana geldiğini varsayalım . oluşumları ne kadar yakın olabilir ? Örnek olarak alalım . Eğer pozisyon meydana gelir o pozisyonda oluşamaz ya da , ama pozisyonda görünebilir . Biz izin iki oluşumları öyle ki en küçük sayı uzaklığında bulunan oluşabilir . Sen için o indüksiyonla kanıtlayabilirim ElimizdekiF(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2p+3(n)F()n4(n)=|F(n1)|(örneğin, ).(4)=3

Uzunlukta bir dizi göz önüne alındığında her biri için, izin olan pozisyonların kümesi oluşur. Prosedürünüzün çalışma süresini kabacaNerede baştan toplamı çalışır öyle ki (diyelim). oluşumları en az, çalışma süresinin Fibonacci kelimelerinin uzunlukları katlanarak arttığından, . Kalan terimNnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)|

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN), toplam birçok terim içerdiğinden . Çalışma süresinin olduğu sonucuna vardık .logNO(NlogN)

Tersine, çalışan zaman olan olarak indüksiyon yoluyla ispat edilebilir. Biz uzunluğu ipleri üzerine çalışma süresi en kötü durum olduğu sonucuna olan . Ω ( | F n | log | F n | ) N Θ ( N log N )FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.