2008-11-18 17 views
136

कई प्रोग्रामिंग भाषाओं और पुस्तकालयों का उपयोग करने से मैंने संग्रह में तत्वों की कुल संख्या के लिए उपयोग की जाने वाली विभिन्न शर्तों को देखा है।गणना में लंबाई बनाम लंबाई बनाम आकार

सबसे आम length, count, और size प्रतीत होता है।

उदाहरण के लिए।

array.length 
vector.size() 
collection.count 

क्या कोई पसंदीदा शब्द इस्तेमाल किया जाना है? क्या यह इस बात पर निर्भर करता है कि यह किस प्रकार का संग्रह है? अर्थात। परिवर्तनीय/अपरिवर्तनीय

क्या किसी विधि के बजाय संपत्ति होने की प्राथमिकता है?

+0

और वहां 'List.Capacity' प्रॉपर्टी के साथ-साथ सी # में भी है। – RBT

+0

मुझे आशा है कि नई भाषा अस्पष्ट शर्तों से बचना होगा। –

उत्तर

196

Length() संगत तत्वों को संदर्भित करता है - उदाहरण के लिए एक स्ट्रिंग की लंबाई होती है।

Count() एक लूसर संग्रह में तत्वों की संख्या को संदर्भित करता है।

Size() संग्रह के आकार को संदर्भित करता है, अक्सर यह वैक्टर (या तार) जैसे मामलों में लंबाई से अलग हो सकता है, स्ट्रिंग में 10 वर्ण हो सकते हैं, लेकिन भंडारण 20 के लिए आरक्षित है। यह भी तत्वों की संख्या का उल्लेख कर सकते हैं - स्रोत/दस्तावेज जांचें।

Capacity() - विशेष रूप से संग्रह में आवंटित स्थान को संदर्भित करने के लिए उपयोग किया जाता है और इसमें मान्य तत्वों की संख्या नहीं होती है। यदि प्रकार में "क्षमता" और "आकार" दोनों परिभाषित किए गए हैं तो "आकार" आमतौर पर वास्तविक तत्वों की संख्या को संदर्भित करता है।

मुझे लगता है कि मुख्य बिंदु मानव भाषा और मुहावरे के नीचे है, एक स्ट्रिंग का आकार बहुत स्पष्ट प्रतीत नहीं होता है, जबकि एक सेट की लंबाई समान रूप से भ्रमित होती है, भले ही उन्हें एक ही चीज़ के संदर्भ में उपयोग किया जा सके (तत्वों की संख्या) डेटा के संग्रह में।

+4

तो "लूसर संग्रह" क्या है? मैं आकार के बीच अंतर नहीं देख रहा हूं और यहां गिनती हूं। –

+26

@ben: आकार = उपलब्ध स्लॉट, गिनती = वास्तविक तत्व। आकार == गणना पूर्ण होने पर गिनती है। –

+0

@SnOrfus, यह अभी भी सच है, लेकिन मेरा मतलब उन संग्रहों के लिए था जिनके पास कोई अर्थपूर्ण संगत तत्व नहीं था, उदाहरण के लिए मानचित्र या शब्दकोश। आप यह नहीं कहेंगे कि एक सेट में 10 तत्वों की लंबाई थी, उसमें 10 तत्वों की गिनती होगी। – gbjbaanb

0

मेरे लिए, यह पूछने की तरह थोड़ा है कि "foreach" प्रत्येक के लिए "बेहतर" है या नहीं। यह सिर्फ भाषा/ढांचे पर निर्भर करता है।

+0

और, इससे कोई फर्क नहीं पड़ता? कौन सा शुल्क? क्या हम सभी दो लोगों को चुनने और असंगत होने के लिए जावा लोगों को क्रोधित ईमेल लिखने जा रहे हैं? –

+1

यह मेरा मुद्दा है। आश्चर्य है कि कौन सा बेहतर है। यह है जो यह है। – EBGreen

3

हम्म ... मैं आकार का उपयोग नहीं करता। क्योंकि यह बाइट्स में आकार के साथ उलझन में हो सकता है। लंबाई - सरणी के लिए कुछ समझदारी कर सकती है, जब तक उन्हें स्मृति के परिणामी बाइट्स का उपयोग करना चाहिए। हालांकि ... लंबाई ... क्या में? गणना स्पष्ट है। कितने तत्व मैं गिनती का उपयोग करूंगा।

संपत्ति/विधि के बारे में, मैं संपत्ति का उपयोग तेजी से चिह्नित करने के लिए करता हूं, और इसे धीमा करने के लिए विधि का उपयोग करता हूं।

और, सबसे महत्वपूर्ण - मैं आपके द्वारा उपयोग की जाने वाली भाषाओं/पुस्तकालयों के मानकों के अनुरूप रहूंगा।

+0

तो डेटाब्लॉक के बारे में क्या, केवल बाइट्स का एक गुच्छा। क्या इसकी लंबाई है या इसका आकार है? – Mecki

3

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

