แบ่งข้อความอย่างสม่ำเสมอเป็นจำนวนบรรทัด


12

มีอัลกอริธึมเชิงเส้นเวลาสำหรับการแบ่งข้อความอย่างสม่ำเสมอในบรรทัดที่มีความกว้างสูงสุด มันใช้ SMAWK (หรือ Knuth & Plass) และ "สม่ำเสมอ" หมายถึง: http://th.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

มีอัลกอริทึมหรือฟังก์ชั่นต้นทุนเว้าสำหรับอัลกอริทึมด้านบนซึ่งจะคำนึงถึงจำนวนบรรทัดที่ฉันต้องการให้แบ่งข้อความแทนความกว้างของบรรทัดสูงสุดหรือไม่ นอกจากนี้ในเวลาเชิงเส้น?

กล่าวอีกนัยหนึ่งฉันกำลังมองหาอัลกอริทึมการแบ่งบรรทัด (หรือการสร้างย่อหน้าหรือการตัดคำ) ซึ่งอินพุตเป็นจำนวนบรรทัดที่ต้องการไม่ใช่ความกว้างของเส้นที่ต้องการ

เพียงเพื่ออธิบายวิธีการที่ใช้ไม่ได้จริง: มีคำ N และช่องว่าง N-1 อยู่ระหว่างแต่ละคำคู่ M คือจำนวนบรรทัดที่ต้องการ (M <= N) หลังจากแต่ละช่องว่างอาจมีการแบ่งบรรทัดมากที่สุด (อาจเป็นศูนย์) ตอนนี้อัลกอริทึมจะพยายามหยุดพักในชุดค่าผสมที่เป็นไปได้แต่ละอันคำนวณ "raggedness" และคืนค่าที่ดีที่สุด ทำอย่างไรให้เร็วขึ้นมาก?

นอกจากนี้ปัญหาดังกล่าวมีชื่อหรือไม่ ปัญหา "ครอบครัว" คืออะไร (เช่น "การจัดเก็บถังขยะ") หากฉันไม่ต้องการโซลูชันที่ดีที่สุดอย่างสมบูรณ์แบบเป็นเครื่องที่ดีมากเป็นไปได้ไหมที่จะสามารถแก้ปัญหาได้เร็วขึ้น? (ฮิวริสติกบางรูปแบบสามารถใช้งานได้ถ้าสำหรับอินพุตที่กำหนดจะมีวิธีแก้ปัญหาย่อยที่ดีที่สุดเสมอ)

ปรับปรุง

จันทรา Chekuri แนะนำร้อง "ปัญหาใน Kleinberg และบท Tardos ในการเขียนโปรแกรมแบบไดนามิก" เป็นการอ่านที่ดี แต่เกี่ยวข้องกับการทำลายเส้นตามความกว้างมากกว่าการนับบรรทัด มันอาจจะปรับให้เข้ากับปัญหานี้ซึ่งเป็นสิ่งที่ฉันพยายามคิดออกตอนนี้ นี่คือลิงค์ที่ดีในการแก้ปัญหาพวกเขาอ้างว่าจะแก้ปัญหาในเวลาเชิงเส้น: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf

นอกจากนี้ยังมีบท "8.5 ปัญหาพาร์ติชัน" ในคู่มือการออกแบบอัลกอริทึมโดย Skiena ซึ่งดูเหมือนว่าจะอยู่ในหัวข้อที่แน่นอนฉันยังคงอ่านมันยาก (น่าเสียดายจากสิ่งที่ฉันเข้าใจว่ามันมีความซับซ้อนเวลากำลังสอง)


5
ปัญหาการเขียนโปรแกรมแบบไดนามิกที่ดี! ฉันอาจใช้เป็นการบ้านในชั้นเรียนของฉันในภาคเรียนถัดไป
Jeffε

3
@ Jɛ ff E หากคุณต้องการใช้สำหรับปัญหาการบ้านให้ปิดคำถามก่อนที่คำตอบจะได้รับการเผยแพร่บนเว็บ
โจ

1
@ โจ: ในฐานะที่มีคนสนใจคำตอบฉันอยากจะตอบคำถามมากกว่าจะปิด
Ecir Hana

2
@ โจ: มันไม่ใช่การบ้านฉันไม่ได้เรียน CS "ระดับการบ้าน" เป็นอย่างไรฉันพบว่ามันน่าสนใจมากที่บางคนไม่สามารถนึกภาพถึงวิธีแก้ปัญหาได้ในขณะที่คนอื่น ๆ คิดว่าเป็น "ระดับการบ้าน" ที่กล่าวว่าคำตอบอาจถูกลบในหนึ่งสัปดาห์หรือส่งไปยังอีเมลของฉันเช่น และฉันจะขอบคุณสำหรับคำตอบที่ไม่ "เต็ม" เช่นกัน
Ecir Hana

