কখন এনএসএররে এনএসএসেট ব্যবহার করা ভাল?


112

আমি আমার অ্যাপ্লিকেশনগুলিতে অনেকবার এনএসএসেট ব্যবহার করেছি, তবে আমি নিজেই কখনও একটি তৈরি করি নি।

কখন এর NSSetবিরোধিতা হিসাবে ব্যবহার করা ভাল NSArrayএবং কেন?

উত্তর:


173

যখন সংগ্রহে আইটেমগুলির ক্রমটি গুরুত্বপূর্ণ নয়, সেটগুলি সংগ্রহে আইটেমগুলি সন্ধানের জন্য আরও ভাল পারফরম্যান্স সরবরাহ করে।

কারণটি হ'ল একটি সেট আইটেমগুলি সন্ধান করতে হ্যাশ মানগুলি ব্যবহার করে (অভিধানের মতো) যখন একটি অ্যারে নির্দিষ্ট বস্তুর সন্ধানের জন্য তার সম্পূর্ণ সামগ্রীতে পুনরাবৃত্তি করতে হয়।


9
লগ (1) বনাম লগ (এন)
রোহন-প্যাটেল

25
@ রোহন-প্যাটেল সঠিক হ'ল ও (1) বনাম ও (এন)
মনসুরভ রুসলান

1
যদি অর্ডার করা হয়: ও (1) বনাম ও (লগন) যেহেতু বাইনারি অনুসন্ধান প্রযোজ্য। যদি
আনর্ডারড না হয়

180

অ্যাপলের ডকুমেন্টেশন থেকে প্রাপ্ত চিত্রটি এটি খুব ভালভাবে বর্ণনা করে:

উদ্দেশ্য-সি সংগ্রহ

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]

2
আপনার উদাহরণে, আপনি একটি অ্যারে এবং একটি সেটটিতে আদিমতা যুক্ত করছেন। উভয়ই সম্ভব নয় কারণ সেগুলিতে কেবলমাত্র বস্তু থাকতে পারে।
ফ্রিএএসইনবিয়ার

10
আপনার @ জহির সম্পাদনার জন্য ধন্যবাদ, তবে এটি আসলে অবৈধ ছিল। আমি আদিম যোগ করছিলাম না। আমি আক্ষরিক যুক্ত ছিল।
জেমস ওয়েবস্টার

দুর্দান্ত ব্যাখ্যা :) +1 :)
করুণ

1
আপনার ব্যাখ্যা ভালবাসা! এর জন্য +1
বিদ্রোহ

66

এর সর্বোত্তম উত্তর হ'ল অ্যাপলের নিজস্ব ডকুমেন্টেশন

এখানে চিত্র বর্ণনা লিখুন

মূল পার্থক্যটি হ'ল NSArrayএকটি অর্ডার করা সংগ্রহের NSSetজন্য এবং একটি আনর্ডারড সংগ্রহের জন্য।

সেখানে বিভিন্ন প্রবন্ধ দুই মধ্যে গতি পার্থক্য, মত সেই আলাপ হয় এই এক । যদি আপনি একটি আনর্ডারড সংগ্রহের মাধ্যমে পুনরাবৃত্তি করেন NSSetতবে দুর্দান্ত। যাইহোক, অনেক ক্ষেত্রে আপনার এমন কাজ করা দরকার যা কেবলমাত্র একজনই NSArrayকরতে পারে তাই আপনি সেই দক্ষতার জন্য গতি ত্যাগ করেন।

NSSet

  • তুলনা করে প্রাথমিকভাবে আইটেম অ্যাক্সেস করুন
  • ক্রমবিন্যাসহীন
  • সদৃশ অনুমতি দেয় না

NSArray

  • সূচী দ্বারা আইটেম অ্যাক্সেস করতে পারেন
  • অর্ডার দেওয়া
  • সদৃশদের অনুমতি দেয়