और यह एक संपत्ति होना चाहिए जैसा कि यह है: संग्रह का विवरण (उर्फ संपत्ति)। एक विधि का अर्थ यह होगा कि वस्तुओं की संख्या प्राप्त करने के लिए इसे संग्रह में कुछ करना है और यह केवल अनजान लगता है।

2

@ gbjbaanb के उत्तर में जोड़ रहा है ...

"संपत्ति" मूल्य के लिए सार्वजनिक उपयोग का तात्पर्य है, मैं कहूँगा कि "विधि" बस पसंद किया जाता है कैप्सूलीकरण प्रदान करने के लिए और कार्यान्वयन को छिपाने के लिए।

आप count तत्वों या count को बनाए रखने के तरीके के बारे में आपको यह सोच सकते हैं। यदि यह एक संपत्ति है, तो आप अटक गए हैं - यदि यह किसी विधि के माध्यम से मूल्यांकन किया गया है, तो आप संग्रह के उपयोगकर्ताओं को प्रभावित किए बिना अंतर्निहित कार्यान्वयन को बदल सकते हैं।

+0

यदि आप संपत्ति के रूप में उजागर होते हैं तो आप "अटक गए" क्यों हैं? गुणों में अंतर्निहित कार्यान्वयन होता है जो इंटरफ़ेस को तोड़ने के बिना आसानी से बदल सकता है। असल में, अधिकांश भाषाएं गुणों को कार्यान्वित करती हैं क्योंकि कंपाइलर जेनरेट/सेट विधियों को वैसे भी उत्पन्न करता है ... आप उन्हें सीधे कॉल नहीं कर सकते हैं। –

+0

आप कौन सी "अधिकतर भाषाएं" का जिक्र कर रहे हैं? सी, सी ++, जावा (बस कुछ नाम देने के लिए) ऐसा मत करो। रुबी और ग्रोवी मुझे पता है। कृपया ध्यान दें कि मैंने जवाब कैसे शुरू किया: "अगर 'संपत्ति' का तात्पर्य है ..." क्यों अटक गया?यदि वर्ग में इंटरफ़ेस बदलता है, तो ग्राहकों को बदलना होगा (आमतौर पर बोलना) –

8

शर्तें कुछ हद तक एक दूसरे के रूप में हैं, हालांकि कुछ परिस्थितियों में मैं एक दूसरे से अधिक पसंद करूंगा। आमतौर पर यदि आप के बारे में सोचते हैं तो आप सबसे अच्छा उपयोग प्राप्त कर सकते हैं आप इस तत्व की लंबाई/आकार/गिनती का वर्णन किसी अन्य व्यक्ति को मौखिक रूप से कैसे करेंगे?

length() तात्पर्य तत्व लंबाई है। एक स्ट्रिंग की लंबाई है। आप कहते हैं "एक स्ट्रिंग 20 वर्ण लंबी है", है ना? तो इसकी लंबाई है।

size() तात्पर्य तत्व एक आकार है। जैसे एक फ़ाइल का आकार है। आप कहते हैं "इस फाइल का आकार 2 एमबी है", है ना? तो इसका आकार है।

उस ने कहा, एक स्ट्रिंग का आकार भी हो सकता है, लेकिन मुझे यहां कुछ और उम्मीद होगी। जैसे एक यूटीएफ -16 स्ट्रिंग में 100 वर्णों की लंबाई हो सकती है, लेकिन जैसा कि प्रत्येक चरित्र दो बाइट से बना है, मुझे उम्मीद है कि आकार 200 होना चाहिए।

count() बहुत असामान्य है। उद्देश्य-सी सरणी में तत्वों की संख्या के लिए गिनती का उपयोग करता है। कोई तर्क दे सकता है कि अगर किसी सरणी की लंबाई (जावा में) है, तो इसका आकार (जैसा कि अन्य भाषाओं में) है या इसकी गणना है। हालांकि, आकार फिर से बाइट में आकार हो सकता है (यदि सरणी आइटम 32 बिट int हैं, प्रत्येक आइटम 4 बाइट है) और लंबाई ... मैं नहीं कहूंगा "एक सरणी 20 तत्व लंबी है", जो कि अजीब लगता है मुझे। मैं कहूंगा "एक सरणी में 20 तत्व हैं"। मुझे यकीन है कि अगर गिनती कि व्यक्त करता है बहुत अच्छी तरह से नहीं कर रहा हूँ, लेकिन मुझे लगता है कि गिनती यहाँ है elementCount() के लिए एक संक्षिप्त रूप और कहा कि फिर से लंबाई की तुलना में एक सरणी के लिए और अधिक समझ में आता है() या आकार()।

आप एक प्रोग्रामिंग भाषा में खुद वस्तुओं/तत्वों बनाते हैं तो वह जो कुछ भी अन्य इसी तरह के तत्वों, का उपयोग के बाद से प्रोग्रामर वांछित संपत्ति है कि शब्द का प्रयोग तक पहुँचने के लिए उपयोग किया जाता है का उपयोग करने के लिए सबसे अच्छा है।

