আমি আমার অ্যাপ্লিকেশনগুলিতে অনেকবার এনএসএসেট ব্যবহার করেছি, তবে আমি নিজেই কখনও একটি তৈরি করি নি।
আমি আমার অ্যাপ্লিকেশনগুলিতে অনেকবার এনএসএসেট ব্যবহার করেছি, তবে আমি নিজেই কখনও একটি তৈরি করি নি।
উত্তর:
যখন সংগ্রহে আইটেমগুলির ক্রমটি গুরুত্বপূর্ণ নয়, সেটগুলি সংগ্রহে আইটেমগুলি সন্ধানের জন্য আরও ভাল পারফরম্যান্স সরবরাহ করে।
কারণটি হ'ল একটি সেট আইটেমগুলি সন্ধান করতে হ্যাশ মানগুলি ব্যবহার করে (অভিধানের মতো) যখন একটি অ্যারে নির্দিষ্ট বস্তুর সন্ধানের জন্য তার সম্পূর্ণ সামগ্রীতে পুনরাবৃত্তি করতে হয়।
অ্যাপলের ডকুমেন্টেশন থেকে প্রাপ্ত চিত্রটি এটি খুব ভালভাবে বর্ণনা করে:
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
এবং এর একটি সুন্দর পুরো তুলনা খুঁজে পেতে পারেন comparisonNSSet
datastructures।
সংক্ষিপ্ত সিদ্ধান্ত:
হ্যাঁ, সহজভাবে ধরে রাখা এবং পুনরাবৃত্তি করার জন্য এনএসআরএই এনএসসিটের চেয়ে দ্রুত। নির্মাণের জন্য 50% যত দ্রুত এবং পুনরাবৃত্তির জন্য 500% তত দ্রুত। পাঠ: আপনার যদি কেবল সামগ্রীতে পুনরাবৃত্তি করতে হয় তবে কোনও এনএসএসেট ব্যবহার করবেন না।
অবশ্যই, যদি আপনাকে অন্তর্ভুক্তির জন্য পরীক্ষা করতে হয় তবে এনএসআরিকে এড়াতে কঠোর পরিশ্রম করুন। এমনকি যদি আপনার পুনরাবৃত্তি এবং অন্তর্ভুক্তি উভয় পরীক্ষার প্রয়োজন হয় তবে আপনার সম্ভবত একটি এনএসএসেট চয়ন করা উচিত। আপনার যদি আপনার সংগ্রহটি অর্ডার করে রাখা এবং অন্তর্ভুক্তির জন্য পরীক্ষা করা প্রয়োজন, তবে আপনাকে দুটি সংগ্রহ (একটি এনএসআরাই এবং একটি এনএসএসেট) রাখা উচিত, প্রতিটিতে একই জিনিস রয়েছে।
এনএসডেটরিজটি এনএসএম্যাপটেবলের চেয়ে কম ধীরে ধীরে নির্মাণ করা - যেহেতু এটিতে মূল ডেটা অনুলিপি করা দরকার। এটি দেখার জন্য দ্রুত হয়ে এর জন্য এটি তৈরি করে। অবশ্যই, দুজনের আলাদা আলাদা ক্ষমতা রয়েছে তাই বেশিরভাগ সময় এই সংকল্পটি অন্য কারণগুলির উপর করা উচিত।
আপনি অ্যাক্সেস গতির মূল এবং অর্ডারের কোনও গুরুত্ব না রাখলে আপনি সাধারণত একটি সেট ব্যবহার করবেন বা অন্য উপায়ে নির্ধারিত হয় (কোনও প্রেডিকেট বা সাজানোর বর্ণনাকারীর মাধ্যমে)। উদাহরণস্বরূপ মূল ডেটা সেটগুলি ব্যবহার করে যখন পরিচালিত অবজেক্টগুলিকে একাধিক সম্পর্কের মাধ্যমে অ্যাক্সেস করা হয়
এর কিছুটা যোগ করতে আমি কখনও কখনও সেট ব্যবহার করি ঠিক যেমন অ্যারে থেকে সদৃশগুলি সরাতে:
NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values