पाठ को निश्चित संख्या में लाइनों में तोड़ें


12

अधिकतम चौड़ाई की लाइनों में समान रूप से पाठ को तोड़ने के लिए एक रैखिक समय एल्गोरिथ्म है। यह SMAWK (या Knuth & Plass) और "समान रूप से" का उपयोग करता है: http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

क्या एल्गोरिथ्म के लिए एक एल्गोरिथ्म या एक अवतल लागत कार्य है, जिसमें अधिकतम पंक्ति चौड़ाई के बजाय, मैं उस पाठ की संख्या को ध्यान में रखना चाहूंगा, जिसमें मैं पाठ को तोड़ना चाहूंगा? इसके अलावा रैखिक समय में?

दूसरे शब्दों में, मैं एक लाइन ब्रेकिंग (या पैराग्राफ फॉर्मेशन, या वर्ड रैपिंग) एल्गोरिथ्म की तलाश कर रहा हूं, जहां इनपुट वांछित लाइनों की संख्या हो, न कि वांछित लाइन चौड़ाई।

बस एक व्यावहारिक रूप से अनुपयोगी दृष्टिकोण का वर्णन करने के लिए: प्रत्येक शब्द जोड़ी के बीच में एन शब्द और एन -1 रिक्त स्थान हैं, एम वांछित लाइनों की संख्या है (एम <= एन)। प्रत्येक स्थान के बाद अधिकतम एक (संभवतः शून्य) लाइन-ब्रेक हो सकता है। अब, एल्गोरिथ्म प्रत्येक संभावित संयोजन में "रैगेडनेस" की गणना करते हुए ब्रेक लगाने की कोशिश करेगा और सबसे अच्छा रिटर्न देगा। यह बहुत तेजी से कैसे करें?

इसके अलावा, क्या ऐसी समस्या का कोई नाम है? समस्याओं का "परिवार" क्या है? (उदाहरण के लिए "बिन पैकिंग") अगर मुझे पूरी तरह से इष्टतम समाधान की आवश्यकता नहीं होगी, तो बस एक बहुत अच्छा, क्या इसे बहुत तेजी से हल करना संभव है? (हेयुरिस्टिक्स का कुछ रूप प्रयोग करने योग्य हो सकता है, यदि दिए गए इनपुट के लिए हमेशा समान, संभवतः उप-इष्टतम, समाधान होते हैं)।

अपडेट करें

चंद्रा चेकुरी ने बोले "क्लिनबर्ग में एक समस्या और गतिशील प्रोग्रामिंग पर टार्डोस अध्याय" का सुझाव दिया। यह एक अच्छा पढ़ा गया था लेकिन यह लाइन की गिनती के बजाय चौड़ाई के आधार पर लाइन ब्रेकिंग से संबंधित है। यह इस समस्या के अनुकूल हो सकता है, जिसे मैं अभी जानने की कोशिश कर रहा हूं। यहाँ समाधान के लिए एक अच्छी कड़ी है, वे इसे रैखिक समय में हल करने का दावा भी करते हैं: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf

साथ ही, स्कीना द्वारा द अल्गोरिथम डिज़ाइन मैनुअल में "8.5 द पार्टिशन प्रॉब्लम" एक अध्याय है, जो बिल्कुल ऑन-टॉपिक लगता है, मैं अभी भी इसे पढ़ रहा हूं, कठिन। (दुर्भाग्य से, मैंने जो समझा है, उसमें द्विघात समय जटिलता है)


5
अच्छी गतिशील प्रोग्रामिंग समस्या! मैं इसे अपनी कक्षा में अगले सेमेस्टर में होमवर्क के रूप में उपयोग कर सकता हूं।
जेफ

3
@ J @ ɛ E यदि आप इसे होमवर्क समस्या के लिए उपयोग करना चाहते हैं, तो वेब पर उत्तर प्रकाशित होने से पहले प्रश्न को बेहतर ढंग से बंद कर दें।
जो

1
@ जो: किसी के जवाब में वास्तव में दिलचस्पी होने के कारण मैं सवाल का जवाब देना पसंद करूंगा, बजाय बंद किए।
इकिर हाना

2
@ जो: यह एक होमवर्क नहीं है, मैं सीएस का अध्ययन भी नहीं करता। "होमवर्क स्तर" क्या जाता है, मुझे यह बहुत दिलचस्प लगता है कि कुछ लोग किसी समस्या को हल करने के लिए छवि भी नहीं दे सकते हैं, जबकि अन्य लोग इसे "होमवर्क स्तर" मानते हैं। उस ने कहा, उत्तर को एक सप्ताह में मिटाया जा सकता है या उदाहरण के लिए मेरे ईमेल पर भेजा जा सकता है। और मैं "पूर्ण उत्तर" के लिए भी आभारी रहूंगा, साथ ही साथ।
इकिर हाना

