En uzun yaygın alt dize sorunu - Longest common substring problem

İçinde bilgisayar Bilimi, en uzun ortak alt dize sorunu en uzun olanı bulmak dizi (veya dizeler) bu bir alt dize (veya iki veya daha fazla dizenin alt dizeleridir).

Misal

"ABABC", "BABCA" ve "ABCBA" dizelerinin en uzun ortak alt dizesi, 3 uzunluğundaki "ABC" dizesidir. Diğer yaygın alt dizeler "A", "AB", "B", "BA", "BC" dir. ve C".

  ABABC ||| BABCA ||| ABCBA

Problem tanımı

İki dizge verildiğinde, uzunluk ve uzunluk , her ikisinin de alt dizesi olan en uzun dizeyi bulun ve .

Bir genelleme, k-ortak alt dize sorunu. Dizeler verildiğinde , nerede ve . Her biri için bul , en az alt dizeler olarak oluşan en uzun dizeler Teller.

Algoritmalar

En uzun ortak alt dizelerin uzunlukları ve başlangıç ​​konumları bulunabilir. ve içinde yardımı ile zaman genelleştirilmiş sonek ağacı. Onları bulmak dinamik program maliyetler . Genelleştirilmiş problemin çözümleri uzay ve ·...· ile zaman dinamik program ve Al ile zaman genelleştirilmiş sonek ağacı.

Sonek ağacı

Genelleştirilmiş son ek ağacı 0, 1 ve 2 numaralı "ABAB", "BABA" ve "ABBA" dizeleri için.

Bir dizi dizinin en uzun ortak alt dizeleri, bir genelleştirilmiş sonek ağacı dizeler için ve ardından altındaki alt ağaçtaki tüm dizelerden yaprak düğümlere sahip en derin iç düğümleri bulma. Sağdaki şekil, "ABAB", "BABA" ve "ABBA" dizeleri için "ABAB $ 0", "BABA $ 1" ve "ABBA $ 2" olacak şekilde benzersiz dizi sonlandırıcılarla doldurulmuş sonek ağacıdır. "A", "B", "AB" ve "BA" yı temsil eden düğümlerin tümü, 0, 1 ve 2 numaralı tüm dizelerden gelen yapraklara sahiptir.

Son ek ağacını oluşturmak zaman (alfabenin boyutu sabitse). Ağaç, her bir düğümün altında hangi dizelerin görüldüğünü belirten bir bit vektörü ile aşağıdan yukarıya doğru hareket ettirilirse, k-ortak alt dize sorunu şu şekilde çözülebilir: zaman. Sonek ağacı sabit bir süre için hazırlanmışsa en düşük ortak ata geri alma, çözülebilir zaman.[1]

Sözde kod

Aşağıdaki sözde kod, dinamik programlamaya sahip iki dize arasındaki en uzun ortak alt dizeleri bulur:

işlevi LCSubstr (S [1..r], T [1..n]) L: = dizi(1..r, 1..n) z: = 0 ret: = {} için i: = 1..r için j: = 1..n Eğer S [i] = T [j] Eğer i = 1 veya j = 1 L [i, j]: = 1 Başka                    L [i, j]: = L [i - 1, j - 1] + 1 Eğer L [i, j]> z z: = L [i, j] ret: = {S [i - z + 1..i]} Başka Eğer L [i, j] = z ret: = ret ∪ {S [i - z + 1..i]} Başka                L [i, j]: = 0 dönüş ret

Bu algoritma çalışır zaman. Değişken z şimdiye kadar bulunan en uzun ortak alt dizenin uzunluğunu tutmak için kullanılır. Set ret uzunluktaki dizeleri tutmak için kullanılır z. Set ret sadece dizini saklayarak verimli bir şekilde kaydedilebilir ben, en uzun ortak alt dizenin (z boyutunda) son karakteridir. S [i-z + 1..i]. Böylece en uzun ortak alt dizelerin tümü, her bir i için ret, S [(ret [i] -z) .. (ret [i])].

Bir uygulamanın bellek kullanımını azaltmak için aşağıdaki hileler kullanılabilir:

  • Hafızadan tasarruf etmek için DP tablosunun yalnızca son ve mevcut satırını saklayın ( onun yerine )
  • Satırlarda yalnızca sıfır olmayan değerleri saklayın. Bu, diziler yerine karma tablolar kullanılarak yapılabilir. Bu, büyük alfabeler için kullanışlıdır.

Ayrıca bakınız

Referanslar

  1. ^ Gusfield, Dan (1999) [1997]. Dizeler, Ağaçlar ve Diziler Üzerindeki Algoritmalar: Bilgisayar Bilimi ve Hesaplamalı Biyoloji. ABD: Cambridge University Press. ISBN  0-521-58519-8.

Dış bağlantılar