Fibonacci kelimeleri


11

Eski Çek algoritması ders kitabımda aşağıdaki sorunla karşılaştım, ne yazık ki hiçbir ipucu ya da çözüm olmadan geldi.

"Fibonacci kelimelerini , , olarak tanımlıyoruz , burada ve genel harflerdir. string (potansiyel olarak büyük bir alfabe üzerinde) doğrusal zamanda en uzun Fibonacci'nin alt kelimesini bulabilir misin? "F0=aF1=bFn+2=FnFn+1ab

İkinci dereceden bir zamanda bir çözüm biliyorum, ama onu lineer hale getiremiyorum. Birisi beni doğru yöne yönlendirebilir mi?


3
Bu eski Çek algoritması ders kitabının adı nedir ;-)
Saeed

Bu kitapta alt kelimelerin bitişik olması (yani faktörler) gerekli midir?
Klaus Draeger

Yanıtlar:


12

Gitmenin bariz yolu dinamik programlamadır: , bir Fibonacci sırası i kelimesinin j konumunda başladığı iki harfi saklasın ve F ( i - 2 , j ) ve F ( i - l , j + fib ( i ) ) . Bu en fazla O ( n log n ) zaman alır , çünkü i'nin logaritmik olarak birçok olası değeri vardır.F(i,j)benjF(ben-2,j)F(ben-1,j+yalan(ben))Ö(ngünlükn)ben.

Ama sadece F ( i - 2 , j ) ' nin boş olmadığı pozisyonları olabileceğinden şüpheleniyorum (yani aynı uzunlukta iki Fibonacci kelimesi mevcut olduğunda, sadece uzunluklarının çoğundan ziyade uzunluklarının sabit bir kısmı). Ait boş olmayan pozisyonları F ( i - 2 , j ) Eğer (sabit zaman) yapmanız gereken hangi sadece onlar için hesaplama vardır F ( i , j )Ö(n/yalan(ben))F(ben-2,j)F(i2,j)F(ben,j). Benim şüphe doğruysa Öyleyse bunu hızlandırmak olabilir her bir değeri için boş olmayan pozisyonların bir listesini takip tutarak i ve için listeyi kullanarak i - 2 için listenin hesaplama hızlandırmak için i .O(n)benben-2ben

Eğer saklıyorsanız dizisi hala boş alan olacağını Ç ( n log n ) bile speedup sonra ancak bu yerine hashtable kullanılarak geliştirilebilir. Veya alternatif olarak F'yi O ( n ) log n -bit sözcükleriyle bit paketlenmiş bir dizide saklayabilirsiniz (yalnızca boş olup olmadığını bilmeniz gereken gözlemi kullanarak; her alt dize için iki karakteri giriş dizesindeki konumlarının ilk ikisi).FO(ngünlükn)FÖ(n) günlükn


Neden dinamik programlamanın bu sorun için en iyi seçim olacağını düşündüğünüzü söyleyebilir misiniz ? C gibi herhangi bir statik programlama kullanırsak nerede sorun yaşayacağız ?
tarit goswami

1
Dinamik programlama bir algoritma tasarım tekniğidir, bir programlama dili sınıfı değildir.
David Eppstein
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.