"आयतन" के लिए एल्गोरिथ्म आयतों की एक छोटी संख्या में कई आयतें?


14

यहाँ छवि विवरण दर्ज करें

कहो कि मेरे पास अलग-अलग आकार और रंगों के आयतों का एक ग्रिड है और मैं कम करना चाहता हूं (यथोचित करीब करीब ठीक है, इष्टतम आवश्यक नहीं है) रंगों के समान लेआउट का प्रतिनिधित्व करने के लिए आयतों की संख्या।

ऊपर की छवि एक बहुत ही सरलीकृत मामला है और आयतों के बीच व्हाट्सएप केवल दृश्य के लिए है - वे वास्तव में कसकर पैक किए जाएंगे।

एक दृष्टिकोण या एल्गोरिथ्म नाम (Google से खुश) क्या है जो मुझे ऐसा करने में मदद कर सकता है?


3
क्या आप हमें कुछ बता सकते हैं कि ये आयतें कहाँ से आती हैं? क्या वे किसी भी अंतर्निहित ग्रिड के साथ (लगभग) संरेखित करते हैं, या कुछ सामान्य बिल्डिंग ब्लॉक, या कुछ सबसे छोटे "परमाणु" आयत को साझा करते हैं? क्या उन्हें घुमाया जा सकता है? यह उस तरह की समस्या की तरह दिखता है जो सबसे सामान्य मामले में बहुत कांटेदार हो सकता है, लेकिन बहुत आसान हो सकता है यदि हम आपके विशेष परिदृश्य में कुछ बाधाओं या सामान्यताओं का फायदा उठा सकते हैं।
DMGregory

वर्गों की एक अंतर्निहित ग्रिड (एक बिसात की तरह) है और प्रत्येक आयत उन अंतर्निहित वर्गों के साथ सीमाओं को साझा कर रही है। यानी आप प्रत्येक आयत के शीर्ष / तल / बाएँ / दाएँ का वर्णन करने के लिए पूर्णांक का उपयोग कर सकते हैं। इसके लिए उन्हें 90 डिग्री से विभाज्य नहीं कोणों में घुमाया नहीं जा सकता। इसके अलावा NxM ग्रिड पूरी तरह से आयतों के साथ आबाद है - कोई खुला ग्रिड स्थिति नहीं है।
२२:२

मैं केवल उस मामले से बचने की कोशिश कर रहा हूं जो ऊपर (उदाहरण के लिए एक रंग परिप्रेक्ष्य) से दिखता है, लेकिन यह 1x1 आयतों के एक टन से बना है और मैं उनमें से प्रत्येक को संसाधित कर रहा हूं जब मैं कई में स्थान को संभाल सकता हूं कम कॉल।
xaxxon

मैं किसी तरह का अनुमान लगा रहा हूं "बस कहीं शुरू करो और एक आयाम में बड़े और बड़े आयतें (लंबवत कहो) का प्रयास करते रहें जब तक कि आप एक रंग सीमा से नहीं टकराते हैं, तब तक दूसरे आयाम (क्षैतिज रूप से) को तब तक बढ़ाएं जब तक आप एक सीमा नहीं मारते। तब क्षैतिज रूप से पहले प्रयास करें। । हो सकता है कि केवल चौकों की कोशिश करें (तिरछे बढ़ते हुए)। लेकिन निश्चित रूप से उपरोक्त 3 संभावनाओं में से सबसे सही विकल्प का चयन करने पर निश्चित नहीं।
xaxxon

क्या यह किसी मौजूदा आयत को विभाजित करने के लिए स्वीकार्य है, अगर इसका परिणाम अंत में कम आयतों में होता है? या एल्गोरिथ्म केवल विलय करना चाहिए? इसके अलावा, कुल गणना केवल एकमात्र मानदंड है, या क्या आप छोटे लोगों पर लंबे स्किनी स्लवर्स / बड़े आयतों पर स्क्वरर आकार पसंद करते हैं?
DMGregory

जवाबों:


15

सबसे पहले, हम आपके स्रोत के आयतों को आपके अंतर्निहित ग्रिड में कोशिकाओं में बदल सकते हैं, ताकि इनपुट को अधिक समान बनाया जा सके। (प्रभावी रूप से समस्या को तेज करते हुए)

इससे हमें ऐसे अनुकूलन मिलेंगे, जो प्रत्यक्ष रूप से स्रोत आयतों के साथ काम करते समय स्पष्ट नहीं हो सकते हैं - विशेषकर तब जब इसमें अलग-अलग तरह से पुनर्संयोजन करने के लिए कई स्रोत आयतों को विभाजित करना शामिल होता है।

उदाहरण आयतों को ग्रिड कोशिकाओं और पीठ में परिवर्तित करना

अगला हम गहराई-पहले-खोज या बाढ़ भरने वाले एल्गोरिदम का उपयोग करके एक ही रंग के जुड़े क्षेत्रों को पा सकते हैं। हम प्रत्येक जुड़े क्षेत्र (एक पॉलोमिनो) पर विचार कर सकते हैं अलगाव में ) - कुछ भी नहीं जो हम एक अलग क्षेत्र में करते हैं उसे इस पर प्रभाव डालने की आवश्यकता है।