3
มีปัญหาในบท Kleinberg และ Tardos เกี่ยวกับการเขียนโปรแกรมแบบไดนามิกซึ่งจะจัดรูปแบบในลักษณะที่จะลดผลรวมของกางเกงทรงหลวมในบรรทัด
จันทรา Chekuri

คำตอบ:


4

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

MM


ฉันเสียใจมาก แต่ฉันไม่คิดว่าจะทำตาม "น้ำหนักขอบ" ยาวของคำหรือไม่ "กราฟ" มีลักษณะอย่างไร มันเป็นเพียงกราฟเชิงเส้นที่โหนดเป็นจุดพักและขอบเป็นความยาวของคำ? และ "เส้นทางเชื่อมโยง M" นี้แยกย่อยเพื่อให้ส่วนที่เป็นผลลัพธ์มีผลรวมของขอบน้อยที่สุด แต่ที่สำคัญที่สุดในประโยคแรก - ฉันไม่แน่ใจว่าฉันสามารถคำนวณความหยาบได้อย่างอิสระ มันคือความแตกต่างระหว่างเส้นที่ยาวที่สุดกับเส้นจริงโดยคร่าว ๆ ดังนั้นฉันต้องรู้อะไรเกี่ยวกับเส้นอื่น ๆ ไม่ใช่เหรอ? เพิ่มเติมดังนั้นสำหรับบรรทัดสุดท้ายโปรดดูความคิดเห็นที่ 15 ด้านบน
Ecir Hana

M1N+1(i,j)ij1

@Ecir: เป็นหลักอัลกอริทึมทั้งหมดที่อยู่บนพื้นฐานของการเขียนโปรแกรมแบบไดนามิกต้องการให้คุณสามารถคำนวณ raggedness ของบรรทัดได้อย่างอิสระ หากไม่ใช่กรณีนี้คุณอาจต้องการใช้ความคิดที่สองของฉัน: เดาความกว้างของบรรทัดคำนวณวิธีแก้ปัญหาตามความกว้างนั้นและทำซ้ำเพื่อหาวิธีแก้ปัญหาที่ดีกว่า
Jouni Sirén

ขอบคุณสำหรับคำอธิบาย ได้โปรดฉันมีคำถามอีกสองคำถาม: เมื่อใช้ตัวเลือก "การค้นหาแบบไบนารี" มีอะไรที่ฉันสามารถทำได้เพื่อรับประกันหมายเลข M ของบรรทัดหรือไม่ ถ้าฉันเพิ่ม epsilon แบบสุ่มขนาดเล็กลงในความกว้างของแต่ละบรรทัดดังนั้นจะไม่มีเส้นที่มีความกว้างเท่ากันฉันจะได้รับความละเอียดมากกว่าการวางตัวแบ่ง
Ecir Hana

และในกรณีของ "เส้นทาง M-link" ทั้งสองเอกสารระบุว่า "มันง่ายที่จะแสดงว่าเส้นทาง K-link ขั้นต่ำสามารถคำนวณได้ในเวลา O (nK)" - คุณอาจรู้ว่าพวกเขาหมายถึงอะไร? ฉันหาข้อมูลเพิ่มเติมไม่พบ ปัญหาคือเอกสารเหล่านี้มีความซับซ้อนน้อยเกินไปสำหรับหัวน้อยของฉันดังนั้นฉันจึงพยายามหาข้อมูลเพิ่มเติมอาจจะมีการใช้งาน ...
Ecir Hana

-3

ฉันไม่รู้ว่าสิ่งนี้ช่วยได้หรือไม่ แต่ในตอนท้ายของความคิดเห็นนี้มีคนใช้สิ่งที่คุณต้องการใน PHP บางทีคุณสามารถหาอัลกอริทึมได้


4
ในความคิดเห็นพวกเขาเพียงแค่ตัดบรรทัดที่เหลือหลังจากจำนวนบรรทัดที่ต้องการ พวกเขาใช้ PHP wordwrap()ซึ่งจะใช้อัลกอริทึมโลภ (เช่นไม่มี "เท่ากัน") สำหรับการห่อ แล้วถึงแม้คำถามที่ยังคงวิธีการ "เดาว่า" ข้อโต้แย้งของ$width wordwrap()แต่ขอบคุณสำหรับการตอบกลับ
Ecir Hana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.