+0

अपनी स्ट्रिंग अनुरूपता के बाद फ़ाइल में 'लंबाई' होनी चाहिए, लेकिन अलग-अलग स्टोरेज अपने डेटा को स्टोर करने के लिए अलग-अलग 'आकार' का उपयोग कर सकते हैं। जावा भी _java.io.File # लंबाई() _ में ऐसा सोचता है, लेकिन ऐसा लगता है कि बाकी दुनिया असहमत है। –

+0

@IvanBalashov मैंने दैनिक बातचीत में "फ़ाइल की लंबाई" का कभी भी उपयोग नहीं किया, मेरे लिए फ़ाइल की लंबाई नहीं है लेकिन आकार भी है और यह भी मैंने अपने उत्तर में लिखा है। जब भी हम कच्चे बाइट्स की बात कर रहे हैं हम आकार आईएमएचओ की बात कर रहे हैं और एक फाइल जो करीब कोई विशिष्ट सामग्री नहीं है, केवल बाइट्स का एक गुच्छा है। आमतौर पर बाइट गिनती को व्यक्त करने के लिए लंबाई का उपयोग नहीं किया जाता है, लेकिन एक साथ स्ट्रिंग किए गए तत्वों का संचय व्यक्त करने के लिए (बाइट्स मेरे लिए तत्व नहीं होते हैं, बिल्डिंग ब्लॉक तत्वों को बनाने के लिए और वे "एक साथ स्ट्रिंग" भी नहीं होते हैं)। – Mecki

26

एफडब्ल्यूआईडब्ल्यू (और यह गायब होने के करीब कुछ भी नहीं है), मैं 'गिनती' पसंद करता हूं क्योंकि ऐसा लगता है कि यह संग्रह में तत्वों/वस्तुओं की संख्या को काफी स्पष्ट रूप से वापस करने जा रहा है।

जब शर्तों 'लंबाई' या 'आकार' मैं अक्सर एक पल के लिए सोच रहा छोड़ दिया हूँ (या फिर से पढ़ें प्रलेखन के लिए मजबूर किया जा रहा है) लानत बात मुझे बताओ कि कितने तत्वों में हैं जा रहा है कि क्या के साथ सामना चयन या संग्रह कितने बाइट्स उपभोग कर रहा है। यह उन संग्रहों के लिए विशेष रूप से सच है जो इरादे या तारों की तरह आकस्मिक होने का इरादा रखते हैं।

लेकिन जावा, बीसीएल/नेट, या सी/सी ++ मानक ढांचे/पुस्तकालयों द्वारा उपयोग किए जाने वाले नामकरण सम्मेलनों के लिए जिम्मेदार कोई भी मुझसे पूछने के लिए परेशान नहीं था, इसलिए आप जो कुछ भी साथ आए थे, उसके साथ आप अटक गए हैं।

अगर केवल मैं बहुत होशियार से मैं कर रहा हूँ थे और Bjarne नामित किया गया था, आप सभी को दुख बख्शा जा सकता है ...

बेशक

, असली दुनिया में वापस, आप जो कुछ भी नामकरण के साथ छड़ी की कोशिश करनी चाहिए सम्मेलन का उपयोग कर रहे भाषा/मंच द्वारा प्रयोग किया जाता है (उदाहरण के लिए।, size() C++)। नहीं यह अपने Array.Length दुविधा के साथ मदद करने के लिए लगता है कि।

+14

जबकि लंबाई और आकार संज्ञाएं हैं, गणना भी एक क्रिया है, इस प्रकार इसे रनटाइम (ओ (एन)) पर गिनती के रूप में व्याख्या किया जा सकता है बनाम एक मान (ओ (1))। – mbx

+0

दरअसल, यह ठीक है कि इसका उपयोग LINQ में किया जाता है: [Enumerable.Count] (https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.count) –

0

मैं कहूंगा कि यह विशेष भाषा पर निर्भर करता है जिसका उपयोग आप कर रहे हैं और कक्षा। उदाहरण के लिए सी # में यदि आप ऐरे का उपयोग कर रहे हैं तो आपके पास संपत्ति लंबाई है, यदि आपके पास IENumerable से विरासत में कुछ ऐसा है जो आपके पास विधि गणना() है, लेकिन यह तेज़ नहीं है। और यदि आपको आईसीओलेक्शन से विरासत मिली है तो आपके पास संपत्ति गणना है।

0

एलिक्सीर में वास्तव में भाषा में प्रकारों से जुड़े एक स्पष्ट नामकरण योजना है।

जब "गणना" एक डेटा संरचना में तत्वों की संख्या, अमृत भी एक सरल नियम का पालन करता है: समारोह के नाम पर है size अगर आपरेशन लगातार समय में है (यानी मूल्य पूर्व गणना की है) या length यदि ऑपरेशन रैखिक है (यानी इनपुट बढ़ने के साथ लंबाई की गणना धीमी हो जाती है)।

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