algorithm - Area of intersection of axis-aligned rectangles -


  • प्रत्येक आयत में इस तरह 4 डबल्स होते हैं: (x0, y0, x1, y1) < / P>

  • किनारों एक्स और वाई अक्ष के समानांतर हैं

  • वे बेतरतीब ढंग से रखा जाता है - वे किनारों पर छू सकते हैं, अतिव्यापी, या कोई संपर्क नहीं है

    मुझे उस क्षेत्र को खोजना होगा जो उनके ओवरलैप द्वारा बनाई गई है - कैनवास में सभी क्षेत्रफल जो एक से अधिक आयताकार "कवर" ( उदाहरण के लिए दो आयताकारों के साथ, यह चौराहे होगा)

    मुझे समझ में आता है कि मुझे स्वीप लाइन एल्गोरिदम का उपयोग करना होगा। क्या मुझे एक पेड़ की संरचना का उपयोग करना है? इस समस्या के लिए स्वीप लाइन एल्गोरिथ्म का उपयोग करने का सबसे आसान तरीका क्या है?

    पहले ब्लश पर ऐसा लगता है कि ओ (एन ^ 2) एल्गोरिथ्म सीधा होना चाहिए क्योंकि हम सिर्फ सभी जोड़ीदार बिंदुओं की जांच कर सकते हैं। हालांकि, यह दोहरी गिनती की समस्या पैदा करेगा, क्योंकि 3 अंकों के सभी बिंदुओं को 3 बार गिना जाएगा! यह महसूस करने के बाद, एक ओ (एन ^ 2) एल्गोरिथ्म अब मेरे लिए बुरा नहीं लग रहा है यदि आप एक तुच्छ ओ (एन ^ 2) एल्गोरिथ्म के बारे में सोच सकते हैं, तो कृपया पोस्ट करें।

    यहां एक ओ (एन ^ 2 लॉग ^ 2 एन) एल्गोरिदम है।

    डेटा संरचना: बिंदु (पी) {x_value, isBegin, isEnd, y_low, y_high, rectid}

    [प्रत्येक बिंदु के लिए, हमारे पास एक x_value, दो y_values ​​और आयत की आईडी, जो यह बिंदु से आया है]

    1. को देखते हुए आयताकारों, पहले आयत के x_left और x_right मानों का उपयोग करते हुए ऊपर 2n अंक बनाते हैं।

    2. एक सूची बनाएं अंकों की, और इसे x_value पर सॉर्ट करें यह ओ (एन लॉग एन) समय लेता है

    3. बाईं ओर से शुरू करें (सूचकांक 0), जब आप एक शुरुआत को देखते हैं, और जब आप एक अंत देखते हैं तो निकालने के लिए मानचित्र का उपयोग करें बिंदु।

      दूसरे शब्दों में:

        नक्शा m = नया हैशमैप (); // x- अक्ष में ओवरलैप करने के लिए (सॉर्ट किए गए सूची में प्वाइंट पी) {if (p.isBegin ()) {m.put (p); // m आयताकार आईडी से बंद किया गया है यदि (s.size ()> gt2 = 2) {चेकओवरलापिंगरेक्टेन्लेल्स (m.values ​​())}} else {m.remove (p); // इसलिए, यह ओ (लॉग एन) समय ले जाता है}}   

      अगला, हमें एक फ़ंक्शन की आवश्यकता होती है जो आयत की सूची लेती है, यह जानकर कि सभी आयतों में एक्स अक्ष अतिव्यापी है, लेकिन हो सकता है या y अक्ष पर ओवरलैप न हो। वास्तव में यह एल्गोरिथ्म के समान है, हम सिर्फ अनुक्रम डेटा संरचनाओं का उपयोग करते हैं क्योंकि हम वाई अक्ष में रुचि रखते हैं।

Comments