সত্যিই এটি আছে! যদি এটি সাহায্য করে তবে আমাকে জানান।


NSSetসূচির জন্য আপনাকে সর্বদা ত্যাগ করতে হবে না । একই ডেটার জন্য দুটি পৃথক ডেটা স্ট্রাকচার ব্যবহার করা সাধারণ। বা আপনি সেই অ্যারে তৈরি এবং সূচী করেছেন :) তবে তারপরে এটি এমন কোনও ডিবি ব্যবহার করা ভাল যা এটি এলরেডি প্রয়োগ করেছে।
সুলতান

"সেই অ্যারেতে একটি সূচক তৈরি করুন"। আপনি কোনও এনএসএসেটে সূচি তৈরি করতে পারবেন না। আপনি ব্যবহার করতে পারেন বিভিন্ন কৌশল আছে। এবং যদি আপনাকে দুটি স্মৃতি এবং প্রক্রিয়াকরণ ক্ষমতাতে ত্যাগ করতে হয় তবে আপনি এটি ভুল করছেন।
সুলতান

যেহেতু প্রশ্ন সম্পর্কে NSSetএবং NSArray, আমার উত্তর সঠিক এবং সম্পূর্ণ। হ্যাঁ, আপনি অন্যান্য ডেটা স্ট্রাকচার তৈরি করতে পারেন, তবে আমি কেবল এই দুটিটির সাথে তুলনা করছি।
ওয়াজ

আমি উত্সাহ দিয়েছিলাম কিন্তু যখন আপনি ত্যাগের বিষয়ে কথা বলেন তখন আপনার উত্তরটি ভুল। আপনার যদি কিছু কার্যকারিতা প্রয়োজন হয় NSArrayএবং কিছু ফান্টিওয়ানিয়ালিটির প্রয়োজন হয় NSSetতবে সঠিক উত্তরটি "ব্যবহার NSArrayএবং ত্যাগের পারফরম্যান্স" নয়। উত্তরটি উভয়কে একত্রিত করা বা একটি ভিন্ন ডেটা স্ট্রাকচার ব্যবহার করুন।
সুলতান

আমি বলতাম যে মূল পার্থক্যটি সেটটি অনন্য অবজেক্টের জন্য যেখানে অ্যারে হিসাবে নকল থাকতে পারে। ক্রমের দিকটি সেই সত্যের গৌণ।
ম্যালহাল

12

এনএসআরআরডসেট আইওএস 5+ এ উপলভ্য যাতে আপনি ডাটা স্ট্রাকচারে নকল বস্তুগুলি চান কিনা তা মূল পার্থক্য হয়ে যায়।


9

এনএসআরএ :

  1. আদেশে তথ্য সংগ্রহের
  2. সদৃশদের অনুমতি দেয়
  3. এটি সংগ্রহের ধরণের অবজেক্ট

এনএসএসেট :

  1. তথ্যের অর্ডারযুক্ত সংগ্রহ
  2. সদৃশ অনুমতি দেয় না
  3. এটি সংগ্রহের ধরণের অবজেক্ট

7

একটি অ্যারে তাদের সূচক দ্বারা আইটেম অ্যাক্সেস ব্যবহার করা হয়। যে কোনও আইটেম একাধিকবার অ্যারে .োকানো যেতে পারে। অ্যারে তাদের উপাদানগুলির ক্রমকে মন্টেন করে।

একটি সেট মূলত কেবল আইটেমটি সংগ্রহের মধ্যে রয়েছে কিনা তা পরীক্ষা করার জন্য ব্যবহৃত হয়। আইটেমগুলির অর্ডার বা সূচকের কোনও ধারণা নেই। আপনার কাছে একটি সেট দুটিবার সেট এ থাকতে পারে না।