प्रभावी रूप से हम इस पॉलोमिनो को आयतों में विभाजित करने का एक तरीका ढूंढना चाहते हैं (दुर्भाग्य से अधिकांश साहित्य जो मुझे मिल सकता है, वह विपरीत समस्या के बारे में है: आयतों को पॉलीओमीनो में विभाजित करना! इससे लीड की खोज करना मुश्किल हो जाता है ...

एक सीधी विधि आसन्न वर्गों के क्षैतिज रन को लंबी स्कीनी आयतों में संयोजित करना है। फिर हम ऊपर की पंक्ति के खिलाफ तुलना कर सकते हैं और जोड़ सकते हैं यदि हमारा रन शुरू और समाप्त होता है - या तो हम प्रत्येक रन / पंक्ति को समाप्त करते हैं, या जैसा कि हम प्रत्येक सेल को वर्तमान रन में जोड़ने पर विचार करते हैं।

एक पॉलोमिनो को क्षैतिज रन में बदलना, फिर लंबवत विलय करना

मुझे अभी तक नहीं पता है कि यह तरीका कितना करीबी है। ऐसा लगता है कि यह थोड़ी परेशानी में पड़ सकता है जब एक पंक्ति जिस पर अभी तक विचार नहीं किया गया है वह अब तक देखी गई पंक्तियों की तुलना में एक अलग विभाजन का सुझाव देती है:

3-आयत समाधान के साथ एक मामले का उदाहरण, जहां ऊपर की विधि 4 पाता है

पता चलता है कि जब एक रन / आयत बिल्कुल ऊपर और नीचे के रनों द्वारा कवर किया जाता है, तो इसे विभाजित करने और उन्हें विलय करने से यह विशेष मामला हल हो जाएगा, लेकिन मैंने यह नहीं पता लगाया है कि समस्या कितनी सामान्य है।

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

एक और तरीका जो मैं देख रहा हूं वह है शीर्ष पंक्ति में पाया गया पहला रन लेना और जहाँ तक आप यह कर सकते हैं नीचे तक बढ़ाएँ। फिर जो बचा है उसकी शीर्ष पंक्ति में पहला रन लें ... यह उल्टे टी आकार पर ट्रिप-अप हो जाता है, इसलिए यह या तो इष्टतम नहीं है।

मुझे लगता है कि इष्टतम विभाजन को खोजने के लिए गतिशील प्रोग्रामिंग का उपयोग करने का एक तरीका शायद है, लेकिन मैंने अभी तक इसे नहीं पाया है।


भयानक जवाब के लिए धन्यवाद! यह समाधान बहुत जल्दी दिखता है कि मैं इसे कुछ अलग दिशाओं में चला सकता हूं और चुन सकता हूं कि कौन सबसे अच्छा लगता है - बाएं, दाएं, क्षैतिज दाएं-> बाएं, और फिर प्रत्येक तरह से ऊर्ध्वाधर।
xaxxon

2
मुसीबत यह है कि हम ऐसे आकृतियों का निर्माण कर सकते हैं जो हर स्वीप दिशा से एल्गोरिथ्म को भ्रमित करेंगे। उन लोगों को वास्तविक उपयोग में दिखाने की संभावना नहीं हो सकती है, लेकिन यह अभी भी मुझे परेशान करता है। मुझे लगता है कि अभी तक एक साधारण तय है ... प्रत्येक रन में कुछ ध्यान देने योग्य है, चाहे इसके मध्य भाग के ऊपर अवतल कोने हों। फिर अगर बाद का रन ठीक ऐसे ही बिंदु पर समाप्त होता है, तो हम उन्हें ऊपर की तरफ से लंबवत रूप से विभाजित करते हुए दौड़ते हैं। मैंने हालांकि पूरा विवरण नहीं निकाला है।
DMGregory

1
इसके अलावा, मुझे यकीन नहीं है कि बाढ़ भरण कदम क्यों आवश्यक है। जब ग्रिड पॉज़िटिनो से एक लंबी पतली आयत पर जा रहे हैं, तो आप बस उन 1xN आयतों को बनाने के लिए ग्रिड की पूरी पंक्ति या स्तंभ (जो भी आप जा रहे हैं) चल सकते हैं। कभी भी पॉलीमिनो को जानने की आवश्यकता नहीं है, है ना?
xaxxon

आप सही हैं, बाढ़ भरण एक आवश्यक कदम नहीं है। मैंने इसे बाद के चरणों में एक समय में सिर्फ एक रंगीन क्षेत्र पर ध्यान केंद्रित करने के लिए शामिल किया, लेकिन आप आसानी से कई रंगीन क्षेत्रों में पंक्ति स्कैन विधि को लागू कर सकते हैं। परिधि-आधारित पद्धति को एक समय में एक आकार की परिधि पर काम करने की आवश्यकता होती है।
DMGregory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.