Levenshtein düzenleme mesafesi için optimum dize hizalamasını hesaplamak için alan karmaşıklığı


12

ve boyutunda iki dize , standart Levenshtein düzenleme mesafesi hesaplaması, zaman karmaşıklığı ve boşluk karmaşıklığı olan dinamik bir algoritma ile . (Düzenleme mesafesinin bir fonksiyonu olarak bazı iyileştirmeler yapılabilir , ancak nin özellikle küçük olduğu konusunda herhangi bir varsayımımız yoktur .) Yalnızca düzenleme mesafesinin değeri ile ilgileniyorsanız (yani, minimum düzenleme sayısı), olağan algoritmanın iyi bilinen iyileştirmesi (hizalama tablosunun yalnızca önceki ve geçerli satırını tuttuğunuz yerde), alan karmaşıklığını .n1n2O(n1n2)O(n1n2)ddO(max(n1,n2))

Ancak, optimum bir düzenleme komut dosyasının gerçek düzenlemelerini almak istiyorsanız , muhtemelen çalışma süresi pahasına O(n1n2) bellek kullanımından daha iyi yapmak mümkün müdür ?

Yanıtlar:


15

Yuval'ın önerdiği değiş tokuşa gerek yok. Optimal düzenleme sekansının tamamı , ilk önce Dan Hirschberg tarafından tarif edilen dinamik programlama ve bölme ve fethetme karışımı kullanılarak süresi ve uzayında hesaplanabilir . ( Maksimum ortak alt dizileri hesaplamak için doğrusal bir uzay algoritması. Commun. ACM 18 (6): 341–343, 1975.)O ( n + m )O(nm)O(n+m)

Sezgisel olarak, Hirschberg'in fikri en uygun düzenleme dizisinin yarısında tek bir düzenleme işlemini hesaplamak ve ardından dizinin iki yarısını tekrar tekrar hesaplamaktır. Optimal düzenleme sırasını, not tablosunun bir köşesinden diğerine bir yol olarak düşünürsek, bu yolun tablonun orta satırından nerede geçtiğini kaydetmek için değiştirilmiş bir yinelemeye ihtiyacımız vardır. Çalışan bir nüks aşağıdaki gibidir:

Half(i,j)={if i<m/2jif i=m/2Half(i1,j)if i>m/2 and Edit(i,j)=Edit(i1,j)+1Half(i,j1)if i>m/2 and Edit(i,j)=Edit(i,j1)+1Half(i1,j1)otherwise

değerleri zamanı kullanılarak Düzenleme mesafesi tablosunu aynı zamanda hesaplanabilir . Not tablosunun her satırı yalnızca üstündeki satıra bağlı olduğundan, hem hem de hesaplaması yalnızca alanı gerektirir.E d i t ( i , j ) O ( m n ) E d i t ( m , n ) H a l f ( m , n ) O ( m + n )Half(i,j)Edit(i,j)O(mn)Edit(m,n)Half(m,n)O(m+n)

resim açıklamasını buraya girin

Son olarak, giriş dizeleri transforme uygun düzenleme sekansı, içine transforme uygun dizilerinden oluşur olarak ardından yi dönüştüren optimal dizi izler . Bu iki alt diziyi yinelemeli olarak hesaplarsak, toplam çalışma süresi aşağıdaki yinelemeye uyar: olduğunu kanıtlamak zor değilB [ 1 .. n ] A [ 1 . . m / 2 ] B [ 1 . . H , bir l f ( m , n ) ] bir [ m / 2 + 1 . . m ] B [ H , bir l f ( m , n ) + 1 . . nA[1..m]B[1..n]A[1..m/2]B[1..Half(m,n)]A[m/2+1..m]T ( m , n ) = { O ( n ) ise  m 1 O ( m ) , eğer  n 1 O ( m , n ) + maksimum h ( T ( m / 2 , s ) + T ( m / 2 , n- - h ) ) aksi takdirde T ( m , nB[Half(m,n)+1..n]

T(m,n)={O(n)if m1O(m)if n1O(mn)+maxh(T(m/2,h)+T(m/2,nh))otherwise
O ( m + n )T(m,n)=O(mn). Benzer şekilde, bir seferde yalnızca bir dinamik programlama geçişi için alan gerektiğinden, bağlı olan toplam alan hala . (Özyineleme yığını için alan önemsizdir.)O(m+n)

5
Dan bana yeterlik sınavımı sorduğunda bunu kaçırdım, bu yüzden.
Jeffε

i (rehberli) bir egzersiz olarak sahip hatırlıyorum ve oldukça serin olduğunu düşünüyorum
Sasho Nikolov

3

alanında çalışan tanımladığınız algoritma aslında son düzenlemeyi ve son düzenlemeden hemen önceki durumu kurtarır. Bu algoritmayı kez çalıştırırsanız, çalışma zamanını artırma pahasına tüm düzenleme sırasını kurtarabilirsiniz. Genel olarak, o sırada tuttuğunuz satır sayısı tarafından kontrol edilen bir zaman-alan değiş tokuşu vardır. Bu değiş iki uç noktası ve ve bunlar arasında zaman ve mekan ürünü sabittir (büyük O'ya kadar).O ( n 1 + n 2 ) O ( n 1 n 2 ) O ( n 1 + n 2 )O(n1+n2)O(n1+n2)O(n1n2)O(n1+n2)

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.