2011-06-17 15 views
5

जावा में टाइल्स की 2-आयामी ग्रिड प्रोग्रामिंग करते समय उपयोग करने के लिए सबसे अच्छी डेटा संरचना क्या है? ग्रिड पर टाइलों को आसानी से उनके स्थान से संदर्भित किया जाना चाहिए, ताकि पड़ोसियों और पथों को कुशलता से गणना की जा सके। क्या यह 2 डी सरणी होनी चाहिए? एक ArrayList? कुछ और?जावा में एक 2 डी ग्रिड प्रोग्रामिंग

उत्तर

9

यदि आप गति या स्मृति के बारे में चिंता नहीं कर रहे हैं, तो आप बस 2 डी सरणी का उपयोग कर सकते हैं - यह अच्छी तरह से काम करना चाहिए।

यदि गति और/या स्मृति आपके लिए समस्याएं हैं तो यह स्मृति उपयोग और पहुंच पैटर्न पर निर्भर करती है।

यदि आपको उच्च प्रदर्शन की आवश्यकता है तो एक एकल आयामी सरणी जाने का तरीका है। आप उचित सूचकांक को y * wdt + x के रूप में गणना करते हैं। इसके साथ 2 संभावित समस्याएं हैं: कैश मिस और मेमोरी उपयोग।

यदि आप जानते हैं कि आपका एक्सेस पैटर्न ऐसा है कि आप अधिकतर समय के तत्वों के पड़ोसियों को लाते हैं, तो उपरोक्त वर्णित एक 1 डी सरणी में 2 डी स्पेस को मैप करने से कैश मिस हो सकता है - आप पड़ोसियों को बंद करना चाहते हैं स्मृति, और पड़ोसियों 2 अलग पंक्तियों से नहीं हैं। आपको अपने 2 डी टाइल्स को अपने 1 डी सरणी में एक अलग क्रम में मैप करना पड़ सकता है। उदाहरण के लिए Hilbert curves देखें।

बेहतर मेमोरी उपयोग के लिए, यदि आप जानते हैं कि आपकी अधिकांश टाइल्स हमेशा समान होती हैं (जैसे हमेशा घास), तो आप sparse array या quad tree को लागू करना चाहेंगे। दोनों को ध्यान में कैश जागरूकता के साथ काफी कुशलता से कार्यान्वित किया जा सकता है (स्पैस सरणी लिंक इसके लिए अच्छा उदाहरण है)। एक अन्य लाभ यह है कि इन्हें गतिशील रूप से बढ़ाया जा सकता है। हालांकि, काम करने के लिए आपको हमेशा अंत में संकेत के अतिरिक्त स्तर का भुगतान करना होगा।

नोट: HashMap एस जैसे सामान्य वर्गों का उपयोग करने के साथ सावधान रहें, यदि आप प्रदर्शन के बारे में चिंतित हैं तो कुंजी प्रकार कुछ आदिम प्रकार या विशेष स्थान वर्ग के साथ सावधान रहें - आपको या तो प्रत्येक बार जब आप इंडेक्स करते हैं तो आपको ऑब्जेक्ट आवंटित करना होगा हैश नक्शा या मुक्केबाजी/अनबॉक्सिंग की कीमत का भुगतान करें। इसके अलावा, हैश मानचित्र आपको कुशल स्थानिक प्रश्नों की अनुमति नहीं देंगे (उदा। मुझे किसी दिए गए ऑब्जेक्ट के त्रिज्या आर में मौजूद सभी ऑब्जेक्ट्स दें - क्वाड पेड़ इसके लिए बेहतर हैं)।

+0

+1 और प्रदर्शन समस्याओं पर ध्यान केंद्रित करने के लिए +1। –

2

यदि आप विशिष्ट स्थानों में सामान डालने की योजना बनाते हैं तो एक 2 डी सरणी एक अच्छी शर्त की तरह लगती है। जब तक यह एक निश्चित आकार के रूप में।

3

यदि आपके ग्रिड के लिए निश्चित आयाम है, तो 2 डी सरणी का उपयोग करें। यदि आपको आकार गतिशील होने की आवश्यकता है, तो ArrayLists के ArrayList का उपयोग करें।

1

यदि आपको केवल ग्रिड और कोशिकाओं के यादृच्छिक पते पर पुन: प्रयास करने की आवश्यकता है, तो MyCellType [] [] ठीक होना चाहिए। अंतरिक्ष के संदर्भ में यह सबसे कुशल है और (इन्हें उम्मीद है) इन उपयोग-मामलों के लिए समय।

2

वास्तव में उपयोग करने के लिए डेटा संरचना के संचालन के प्रकार आप प्रदर्शन करेंगे पर निर्भर करता है:

मामले में

ग्रिड में सार्थक पदों (अशून्य/nondefault) की संख्या नहीं बल्कि कम है (< < nxm) यह हैशैप का उपयोग करने के लिए और अधिक कुशल हो सकता है, जो (x, y) विशिष्ट टाइल्स में स्थितियों को मानचित्र करता है। इसके अलावा आप अधिक कुशलतापूर्वक सार्थक पदों पर भी पुन: प्रयास कर सकते हैं। इसके अलावा आप मार्ग/पड़ोस के ट्रैवर्सल को गति देने के लिए प्रत्येक टाइल पर पड़ोसी टाइल्स के संदर्भ संग्रहीत कर सकते हैं।

यदि आपका ग्रिड "सूचना" से घिरा हुआ है तो आपको 2 डी सरणी या ऐरेलिस्ट का उपयोग करने पर विचार करना चाहिए (यदि आप किसी बिंदु पर सामान्य प्रकार "टाइल-टाइप" के रूप में शामिल होते हैं, तो आपको जावा के बाद से ऐरेलिस्ट का उपयोग करना होगा जेनेरिक प्रकार के देशी सरणी की अनुमति नहीं देता है)।विकल्पों की विस्तृत श्रृंखला के लिए

संबंधित मुद्दे