Ada algoritma waktu linear untuk memecah teks menjadi garis dengan lebar maksimum. Ini menggunakan SMAWK (atau Knuth & Plass) dan "merata" berarti: http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness
Apakah ada algoritme atau fungsi biaya cekung untuk algoritme di atas yang akan mempertimbangkan jumlah baris yang saya inginkan untuk perincian teks, alih-alih lebar garis maksimum? Juga dalam waktu linier?
Dengan kata lain, saya mencari algoritma pemecah garis (atau pembentukan paragraf, atau pembungkus kata) di mana inputnya adalah jumlah baris yang diinginkan, bukan lebar baris yang diinginkan.
Hanya untuk menggambarkan pendekatan praktis yang tidak dapat digunakan: Ada N kata dan N-1 spasi di antara setiap pasangan kata, M adalah jumlah baris yang diinginkan (M <= N). Setelah setiap ruang mungkin ada paling banyak satu (mungkin nol) line-break. Sekarang, algoritma akan mencoba untuk menempatkan jeda di setiap kombinasi yang mungkin, menghitung "raggedness" dan mengembalikan yang terbaik. Bagaimana cara melakukannya dengan lebih cepat?
Juga, apakah masalah seperti itu memiliki nama? "Keluarga" masalah apa itu? (Mis. "Tempat sampah") Jika saya tidak membutuhkan solusi optimal yang sempurna, hanya yang sangat bagus, apakah mungkin untuk menyelesaikannya lebih cepat? (beberapa bentuk heuristik dapat digunakan, jika untuk input yang diberikan selalu ada solusi yang sama, mungkin kurang optimal).
Memperbarui
Chandra Chekuri menyarankan di bawah "masalah dalam bab Kleinberg dan Tardos pada pemrograman dinamis". Itu bacaan yang bagus tetapi berkaitan dengan garis melanggar berdasarkan lebar daripada jumlah baris. Mungkin bisa beradaptasi dengan masalah ini yang merupakan sesuatu yang saya coba cari tahu sekarang. Berikut ini adalah tautan yang baik ke solusi, mereka bahkan mengklaim untuk menyelesaikannya dalam waktu linear: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf
Juga, ada bab "8.5 Masalah Partisi" di The Algorithm Design Manual oleh Skiena yang tampaknya tepat pada topik, saya masih membacanya, sulit. (Sayangnya, dari apa yang saya pahami memiliki kompleksitas waktu kuadratik)
sumber
Jawaban:
sumber
Saya tidak tahu apakah ini membantu, tetapi menjelang akhir komentar ini seseorang mengimplementasikan apa yang Anda inginkan dalam PHP; mungkin Anda bisa mengetahui algoritma.
sumber
wordwrap()
, yang pada gilirannya menggunakan algoritma serakah (yaitu tidak ada "merata") untuk pembungkus. Meski begitu, pertanyaannya tetap bagaimana "menebak"$width
argumenwordwrap()
. Tapi terima kasih atas jawabannya, ngomong-ngomong!