3
गतिशील प्रोग्रामिंग पर क्लेनबर्ग और टारडोस अध्याय में एक समस्या है जो इस तरह से प्रारूपित करना है जैसे कि लाइनों में स्लैक्स के योग को कम करना।
चंद्रा चकुरी

जवाबों:


4

हे(एनलॉगयू)यूएन2हे(लॉगलॉगलॉगएन)=Ω(लॉगएन)


मुझे बहुत खेद है लेकिन मुझे नहीं लगता कि मैं इसका अनुसरण करता हूं। "बढ़त वजन" एक शब्द की लंबाई है? "ग्राफ़" कैसा दिखता है? क्या यह सिर्फ एक रेखीय ग्राफ है जहां नोड्स ब्रेकपॉइंट हैं और किनारों पर शब्दों की लंबाई है? और यह "एम-लिंक पथ" इसे तोड़ता है ताकि परिणामस्वरूप खंडों में किनारों का न्यूनतम योग हो? लेकिन सबसे महत्वपूर्ण बात, पहले वाक्य में - मुझे यकीन नहीं है कि मैं स्वतंत्र रूप से रागात्मकता की गणना कर सकता हूं। मोटे तौर पर यह सबसे लंबी रेखा और वास्तविक रेखा के बीच का अंतर है इसलिए मुझे दूसरी रेखाओं के बारे में कुछ जानना चाहिए, नहीं? अंतिम पंक्ति के लिए और अधिक, कृपया ऊपर 15 वीं टिप्पणी देखें।
इकिर हाना

1एन+1(मैं,जे)मैंजे-1

@ ईसीआर: गतिशील प्रोग्रामिंग पर आधारित अनिवार्य रूप से सभी एल्गोरिदम के लिए आवश्यक है कि आप स्वतंत्र रूप से एक पंक्ति की रैगेडनेस की गणना कर सकते हैं। यदि ऐसा नहीं है, तो आप मेरे दूसरे विचार की तरह कुछ का उपयोग कर सकते हैं: एक लाइन चौड़ाई का अनुमान लगाएं, उस चौड़ाई के आधार पर एक समाधान की गणना करें, और बेहतर समाधान खोजने के लिए पुनरावृति करें।
जौनी साइरन

विवरण के लिए आपका धन्यवाद। कृपया, मेरे पास दो और प्रश्न हैं: "बाइनरी खोज" विकल्प का उपयोग करते समय, क्या मैं कुछ भी कर सकता हूं जो संख्या एम की गारंटी देता है? यदि मैं प्रत्येक लाइन चौड़ाई में छोटे यादृच्छिक एप्सिलॉन जोड़ता हूं, तो एक ही चौड़ाई के साथ कोई रेखा नहीं होगी, तो मैं ब्रेक लगाने पर अधिक रिज़ॉल्यूशन प्राप्त कर सकता हूं।
इकिर हाना

और "एम-लिंक पथ" के मामले में, दोनों पत्रों का उल्लेख है कि "यह दिखाना आसान है कि न्यूनतम के-लिंक पथ की गणना ओ (एनके) समय में की जा सकती है" - क्या आप शायद जानते हैं कि उनका क्या मतलब है? मुझे इस पर कोई और जानकारी नहीं मिली। समस्या यह है, वे कागज मेरे छोटे सिर के लिए एक छोटे से बहुत जटिल हैं इसलिए मैं अधिक जानकारी प्राप्त करने की कोशिश कर रहा हूं, शायद एक कार्यान्वयन, ...
इकिर हाना

-3

मुझे नहीं पता कि यह मदद करता है, लेकिन इस टिप्पणी के अंत में कोई व्यक्ति पीएचपी में जो चाहता है उसे लागू करता है; शायद आप एल्गोरिथ्म का पता लगा सकते हैं।


4
टिप्पणी में वे वांछित लाइनों की संख्या के बाद शेष लाइनों को काट देते हैं। वे PHP का उपयोग करते हैं wordwrap(), जो बदले में लालची (यानी "समान रूप से" समान रूप से) को लपेटने के लिए एल्गोरिथ्म का उपयोग नहीं करता है। फिर भी, सवाल यह है कि $widthतर्क का "अनुमान" कैसे किया जाए wordwrap()। लेकिन उत्तर के लिए धन्यवाद, वैसे भी!
इकिर हाना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.