İki kelime arasında en kısa düzenleme hareketi


11

Bir veri yapısı ve bir algoritmayı bir sözcüğü diğerine dönüştürmek için gereken minimum değişiklik sayısını hesaplamak için bir algoritma arıyorum.

  • ekstremitelerin birine bir harf ekleyin (örneğin, AB -> ABC),
  • tüm kelimeyi çoğaltın ve birleştirin (örneğin, ABC -> ABCABC),
  • ikiye bir kelime kesin (çoğaltma hareketinin ikizi, ABCABC -> ABC + ABC),
  • harflerden birini silin (örneğin, ABC -> AC) ve
  • harflerden birini tekrarlayın (örneğin, ABC -> ABBC).

Örneğin, ABC'den BCBC'ye minimum bir hareket sırası ABC -> BC (A'yı sil) -> BCBC'dir (çoğaltma).

Bilgisayar bilimlerinde bir geçmişim yok. Belki de bu bilinen bir sorundur, ancak Google aramam bana hiçbir şey vermedi.

İlgili, iyi tanımlanmış bir sorun biliyor musunuz?

Düzenleme : Anthony Labarre tarafından yanıtta önerildiği gibi, yukarıda açıklanan soruna benzer poset permütasyon / düzenleme sorunu hakkında bazı makaleler okudum. Bu sorun hakkında daha fazla bilgi sahibi olan var mı? Alakalı mı?


1
Muhtemelen en.wikipedia.org/wiki/String_metric listesindeki hiçbiri geçerli değildir ya da sourceforge.net/projects/simmetrics içinde yer almıyor mu?
András Salamon

Hepsini bilmiyorum ama bu yöntemlerin çoğu dizeleri sadece tek harf değişikliğine izin vermek ve daha karmaşık hareketlere izin vermemek.
cz3rk

1
ABC -> ABCABC dizesinin tamamına bir çoğaltma uygulanır, böylece yön önemli değildir. Ancak tekrarın yönü sadece kekemelik gibi sağa sola doğru olabilir.
cz3rk

2
Giriş kelimelerinin harfleri paylaşmaması neden önemlidir? ( @ Reinerpost dizisi arasında Ave Biçinde boş bir dize olmalıdır .)
Jeffε

2
"İkiye bir kelime kesin" işlemini eklediniz; ile w arasında haritalanan işlemi mi kastediyorsunuz ? www
argentpepper

Yanıtlar:


3

Bu problemin incelenip incelenmediğini bilmiyorum, ama Chaudhuri ve ark. ilgili tandem çoğaltma-rasgele kayıp problemini inceledi : size bir permütasyon verildi ve (1) herhangi bir uzunlukta bir segmenti çoğaltarak ve kopyayı orijinalden hemen sonra ekleyerek, (2) silerek Böylece dize yerine yeni bir permütasyon elde edersiniz. (1) ve (2) 'nin uygulanmasının bir işlemi açıkladığını unutmayın.

Her bir işlem için verilen ağırlığa göre farklı varyantlar tanımlanabilir, bunlar kağıtlarında çoğaltılan segmentlerin genişliğine bağlıdır. Ayrıca , tam olarak izin verdiğiniz türden bir kopya olan tüm genom çoğaltması ile benzer bir problem üzerinde çalışırlar . Dizeler bağlamında bu sorunla ilgili çalışmaları okuduğumu hatırlamıyorum, ancak umarım bu en azından aramalarınız için bir başlangıç ​​noktası verebilir.


Teşekkürler, çalışmalarına bir göz atacağım. İki problem arasındaki ilişkiyi görebiliyorum.
cz3rk

2

Belirtildiği gibi, bu sorun daha yaygın olarak bilinen düzenleme mesafesi sorununa ( Levenshtein mesafesinin altında ) benzer. Aynı zamanda, örneğin Dinamik Zaman Çözgü mesafesiyle (son gereksiniminizdeki çoğaltma veya “kekemelik”) ortak özelliklere sahiptir.

Dinamik programlamaya doğru adımlar

Levenshtein mesafe ve dinamik zaman eşleştirme Mesafe çizgisinde özyinelemeli ayrışması ilk denemesi aşağıdaki (için gibi bir şey ve Y = y 1 ... y m ) ile, d ( x , y ) bir varlık ayarla x=x1xny=y1ymd(x,y)

min{d(x,y1ym1)+1▻ Add letter at endd(x,y2ym)+1▻ Add letter at beginningd(x,y1ym/2)+1if y=y1ym/2y1ym/2▻ Doublingd(x1xn/2,y)+1if x=x1xn/2x1xn/2▻ Halvingd(x1xn,y)+1▻ Deletiond(x1xn1,y1ym1)if yn=ym▻ Ignoring last elt.

Burada, son seçenek temel olarak FOOX'u BARX'e dönüştürmenin FOO'yu BAR'a dönüştürmeye eşdeğer olduğunu söylüyor. Bu, kekemelik (çoğaltma) efekti ve bir noktada silme işlemini elde etmek için “sonunda harf ekle” seçeneğini kullanabileceğiniz anlamına gelir. Sorun, otomatik bir eklemenizi sağlar olmasıdır keyfi dize ortasında karakterini de , muhtemelen istemediğiniz bir şey. (Bu “özdeş son öğeleri yoksaymak” keyfi konumlarda silme ve kekemelik elde etmenin standart yoludur. Her iki uçta eklemelere izin vermek biraz zor olsa da, keyfi eklemeleri yasaklar…

Bu arızayı işi tamamen yapmasa da dahil ettim, bir başkası onu bir şekilde “kurtarabilirse” ve aşağıda sezgisel çözümümde kullandığım için.

(Elbette, mesafenizi gerçekten tanımlayan böyle bir arıza elde edebiliyorsanız, sadece not eklemeniz gerekir ve bir çözümünüz olur. Ancak, sadece öneklerle çalışmadığınız için, Notunuz için sadece dizinleri kullanabileceğinizi düşünün; her çağrı için gerçek, değiştirilmiş dizeleri saklamanız gerekebilir; bu, dizeleriniz önemli boyutta olursa çok büyük olur.)

Sezgisel çözüm yolunda atılan adımlar

Daha kolay anlaşılabilen ve biraz daha az yer kullanabilen başka bir yaklaşım, algoritmasını (temel olarak, en iyi- ilk dal ve bağlı). Arama alanı doğrudan düzenleme işlemleriniz tarafından tanımlanır. Şimdi, büyük bir dize için, sen olurAA herhangi bir karakteri silebileceğinizden (her bir potansiyel silme için size bir komşu vererek) veya herhangi bir karakteri çoğaltarak (yine size doğrusal sayıda komşu vererek) geniş bir mahalleye sahip olmanın yanı sıra her iki uçta da herhangi bir karakter ekleyebilir size alfabe boyutunun iki katına eşit sayıda komşu verin. (Sadece tam Unicode kullanmamanızı umuyoruz ;-) Böyle büyük bir fanout ile, çift ​​yönlü veya bir akrabaA kullanarak oldukça önemli bir hızlanma elde edebilirsiniz .

Hale getirmek için işi, size hedefe bir alt bağlı kalan mesafe için gerekiyordu. Burada açık bir seçim olup olmadığından emin değilim, ancak yapabileceğiniz şey, yukarıda verdiğim özyinelemeli ayrışmaya dayalı dinamik bir programlama çözümü uygulamaktır (yine dizeleriniz çok uzunsa olası alan sorunları ile). Bu ayrışma mesafenizi tam olarak hesaplamasa da , daha düşük bir sınır olması garanti edilir (çünkü daha izin vericidir), bu da sezgisel olarak çalışacağı anlamına gelir . (Ne kadar sıkı olacak, bilmiyorum, ama doğru olurdu.) Tabii ki, bağlı fonksiyonunuzun notu sırasında sınırın tüm hesaplamaları arasında paylaşılabilir.A A AAAÇalıştırmak. (Orada bir zaman / mekan-ödünleşme.)

Yani…

Önerilen çözümümün verimliliği (1) dizelerinizin uzunluğuna ve (2) alfabenizin boyutuna biraz bağlı gibi görünüyor. İkisi de büyük değilse, işe yarayabilir. Yani:

  • Özyinelemeli ayrıştırma ve dinamik programlamayı kullanarak (örneğin, kaydedilmiş, özyinelemeli işlev kullanarak) alt sınırınızı mesafenize uygulayın.
  • Uygulamak (ya da iki yönlü Durum uzayında “hamle” ve dinamik programlama tabanlı alt bağlı olarak düzenleme operasyonları ile).A AA

Ne kadar verimli olacağına dair hiçbir garanti veremem, ama doğru olmalı ve muhtemelen kaba kuvvetli bir çözümden çok daha iyi olurdu.

Başka bir şey yoksa, umarım bu size daha fazla araştırma için bazı fikirler verir.


0

İlgili, iyi tanımlanmış bazı problemler sıra hizalama problemi olacaktır . Farklıdır çünkü çoğaltma işlemini kullanmaz. Tanımlanan işlemler şunlardır: karakterin eklenmesi, karakterin silinmesi, karakterin dönüşümü. Bu sorunun çözümü için popüler algoritma Needleman-Wunsch'tur .


Bunu biliyorum ama gerçekten bir dizi tanımlanmış hamleyle çalışmak istiyorum. Bunu yapmanın tek yolu kaba kuvvet özyinelemeli algoritmadır. Çok hoş değil ve kelimelerin boyutu artarsa ​​hesaplama yoğun olabilir.
cz3rk

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.