जवाबों:
जब संग्रह में वस्तुओं का क्रम महत्वपूर्ण नहीं है, तो सेट संग्रह में आइटम खोजने के लिए बेहतर प्रदर्शन प्रदान करते हैं।
कारण यह है कि एक सेट वस्तुओं को खोजने के लिए हैश मूल्यों का उपयोग करता है (जैसे एक शब्दकोश) जबकि एक सरणी को किसी विशेष ऑब्जेक्ट को खोजने के लिए अपनी संपूर्ण सामग्री पर पुनरावृत्त करना पड़ता है।
Apple के डॉक्यूमेंटेशन से आई इमेज इसका बखूबी वर्णन करती है:
Array
एक आदेश है (जब आप जोड़ते हैं तो ऑर्डर बनाए रखा जाता है) तत्वों का क्रम
[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];
[1, 2, 3, 4, 6, 4, 1, 2]
Set
एक अलग (कोई डुप्लिकेट) नहीं है, तत्वों की अनियंत्रित सूची
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];
[1, 2, 6, 4, 3]
इसका सबसे अच्छा जवाब यह है कि यह एप्पल का अपना दस्तावेज है ।
मुख्य अंतर यह है कि NSArray
एक ऑर्डर किए गए संग्रह के लिए है और NSSet
एक अनियोजित संग्रह के लिए है।
वहाँ कई लेख हैं जो दोनों के बीच गति के अंतर के बारे में बात करते हैं, जैसे यह एक । यदि आप एक अनियंत्रित संग्रह के माध्यम से पुनरावृत्ति कर रहे हैं, तो NSSet
बहुत अच्छा है। हालांकि, कई मामलों में, आपको उन चीजों को करने की ज़रूरत है जो केवल कर NSArray
सकते हैं, इसलिए आप उन क्षमताओं के लिए गति का त्याग करते हैं।
NSSet
NSArray
यह सब वास्तव में वहाँ है! यदि इससे सहायता मिलती है तो मुझे बताएं।
NSSet
अनुक्रमण के लिए आपको हमेशा बलिदान नहीं करना पड़ता है । समान डेटा के लिए दो अलग-अलग डेटा संरचनाओं का उपयोग करना आम है। या आप उस एरे पर निर्माण और इंडेक्स करते हैं :) लेकिन फिर एक डीबी का उपयोग करना बेहतर होता है, जिस पर इसे लागू किया गया है।
NSSet
और NSArray
, मेरा उत्तर सटीक और पूर्ण है। हां, आप अन्य डेटा संरचनाओं का निर्माण कर सकते हैं, लेकिन मैं इन दोनों की तुलना कर रहा हूं।
NSArray
और से कुछ फंक्शनलियोएलिटी की आवश्यकता है NSSet
, तो सही उत्तर " NSArray
प्रदर्शन और बलिदान प्रदर्शन" नहीं है। उत्तर दोनों को मिलाते हैं या एक अलग डेटा संरचना का उपयोग करते हैं।
एक सरणी का उपयोग उनके सूचकांक द्वारा वस्तुओं तक पहुंचने के लिए किया जाता है। किसी भी वस्तु को कई बार सरणी में डाला जा सकता है। उनके तत्वों के क्रम को व्यवस्थित करता है।
एक सेट का उपयोग मूल रूप से केवल यह जांचने के लिए किया जाता है कि आइटम संग्रह में है या नहीं। आइटम में ऑर्डर या इंडेक्सिंग की कोई अवधारणा नहीं है। आपके पास एक सेट में दो बार एक आइटम नहीं हो सकता है।
यदि कोई सरणी जाँचना चाहता है कि उसमें कोई तत्व है या नहीं, तो उसे अपने सभी आइटमों की जाँच करनी होगी। सेट तेजी से एल्गोरिदम का उपयोग करने के लिए डिज़ाइन किए गए हैं।
आप मूल्यों के बिना एक शब्दकोश की तरह एक सेट की कल्पना कर सकते हैं।
ध्यान दें कि सरणी और सेट केवल डेटा संरचना नहीं हैं। अन्य हैं, जैसे कतार, ढेर, ढेर, फाइबोनैचि का ढेर। मैं एल्गोरिदम और डेटा संरचनाओं के बारे में एक पुस्तक पढ़ने की सलाह दूंगा।
अधिक जानकारी के लिए विकिपीडिया देखें ।
contains
ऑपरेशन की जटिलता है O(n)
। सरणी में नहीं होने पर तुलना की संख्या n
। सरणी में ऑब्जेक्ट होने पर तुलना की औसत संख्या n/2
। भले ही ऑब्जेक्ट मिल जाए, लेकिन प्रदर्शन भयानक है।
NSArray
s की गति पर अन्य लाभ हैं NSSet
। हमेशा की तरह, यह एक व्यापार है।
NSArray *Arr;
NSSet *Nset;
Arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2",@"1", nil];
Nset=[NSSet setWithObjects:@"1",@"2",@"3",@"3",@"5",@"5", nil];
NSLog(@"%@",Arr);
NSLog(@"%@",Nset);
सरणी
2015-12-04 11: 05: 40.935 [598: 15730] (1, 2, 3, 4, 2, 1)
सेट
2015-12-04 11: 05: 43.362 [598: 15730] {(3, 1, 2, 5)}
अन्य उत्तरों में मुख्य अंतर पहले ही दिए जा चुके हैं।
मैं बस यह ध्यान देना चाहूंगा कि जिस तरह से सेट और डिक्शनरी लागू की जाती है (यानी हैश का उपयोग करके), किसी को चाबियों के लिए परस्पर वस्तुओं का उपयोग न करने के लिए सावधान रहना चाहिए।
यदि एक कुंजी को उत्परिवर्तित किया जाता है, तो हैश तालिका में एक अलग सूचकांक / बाल्टी की ओर इशारा करते हुए हैश (शायद) भी बदल जाएगा। मूल मान हटाया नहीं जाएगा और वास्तव में गणना करते समय या उसके आकार / गिनती के लिए संरचना पूछते समय ध्यान में रखा जाएगा।
इससे कीड़े का पता लगाने में कुछ मुश्किल हो सकती है।
यहाँ आप NSArray
और NSSet
डेटास्ट्रक्चर की पूरी तरह से तुलना कर सकते हैं ।
संक्षिप्त निष्कर्ष:
हां, NSArray NSSet से अधिक सरलता से धारण करने और पुनरावृत्ति करने के लिए तेज़ है। निर्माण के लिए कम से कम 50% तेज और पुनरावृति के लिए 500% से अधिक तेजी से। पाठ: यदि आपको केवल सामग्री पुनरावृति करने की आवश्यकता है, तो NSSet का उपयोग न करें।
बेशक, यदि आपको समावेशन के लिए परीक्षण करने की आवश्यकता है, तो NSArray से बचने के लिए कड़ी मेहनत करें। यहां तक कि अगर आपको पुनरावृत्ति और समावेशन परीक्षण दोनों की आवश्यकता है, तो भी आपको शायद एक एनएसएसईटी चुनना चाहिए। यदि आपको अपने संग्रह को व्यवस्थित रखने और शामिल करने के लिए परीक्षण करने की आवश्यकता है, तो आपको दो संग्रह (एक NSArray और एक NSSet) रखने पर विचार करना चाहिए, जिनमें से प्रत्येक में समान वस्तुएं हों।
एनएसडबल NSMapTable की तुलना में निर्माण के लिए धीमा है - क्योंकि इसे प्रमुख डेटा की प्रतिलिपि बनाने की आवश्यकता है। यह लुकअप के लिए तेज़ होने से इसके लिए बनाता है। बेशक, दोनों के पास अलग-अलग क्षमताएं हैं इसलिए अधिकांश समय, यह निर्धारण अन्य कारकों पर किया जाना चाहिए।
आप आमतौर पर एक सेट का उपयोग करते हैं जब एक्सेस गति सार की होती है और ऑर्डर कोई फर्क नहीं पड़ता , या अन्य माध्यमों (एक विधेय या सॉर्ट डिस्क्रिप्टर के माध्यम से) द्वारा निर्धारित किया जाता है। उदाहरण के लिए कोर डेटा सेट का उपयोग करता है जब प्रबंधित वस्तुओं को कई-कई संबंधों के माध्यम से एक्सेस किया जाता है
बस इसे जोड़ने के लिए मैं कभी-कभी सेट का उपयोग करता हूं जैसे कि डुप्लिकेट को सरणी से हटाने के लिए: -
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values