যদি কোনও অ্যারে এটিতে কোনও উপাদান রয়েছে কিনা তা পরীক্ষা করতে চায় তবে তার সমস্ত আইটেম চেক করতে হবে। সেটগুলি দ্রুত অ্যালগোরিদম ব্যবহার করার জন্য ডিজাইন করা হয়েছে।

আপনি মান ব্যতীত অভিধানের মতো একটি সেট কল্পনা করতে পারেন।

নোট করুন যে অ্যারে এবং সেট কেবলমাত্র ডেটা স্ট্রাকচার নয়। অন্যান্য রয়েছে, যেমন ক্যু, স্ট্যাক, হিপ, ফিবোনাকির গাদা। আমি অ্যালগরিদম এবং ডেটা স্ট্রাকচার সম্পর্কে একটি বই পড়ার পরামর্শ দেব।

আরও তথ্যের জন্য উইকিপিডিয়া দেখুন ।


আসলে, একটি অ্যারের কেবলমাত্র আইটেমটি পাওয়া যায় সেই বিন্দুতে চেক করা দরকার। আইটেমটি অ্যারেতে থাকলে খুব কমই প্রতিটি আইটেম পরীক্ষা করা প্রয়োজন।
ফ্রিএএসআইনবিয়ার

হ্যাঁ, আপনি যেমনটি বলেছেন "যদি আইটেমটি অ্যারেতে থাকে"। আপনি যদি এটির প্রত্যাশা করেন তবে আপনাকে এটি কিনা আছে কিনা তা যাচাই করতে হবে না। containsঅপারেশন জটিলতা হয় O(n)। অ্যারেতে না থাকলে তুলনার সংখ্যা n। অ্যারেতে যখন বস্তুটি থাকে তখন তুলনার গড় সংখ্যা n/2। এমনকি যদি বস্তুটি পাওয়া যায়, তবে কর্মক্ষমতাটি ভয়াবহ।
সুলতান

পারফরম্যান্সটি কেবলমাত্র বড় অ্যারের সাথে ভয়ঙ্কর হবে। যদি আপনি জানতেন যে অ্যারেটি বেশ বড় হয়ে উঠতে পারে, তবে অ্যারের কার্যকারিতা উন্নত করতে পারে এমন উপায় রয়েছে যেমন অ্যারের অ্যারে ব্যবহার করে।
ফ্রিএএসআইনবিয়ার

যদি সমতা অপারেশন ব্যয়বহুল হয় তবে আপনি 3 টি আইটেম সহ অ্যারেতেও পার্থক্যটি দেখতে পাবেন। এবং বড় অ্যারে হিসাবে একই আচরণ ঘটতে পারে যখন আপনি প্রচুর পরিমাণ অপারেশনটি পুনরায় পুনঃস্থাপন করেন (যেমন '' চক্রের জন্য 'অপারেশনটি ব্যবহার করুন)। মোড়ক করা জটিলতার কথা শুনেছেন? জটিলতা এখনও লিনিয়ার এবং একটি সেট (সাধারণত ধ্রুবক জটিলতার সাথে) এর তুলনায় কর্মক্ষমতাটি ভয়াবহ।
সুলতান

স্পষ্টতই একটি পার্থক্য থাকবে, আমি কেবল উল্লেখ করছি যে বড় ও স্বরলিপিটি তাত্পর্যপূর্ণ; ছোট অ্যারে দিয়ে, পার্থক্যটি হ্রাস হবে। এছাড়াও,NSArray s এর ওপরে অন্যান্য গতির সুবিধা রয়েছে NSSet। সর্বদা হিসাবে, এটি একটি বাণিজ্য।
ফ্রিএএসআইনবিয়ার

5
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)}


4

অন্যান্য উত্তরে ইতিমধ্যে মূল পার্থক্য দেওয়া হয়েছে।

আমি কেবল এটি লক্ষ করতে চাই যে সেটগুলি এবং অভিধানগুলি কার্যকর করার কারণে (যেমন হ্যাশগুলি ব্যবহার করে), কীগুলির জন্য পরিবর্তনীয় জিনিসগুলি ব্যবহার না করার জন্য কাউকে সতর্ক হওয়া উচিত।

