2015-09-12 11 views
11

मुझे सी ++ और जावा में वेक्टर पता है, यह गतिशील ऐरे की तरह है, लेकिन मुझे वेक्टर डेटा संरचना की कोई सामान्य परिभाषा नहीं मिल रही है। तो वेक्टर क्या है? वेक्टर एक सामान्य डेटा संरचना है (जैसे एरे, स्टैक, कतार, पेड़, ...) या यह भाषा के आधार पर सिर्फ एक डेटा प्रकार है?वेक्टर डेटा संरचना

+0

यह निश्चित रूप से राय का विषय है। – gurghet

+0

यह मेरे लिए स्पष्ट नहीं है कि आप "सामान्य डेटा संरचना" और "केवल एक डेटा प्रकार" द्वारा व्यक्त करने की कोशिश कर रहे हैं। – Hurkyl

उत्तर

4

यह गतिशील रूप से आवंटित स्थान के साथ एक सरणी है, हर बार जब आप इस स्थान को पार करते हैं तो स्मृति में नई जगह आवंटित की जाती है और पुराने सरणी को नए में कॉपी किया जाता है। पुराना एक तो मुक्त हो जाता है।

इसके अलावा, वेक्टर आमतौर पर अधिक स्मृति को आवंटित करता है, इसकी आवश्यकता होती है, इसलिए जब नए तत्व को जोड़ा जाता है तो उसे सभी डेटा कॉपी करने की आवश्यकता नहीं होती है।

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

और क्या है। आप अंत में और वेक्टर के सामने के लिए नया डेटा जोड़ सकते हैं। क्योंकि वेक्टर की सरणी जैसी होती है, फिर हर बार जब आप वेक्टर की शुरुआत में तत्व जोड़ना चाहते हैं तो सभी सरणी की प्रतिलिपि बनाई जानी चाहिए। वेक्टर के अंत में तत्व जोड़ना कहीं अधिक कुशल है। लिंक्ड सूचियों के साथ ऐसा कोई मुद्दा नहीं है।

वेक्टर अपने आंतरिक रखे डेटा तक यादृच्छिक पहुंच देता है, जबकि सूचियां, कतार, ढेर नहीं होते हैं।

12

कंप्यूटर विज्ञान/प्रोग्रामिंग पर लागू "वेक्टर" शब्द गणित से लिया जाता है, जो उपयोग को भ्रमित कर सकता है (यहां तक ​​कि आपका प्रश्न कई विषयों पर भी हो सकता है)।

गणित में वैक्टरों का सबसे सरल उदाहरण संख्या रेखा है, जो प्राथमिक गणित को पढ़ाने के लिए उपयोग की जाती है (विशेष रूप से नकारात्मक संख्याओं को देखने में मदद करने के लिए, नकारात्मक संख्याओं का घटाव, नकारात्मक संख्याओं के अतिरिक्त, आदि)।

वेक्टर एक बिंदु से दूरी और दिशा है। यही कारण है कि यह चर्चा को भ्रमित कर सकता है, क्योंकि एक वेक्टर डेटा संरचना 3 डी ग्राफिक्स इंजन, या 2 डी पॉइंट (केवल एक्स, वाई) में उपयोग की जाने वाली संरचना में तीन अंक, एक्स, वाई, जेड हो सकती है। उस संदर्भ में, दो ऐसे बिंदुओं का घटाव वेक्टर में होता है - वेक्टर वर्णन करता है कि स्रोत स्रोतों में से किसी एक से कितनी दूर और किस दिशा में यात्रा करना है।

यह स्टोरेज पर लागू होता है, जैसे कि स्टेल वैक्टर या जावा वैक्टर, उस भंडारण को एक पते से दूरी के रूप में दर्शाया जाता है (जहां एक स्मृति पता अंतरिक्ष में किसी बिंदु के समान होता है, या एक संख्या रेखा पर)।

अवधारणा सरणी से संबंधित है, क्योंकि सरणी एक वेक्टर के लिए आवंटित भंडारण हो सकती है, लेकिन मैं प्रस्तुत करता हूं कि वेक्टर सरणी की तुलना में एक बड़ी अवधारणा है। एक वेक्टर में शुरुआती बिंदु से दूरी की अवधारणा को अवश्य शामिल करना चाहिए, और यदि आप प्रारंभिक बिंदु के रूप में किसी सरणी की शुरुआत के बारे में सोचते हैं, तो सरणी के अंत तक दूरी यह आकार है।

