Metni belirli sayıda satıra eşit olarak bölme


12

Metni maksimum genişlikteki satırlara eşit olarak bölmek için doğrusal bir zaman algoritması vardır. SMAWK (veya Knuth & Plass) kullanır ve "eşit olarak" şu anlama gelir: http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

Maksimum algoritma genişliği yerine metnin girmesini istediğim satır sayısını hesaba katacak algoritma için bir algoritma veya içbükey bir maliyet fonksiyonu var mı? Ayrıca doğrusal zamanda?

Başka bir deyişle, girdinin istenen satır genişliği değil, istenen satır genişliği olduğu bir satır kesme (veya paragraf oluşturma veya sözcük kaydırma) algoritması arıyorum.

Sadece pratik olarak kullanılamaz bir yaklaşımı tanımlamak için: Her bir kelime çifti arasında N kelime ve N-1 boşlukları vardır, M istenen çizgi sayısıdır (M <= N). Her boşluktan sonra en fazla bir (muhtemelen sıfır) satır sonu olabilir. Şimdi, algoritma, "düzensizliği" hesaplayarak ve en iyisini döndürerek, her olası kombinasyonda kesmeleri yerleştirmeye çalışacaktır. Nasıl daha hızlı yapılır?

Ayrıca, böyle bir sorunun adı var mı? Hangi "aile" sorunlarına ait? (Örneğin "çöp kutusu ambalajı") Mükemmel bir şekilde en iyi çözüme ihtiyacım olmazsa, sadece çok iyi bir çözüm, çok daha hızlı çözmek mümkün mü? (belirli bir girdi için her zaman aynı, muhtemelen en uygun olmayan çözüm olsaydı, bir tür buluşsal yöntem kullanılabilir olabilir).

Güncelleme

Chandra Chekuri, "dinamik programlama hakkındaki Kleinberg ve Tardos bölümünde bir sorun" olduğunu önerdi. İyi bir okumaydı ama satır sayısından ziyade genişliğe dayalı satır kesmesi ile ilgileniyor. Şimdi anlamaya çalıştığım bir şey olan bu probleme uyarlanabilir olabilir. İşte çözüm için iyi bir bağlantı, hatta doğrusal zamanda çözdüğünü iddia ediyorlar: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf

Ayrıca, Skiena'nın Algoritma Tasarım El Kitabında tam olarak konuyla ilgili gibi görünen "8.5 Bölüm Sorunu" adlı bir bölüm var, hala okuyorum, zor. (Ne yazık ki, anladığım kadarıyla kuadratik zaman karmaşıklığı var)


5
Güzel dinamik programlama problemi! Önümüzdeki dönem dersimde ödev olarak kullanabilirim.
Jeffε

3
@ Jɛ ff E bir ev ödevi problemi için kullanmak istiyorsanız, cevap web'de yayınlanmadan önce soruyu daha iyi kapatınız.
Joe

1
@Joe: Cevaba gerçekten ilgi duyan biri olarak, sorunun kapalı olmak yerine yanıtlanmasını tercih ederim.
Ecir Hana

2
@Joe: Ödev değil, CS çalışmıyorum bile. "Ödev seviyesi" ne gider, bazı insanların bir problemin nasıl çözüleceğini bile hayal edememelerini çok ilginç buluyorum, diğerleri ise "ödev seviyesi" olarak değerlendiriyorlar. Bununla birlikte, cevap bir hafta içinde silinebilir veya örneğin e-postama gönderilebilir. Ve ben de "tam cevap" için minnettar olurum.
Ecir Hana

3
Kleinberg ve Tardos bölümünde dinamik programlama ile ilgili bir problem var ve bu da hatlardaki gevşeklik miktarını en aza indirecek şekilde biçimlendirilecek.
Chandra Chekuri

Yanıtlar:


4

MO(NlogU)UN2O(logMloglogN)M=Ω(logN)

MM


Çok üzgünüm ama takip ettiğimi sanmıyorum. "Kenar ağırlığı" bir kelimenin uzunluğu mudur? "Grafik" nasıl görünüyor? Sadece düğümlerin kesme noktalarının ve kenarların kelimelerin uzunlukları olduğu doğrusal bir grafik mi? Ve bu "M-link yolu", ortaya çıkan segmentlerin kenarların minimum toplamına sahip olmasını sağlar. Ama en önemlisi, ilk cümlede - düzensizliği bağımsız olarak hesaplayıp hesaplayamayacağımdan emin değilim. Kabaca en uzun çizgi ile gerçek çizgi arasındaki fark bu yüzden diğer çizgiler hakkında bir şeyler bilmem gerekiyor, değil mi? Son satır için daha fazla bilgi için lütfen yukarıdaki 15. yoruma bakın.
Ecir Hana

M1N+1(i,j)ij1

@Ecir: Temel olarak dinamik programlamaya dayanan tüm algoritmalar, bir çizginin düzensizliğini bağımsız olarak hesaplamanızı gerektirir. Durum böyle değilse, ikinci fikrim gibi bir şey kullanmak isteyebilirsiniz: bir çizgi genişliğini tahmin edin, bu genişliğe dayalı bir çözüm hesaplayın ve daha iyi çözümler bulmak için tekrarlayın.
Jouni Sirén

açıklama için teşekkürler. Lütfen, iki sorum daha var: "ikili arama" seçeneğini kullanırken, satırların M sayısını garanti etmek için yapabileceğim bir şey var mı? Her bir çizgi genişliğine küçük rasgele epsilon eklersem, böylece aynı genişliğe sahip çizgiler olmazsa, molaların yerleştirilmesinde daha fazla çözünürlük elde edebilirim.
Ecir Hana

Ve "M-link yolu" durumunda, her iki makale de "minimum K-link yolunun O (nK) zamanda hesaplanabileceğini göstermek kolaydır" der - belki de ne anlama geldiğini biliyor musunuz? Daha fazla bilgi bulamadım. Sorun şu, bu kağıtlar benim küçük kafam için biraz fazla karmaşık, bu yüzden daha fazla bilgi bulmaya çalışıyorum, belki bir uygulama, ...
Ecir Hana

-3

Bu yardımcı olup olmadığını bilmiyorum, ama bu yorumun sonuna doğru birisi PHP ne istediğini uygular; belki algoritmayı anlayabilirsiniz.


4
Yorumda, istenen satırdan sonra kalan satırları kesiyorlar. Bunlar wordwrap(), kaydırma için açgözlü (yani "eşit" yok) algoritmasını kullanan PHP kullanırlar. O zaman bile, soru $widthargümanı nasıl "tahmin edeceğimiz" olmaya devam ediyor wordwrap(). Ama yine de cevap için teşekkürler!
Ecir Hana
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.