आपके सवाल का दो भागों हैं:
- डेटा संरचना किस तरह का नक्शा जानकारी स्टोर करने के लिए प्रयोग किया जाता है।
- स्रोत से गंतव्य तक "नेविगेट" करने के लिए किस प्रकार का एल्गोरिदम उपयोग किया जाता है।
इस के लिए
, मैं एक और सवाल जोड़ना होगा:
- कैसे गूगल/बिंग करने में सक्षम "स्ट्रीम में" डेटा है। तो उदाहरण के लिए, आप समन्वय प्रणाली को बनाए रखने के दौरान, मील स्तर से जमीन के स्तर तक ज़ूम इन करने में सक्षम हैं।
मैं प्रत्येक प्रश्न को क्रम में संबोधित करने का प्रयास करूंगा। ध्यान दें, कि मैं Google मानचित्र या बिंग टीम के लिए काम नहीं करता, इसलिए जाहिर है, यह जानकारी पूरी तरह सटीक नहीं हो सकती है। मैं डेटा संरचनाओं और एल्गोरिदम के बारे में एक अच्छा सीएस पाठ्यक्रम से प्राप्त ज्ञान के इस आधार पर आधारित हूं।
उत्तर 1) नक्शा एक एज भारित निर्देशित ग्राफ में संग्रहीत है। मानचित्र पर स्थान वर्टिसेस हैं और एक स्थान से दूसरे स्थान पर पथ (एक कशेरुक से दूसरे तक) एज हैं।
स्पष्ट रूप से, चूंकि लाखों शिखर और परिमाण के किनारों का क्रम हो सकता है, वास्तव में दिलचस्प बात इस एज भारित अंक का प्रतिनिधित्व होगी।
मैं कहूंगा कि यह किसी प्रकार की एडजेंसी सूची द्वारा प्रदर्शित किया जाएगा और कारण मैं ऐसा कहता हूं क्योंकि, यदि आप मानचित्र की कल्पना करते हैं, तो यह अनिवार्य रूप से एक स्पैस ग्राफ है। एक स्थान से दूसरे स्थान पर जाने के कुछ ही तरीके हैं। अपने घर के बारे में सोचो! कितने सड़कों (हमारे मामले में किनारों) इसके लिए नेतृत्व करते हैं? आकस्मिक सूचियां स्पैस ग्राफ का प्रतिनिधित्व करने के लिए अच्छी हैं, और आसन्न मैट्रिक्स घने ग्राफ का प्रतिनिधित्व करने के लिए अच्छा है।
बेशक, भले ही हम मेमोरी में स्पैर ग्राफ का कुशलतापूर्वक प्रतिनिधित्व करने में सक्षम हैं, वर्टिस और एज की बड़ी संख्या के बाद, स्मृति में सब कुछ एक साथ स्टोर करना असंभव होगा। इसलिए, मैं कल्पना करता हूं कि नीचे किसी प्रकार की स्ट्रीमिंग लाइब्रेरी है।
इसके लिए एक समानता बनाने के लिए, यदि आपने कभी भी वर्ल्डक्राफ्ट/सीरिम/जीटीए जैसे ओपन-वर्ल्ड गेम खेला है, तो आप देखेंगे कि एक बड़े हिस्से में, कोई लोडिंग स्क्रीन नहीं है। लेकिन जाहिर है, सब कुछ एक ही समय में स्मृति में फिट करना असंभव है।इस प्रकार क्वाड-पेड़ और फ्रस्टम कल्लिंग एल्गोरिदम के संयोजन का उपयोग करके, ये गेम गतिशील रूप से संसाधन लोड कर सकते हैं (इलाके, sprites, meshes आदि)।
मैं कुछ समान कल्पना करता हूं, लेकिन ग्राफ के लिए। मैंने इस विशेष पहलू में बहुत कुछ नहीं सोचा है, लेकिन एक बहुत ही बुनियादी प्रणाली को पकाए जाने के लिए, कोई मेमोरी डेटाबेस में कल्पना कर सकता है, जिसे वे आवश्यकतानुसार रन-टाइम पर ग्राफ से चरम और किनारों को जोड़ते हैं और हटाते हैं। यह हमें एक और दिलचस्प बिंदु पर लाता है। चूंकि कोने और किनारों को हटाया जाना चाहिए और रन-टाइम पर जोड़ा जाना चाहिए, इसलिए एडजेंसी सूची का क्लासिक कार्यान्वयन इसे काट नहीं देगा।
क्लासिक कार्यान्वयन में, हम केवल एक सरणी के प्रत्येक तत्व में एक सूची (जावा में एक वेक्टर) स्टोर करते हैं: adj []। मैं कल्पना करूंगा, विज्ञापन [] सरणी के स्थान पर एक लिंक्ड सूची और सूची [एज] के स्थान पर एक बाइनरी खोज पेड़। द्विआधारी खोज पेड़ ओ (लॉग एन) सम्मिलन और नोड्स को हटाने की सुविधा प्रदान करेगा। सूची कार्यान्वयन में यह बेहद वांछनीय है, जबकि अतिरिक्त ओ (1) है, हटाने ओ (एन) है और जब आप लाखों किनारों से निपट रहे हैं, तो यह निषिद्ध है।
यहां ध्यान देने योग्य एक अंतिम बिंदु यह है कि जब तक आप वास्तव में नेविगेशन शुरू नहीं करते हैं, वहां "नहीं" ग्राफ होता है। चूंकि लाखों उपयोगकर्ता हो सकते हैं, इसलिए सभी के लिए एक विशाल ग्राफ बनाए रखने के लिए यह समझ में नहीं आता है (यह केवल स्मृति स्थान आवश्यकता के कारण असंभव होगा)। मैं कल्पना करता हूं कि जब आप नेविगेशन प्रक्रिया को स्टेट करते हैं, तो आपके लिए एक ग्राफ बनाया जाता है। जाहिर है, चूंकि आप स्थान ए से शुरू करते हैं और स्थान बी (और उसके बाद संभवतः अन्य स्थानों) पर जाते हैं, तो आपके लिए बनाए गए ग्राफ को बहुत बड़ी मात्रा में स्मृति नहीं लेनी चाहिए (बशर्ते स्ट्रीमिंग आर्किटेक्चर जगह पर हो)।
उत्तर 2) यह एक बहुत ही रोचक सवाल है। इस समस्या को हल करने के लिए सबसे बुनियादी एल्गोरिदम Dijkstra पथ ढूँढना एल्गोरिदम होगा। ए * अस्तित्व में तेज बदलाव। मैं कल्पना करता हूं कि डिजस्ट्रा पर्याप्त तेज़ होगा, अगर यह ऊपर चर्चा की स्ट्रीमिंग आर्किटेक्चर के साथ ठीक से काम कर सकता है। डिजस्ट्रा ई और एलजी वी के अनुपात आनुपातिक स्थान का उपयोग करता है, जो विशेष रूप से स्पैस ग्राफ के लिए बहुत अच्छे आंकड़े हैं। ध्यान रखें, अगर स्ट्रीमिंग आर्किटेक्चर को कम नहीं किया गया है, तो वी और ई विस्फोट हो जाएंगे और डिजस्ट्रा की स्पेस और रन-टाइम आवश्यकताएं इसे निषिद्ध बनाती हैं।
उत्तर 1) स्ट्रीमिंग प्रश्न: ऊपर चर्चा की गई स्ट्रीमिंग आर्किटेक्चर के साथ इस प्रश्न को भ्रमित न करें। यह मूल रूप से पूछ रहा है कि निर्बाध ज़ूम कैसे प्राप्त किया जाता है।
इसे प्राप्त करने के लिए एक अच्छा एल्गोरिदम क्वाड ट्री एल्गोरिदम है (आप इसे एन-पेड़ में सामान्यीकृत कर सकते हैं)। जब आप पेड़ को पार करते हैं तो आप पेड़ और उच्च रिज़ॉल्यूशन छवियों में उच्चतर कोरर्स छवियों को स्टोर करते हैं। यह वास्तव में केएमएल (कीहोल) ने अपने मानचित्रण एल्गोरिदम के साथ किया था। कीहोल एक ऐसी कंपनी थी जिसने कई वर्षों पहले एनवीआईडीआईए के साथ साझेदारी की, सॉफ्टवेयर की तरह पहली "Google धरती" में से एक का उत्पादन किया।
क्वाड ट्री कूलिंग के लिए प्रेरणा आधुनिक 3 डी गेम से आती है, जहां इसका उपयोग उस दृश्य के हिस्सों को तुरंत खींचने के लिए किया जाता है जो दृश्य में नहीं है।
इसे और स्पष्ट करने के लिए, कल्पना करें कि आप संयुक्त राज्य अमेरिका के मानचित्र को वास्तव में ऊपर से देख रहे हैं। इस स्तर पर, आप मूल रूप से मानचित्र को 4 वर्गों में विभाजित करते हैं और प्रत्येक अनुभाग को क्वाड ट्री के बच्चे बनाते हैं।
अब, जैसे ही आप ज़ूम इन करते हैं, आप अनुभागों में से एक पर ज़ूम इन करते हैं (जाहिर है कि आप केंद्र में सही ज़ूम कर सकते हैं, ताकि आपका ज़ूम वास्तव में सभी 4 अनुभागों को छू सके, लेकिन सादगी के लिए, मान लें कि आप ज़ूम इन करते हैं खंडों में से एक पर)। तो जब आप एक सेक्शन में ज़ूम इन करते हैं, तो आप उस सेक्शन के 4 बच्चों को पार करते हैं। इन 4 बच्चों में अपने माता-पिता का उच्च रिज़ॉल्यूशन डेटा होता है। तब तक आप ज़ूम डाउन करना जारी रख सकते हैं जब तक आप पत्तियों का एक सेट हिट न करें, जिसमें उच्चतम रिज़ॉल्यूशन डेटा होता है। एक संकल्प से अगले "निर्बाध" तक कूदने के लिए धुंध और लुप्तप्राय प्रभावों का संयोजन उपयोग किया जा सकता है।
इस पोस्ट के अनुवर्ती के रूप में, मैं यहां दी गई कई अवधारणाओं के लिंक जोड़ने का प्रयास करूंगा।
वाह। उस विकिपीडिया लेख में कई मुद्दे हैं। –