যদি কোনও কী রূপান্তরিত হয় তবে হ্যাশটি খুব সম্ভবত পরিবর্তিত হবে (হ্যাশ) খুব তাড়াতাড়ি হ্যাশ টেবিলের আলাদা সূচক / বালতিতে নির্দেশ করবে। আসল মানটি মুছে ফেলা হবে না এবং কাঠামোর আকার / গণনার জন্য গণনা করার সময় বা জিজ্ঞাসা করার সময় এটি আসলে বিবেচনায় নেওয়া হবে।

এর ফলে বাগগুলি সনাক্ত করা সত্যিই কিছু শক্ত হতে পারে।


3

এখানে আপনি NSArrayএবং এর একটি সুন্দর পুরো তুলনা খুঁজে পেতে পারেন comparisonNSSet datastructures।

সংক্ষিপ্ত সিদ্ধান্ত:

হ্যাঁ, সহজভাবে ধরে রাখা এবং পুনরাবৃত্তি করার জন্য এনএসআরএই এনএসসিটের চেয়ে দ্রুত। নির্মাণের জন্য 50% যত দ্রুত এবং পুনরাবৃত্তির জন্য 500% তত দ্রুত। পাঠ: আপনার যদি কেবল সামগ্রীতে পুনরাবৃত্তি করতে হয় তবে কোনও এনএসএসেট ব্যবহার করবেন না।

অবশ্যই, যদি আপনাকে অন্তর্ভুক্তির জন্য পরীক্ষা করতে হয় তবে এনএসআরিকে এড়াতে কঠোর পরিশ্রম করুন। এমনকি যদি আপনার পুনরাবৃত্তি এবং অন্তর্ভুক্তি উভয় পরীক্ষার প্রয়োজন হয় তবে আপনার সম্ভবত একটি এনএসএসেট চয়ন করা উচিত। আপনার যদি আপনার সংগ্রহটি অর্ডার করে রাখা এবং অন্তর্ভুক্তির জন্য পরীক্ষা করা প্রয়োজন, তবে আপনাকে দুটি সংগ্রহ (একটি এনএসআরাই এবং একটি এনএসএসেট) রাখা উচিত, প্রতিটিতে একই জিনিস রয়েছে।

এনএসডেটরিজটি এনএসএম্যাপটেবলের চেয়ে কম ধীরে ধীরে নির্মাণ করা - যেহেতু এটিতে মূল ডেটা অনুলিপি করা দরকার। এটি দেখার জন্য দ্রুত হয়ে এর জন্য এটি তৈরি করে। অবশ্যই, দুজনের আলাদা আলাদা ক্ষমতা রয়েছে তাই বেশিরভাগ সময় এই সংকল্পটি অন্য কারণগুলির উপর করা উচিত।


যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
টুনাকি

2

আপনি অ্যাক্সেস গতির মূল এবং অর্ডারের কোনও গুরুত্ব না রাখলে আপনি সাধারণত একটি সেট ব্যবহার করবেন বা অন্য উপায়ে নির্ধারিত হয় (কোনও প্রেডিকেট বা সাজানোর বর্ণনাকারীর মাধ্যমে)। উদাহরণস্বরূপ মূল ডেটা সেটগুলি ব্যবহার করে যখন পরিচালিত অবজেক্টগুলিকে একাধিক সম্পর্কের মাধ্যমে অ্যাক্সেস করা হয়


1

এর কিছুটা যোগ করতে আমি কখনও কখনও সেট ব্যবহার করি ঠিক যেমন অ্যারে থেকে সদৃশগুলি সরাতে:

NSMutableSet *set=[[NSMutableSet alloc]initWithArray:duplicateValueArray]; // will remove all the duplicate values
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.