एक समस्या पर सोचने के दौरान, मुझे एहसास हुआ कि मुझे निम्नलिखित कार्य को हल करने के लिए एक कुशल एल्गोरिथ्म बनाने की आवश्यकता है:
समस्या: हमें साइड दो-आयामी वर्ग बॉक्स दिए गए हैं जिनके किनारे कुल्हाड़ियों के समानांतर हैं। हम इसे शीर्ष के माध्यम से देख सकते हैं। हालाँकि, क्षैतिज खंड भी हैं। प्रत्येक खंड में एक पूर्णांक -coordinate ( ) और -coordinates ( ) होता है और बिंदुओं को जोड़ता है और (देखो नीचे चित्र)।
हम बॉक्स के शीर्ष पर प्रत्येक इकाई खंड के लिए जानना चाहते हैं, यदि हम इस खंड के माध्यम से देखते हैं तो हम बॉक्स के अंदर कितनी गहराई से देख सकते हैं।
औपचारिक रूप से, , हम ।
उदाहरण: नीचे दिए गए चित्र के अनुसार और खंड दिए गए हैं, परिणाम । देखो कि गहरे प्रकाश बॉक्स में कैसे जा सकते हैं।
हमारे लिए सौभाग्य से, दोनों और कर रहे हैं काफी छोटे और हम बंद लाइन संगणना कर सकते हैं।
इस समस्या को हल करने वाला सबसे आसान एल्गोरिथ्म ब्रूट-फोर्स है: प्रत्येक सेगमेंट के लिए पूरे एरे को ट्रैस करें और जहां आवश्यक हो उसे अपडेट करें। हालांकि, यह हमें बहुत प्रभावशाली ओ (एमएन) नहीं देता है ।
एक महान सुधार एक सेगमेंट ट्री का उपयोग करना है जो क्वेरी के दौरान सेगमेंट पर मूल्यों को अधिकतम करने और अंतिम मूल्यों को पढ़ने में सक्षम है। मैं आगे इसका वर्णन नहीं करूंगा, लेकिन हम देखते हैं कि समय जटिलता ।
हालाँकि, मैं एक तेज़ एल्गोरिथ्म के साथ आया:
रूपरेखा:
कोर्डिनेट के घटते क्रम में सेगमेंट को क्रमबद्ध करें (रैखिक समय की गिनती के भिन्नता का उपयोग करके)। अब ध्यान दें कि यदि पहले किसी भी खंड द्वारा किसी भी -itit खंड को कवर किया गया है, तो कोई भी निम्न खंड इस -unit खंड से गुजरने वाले प्रकाश किरण को बाध्य नहीं कर सकता है। फिर हम बॉक्स के ऊपर से नीचे तक एक लाइन स्वीप करेंगे।x x
अब आइए कुछ परिभाषाओं को प्रस्तुत करते हैं: -unit खंड स्वीप पर एक काल्पनिक क्षैतिज खंड है जिसका निर्देशांक पूर्णांक हैं और जिनकी लंबाई 1. है। स्वीपिंग प्रक्रिया के दौरान प्रत्येक खंड या तो अनमार्क किया जा सकता है (यानी, एक प्रकाश किरण से जा रहा है) बॉक्स के शीर्ष इस सेगमेंट तक पहुँच सकते हैं) या चिह्नित (विपरीत मामले)। हमेशा से अचिह्नित , साथ -unit खंड पर विचार करें । आइए सेट । प्रत्येक सेट के लगातार एक पूरी अनुक्रम में शामिल होंगे चिह्नित (यदि कोई हो तो) एक निम्नलिखित के साथ क्षेत्रों -unit अचिह्नितx x x 1 = n x 2 = n + 1 S 0 = { 0 } , S 1 = { 1 }x खंड।
हमें एक डेटा संरचना की आवश्यकता है जो इन सेगमेंट और सेट पर कुशलतापूर्वक संचालित करने में सक्षम हो। हम अधिकतम -unit सेगमेंट इंडेक्स ( अचिह्नित सेगमेंट का इंडेक्स ) रखने वाले क्षेत्र द्वारा विस्तारित खोज-संघ संरचना का उपयोग करेंगे ।
अब हम सेगमेंट को कुशलता से संभाल सकते हैं। मान लें कि अब हम क्रम में -th सेगमेंट पर विचार कर रहे हैं (इसे "क्वेरी" कहें), जो में शुरू होता है और में समाप्त होता है । हमें सभी अचिह्नित यूनीट सेगमेंट को खोजने की आवश्यकता है जो कि -th सेगमेंट के अंदर समाहित हैं (ये बिल्कुल ऐसे सेगमेंट हैं जिन पर प्रकाश किरण अपना रास्ता समाप्त कर देगी)। हम निम्नलिखित करेंगे: सबसे पहले, हम क्वेरी के अंदर पहला अनचेक्ड सेगमेंट पाते हैं ( सेट का प्रतिनिधि खोजें जिसमें समाहित है और इस सेट का अधिकतम इंडेक्स प्राप्त करें, जो परिभाषा द्वारा अनमार्क्ड सेगमेंट है )। तब यह सूचकांकx 1 x 2 x i x 1 x y क्वेरी के अंदर है, इसे रिजल्ट में जोड़ें (इस सेगमेंट का परिणाम ) और इस इंडेक्स को चिन्हित करें ( और सहित यूनियन सेट )। फिर इस प्रक्रिया को तब तक दोहराएं जब तक कि हम सभी अनचाहे खंडों को न पा लें , यानी अगली खोज क्वेरी हमें सूचकांक ।एक्स + 1 एक्स ≥ एक्स 2
ध्यान दें कि प्रत्येक खोज-संघ ऑपरेशन केवल दो मामलों में किया जाएगा: या तो हम एक सेगमेंट पर विचार करना शुरू कर सकते हैं (जो कि टाइम हो सकता है ) या हमने सिर्फ एक सेनिट सेगमेंट (यह बार हो सकता है ) को चिह्नित किया है । इस प्रकार कुल मिलाकर जटिलता है ( है एकरमैन समारोह उलटा एक )। यदि कुछ स्पष्ट नहीं है, तो मैं इस पर अधिक विस्तार कर सकता हूं। अगर मेरे पास कुछ समय है तो शायद मैं कुछ तस्वीरें जोड़ पाऊंगा।
अब मैं "दीवार" पर पहुँच गया। मैं एक रैखिक एल्गोरिथ्म के साथ नहीं आ सकता, हालांकि ऐसा लगता है कि एक होना चाहिए। तो, मेरे दो सवाल हैं:
- क्या क्षैतिज खंड दृश्यता समस्या को हल करने के लिए एक रेखीय-समय एल्गोरिथ्म (यानी, ) है?
- यदि नहीं, तो इस बात का क्या प्रमाण है कि दृश्यता समस्या ?