तो, एक वेक्टर का प्रतिनिधित्व करने वाली डेटा संरचना में आकार शामिल होना चाहिए, जबकि एक सरणी में आकार शामिल करने के लिए भंडारण नहीं होता है, इसे आवंटित तरीके से माना जाता है। ऐसा कहने के लिए, यदि आप गतिशील रूप से सरणी आवंटित करते हैं, तो उस सरणी के आकार को संग्रहीत करने वाली कोई डेटा संरचना नहीं है, प्रोग्रामर को उस आकार को जानना चाहिए, या इसे किसी पूर्णांक या लंबे समय तक स्टोर करना चाहिए।

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

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

तो, एक बुनियादी वेक्टर डेटा संरचना होना चाहिए:

एक पते (प्रारंभिक बिंदु)

एक तत्व का आकार (प्रत्येक बात यह संग्रहीत करता है एक्स है लंबे बाइट्स)

तत्वों की संख्या संग्रहीत (कितने तत्व तत्व तत्व आकार 'न्यूनतम' भंडारण आकार है)।

वेक्टर डेटा संरचना में प्रविष्टियों की इस साधारण 3 आइटम सूची में किए गए एक महत्वपूर्ण "धारणा" यह है कि पता स्मृति आवंटित किया जाता है, जिसे किसी बिंदु पर मुक्त किया जाना चाहिए, और इसे अंत तक पहुंच के विरुद्ध संरक्षित किया जाना चाहिए वेक्टर

इसका मतलब है कि कुछ गुम है। वेक्टर वर्ग के काम को करने के लिए, वेक्टर में संग्रहीत आईटीईएम की संख्या और उस भंडारण के लिए आवंटित स्मृति की मात्रा के बीच एक पहचानने योग्य अंतर है। आम तौर पर, जैसा कि आप एसटीएल से वेक्टर के उपयोग से महसूस कर सकते हैं, यह "पता" हो सकता है कि इसमें 10 आइटम स्टोर करने के लिए कमरा है, लेकिन वर्तमान में केवल उनमें से 2 हैं।

तो, एक वर्किंग वेक्टर क्लास को भी स्मृति आवंटन की मात्रा को स्टोर करना होगा। यह होगा कि यह गतिशील रूप से खुद को कैसे बढ़ा सकता है - अब इसमें स्वचालित रूप से संग्रहण का विस्तार करने के लिए पर्याप्त जानकारी होगी।

इस बारे में सोचकर कि आप एक वेक्टर कक्षा कैसे संचालित करेंगे, आपको वेक्टर कक्षा संचालित करने के लिए आवश्यक डेटा की संरचना देता है।

+0

आपका उत्तर बहुत विस्तृत और सहायक है, क्या आप मुझे अपने उत्तर के लिए एक संदर्भ दस्तावेज दिखा सकते हैं (कंप्यूटर विज्ञान में वेक्टर डेटा संरचना, न केवल सी ++ में) या यह सिर्फ आपकी राय और अनुभव है? – Ikarus

+0

ओच! यह अनुभव से बाहर चेतना की एक धारा थी, लेकिन आपको डेटा संरचनाओं पर कई ग्रंथों में इन पंक्तियों के साथ कुछ मिल जाएगा। मेरे पास 20 से अधिक वर्षों में मेरे हाथों में इस विषय पर कोई पुस्तक या संदर्भ नहीं है (मैं '81 से डेवलपर रहा हूं), इसलिए एक सटीक शीर्षक मुझे बच निकला है। साथ ही, मैं विस्तार कर सकता हूं कि एसटीएल वैक्टरों में स्थैतिक स्थिरांक हो सकते हैं या शायद 'ट्यूनेबल' सदस्य विस्तार विकल्प का संकेत दे सकते हैं - उदाहरण के लिए, कुछ वैक्टर एक समय में 10 आइटम का विस्तार करने के लिए अच्छा कर सकते हैं, जबकि अन्य 1000 आइटम भी बढ़ा सकते हैं समय पर। – JVene

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