.NET ডেটা স্ট্রাকচার: অ্যারেলিস্ট, তালিকা, হ্যাশ টেবিল, ডিকশনারি, সোর্টডলিস্ট, সোর্টার্ড ডিকশনারি - গতি, মেমরি এবং কখন ব্যবহার করতে হবে?


213

.NET এর অনেকগুলি জটিল ডেটা স্ট্রাকচার রয়েছে। দুর্ভাগ্যক্রমে, তাদের মধ্যে বেশ কিছু একইরকম এবং কখন যে কখন ব্যবহার করব এবং কখন অন্যটি ব্যবহার করব তা আমি নিশ্চিত নই। আমার বেশিরভাগ সি # এবং ভিজ্যুয়াল বেসিক বইগুলি তাদের সম্পর্কে একটি নির্দিষ্ট পরিমাণে কথা বলে, তবে সেগুলি সত্যই কোনও বাস্তব বিশদে যায় না।

অ্যারে, অ্যারেলিস্ট, তালিকা, হ্যাশটেবল, অভিধান, সোর্টলিস্ট এবং সোর্টড ডিকোরিয়ানের মধ্যে পার্থক্য কী?

কোনটি গণনামূলক (আইলিস্ট - 'ফোরচ' লুপগুলি করতে পারে)? কোনগুলি কী / মান জোড়া ব্যবহার করে (আইডিক্ট)?

মেমরির পদচিহ্ন সম্পর্কে কী? প্রবেশের গতি? পুনরুদ্ধারের গতি?

উল্লেখযোগ্য কোন অন্য ডেটা স্ট্রাকচার কি আছে?

আমি এখনও মেমরির ব্যবহার এবং গতি (বিগ-ও স্বরলিপি) সম্পর্কে আরও বিশদ অনুসন্ধান করছি।


12
আপনার এই প্রশ্নটি আলাদা করা উচিত। আপনি বিশটি ভিন্ন বিষয় জিজ্ঞাসা করছেন, যার অর্ধেক কোনও সাধারণ গুগল অনুসন্ধান উত্তর দিতে পারে। দয়া করে আরও নির্দিষ্ট করুন; যখন আপনার প্রশ্নটি এতটাই ছড়িয়ে ছিটিয়ে থাকে তখন সাহায্য করা শক্ত।

33
আমি এটি ভেঙে ফেলার বিষয়ে ভেবেছিলাম, তবে বুঝতে পেরেছিলাম যে কেউ সম্ভবত এই সমস্ত উত্তর এক জায়গায় একীভূত করতে সক্ষম হবেন। প্রকৃতপক্ষে, যদি কেউ সমস্ত কিছু প্রোফাইলের জন্য কোনও টেবিল নিয়ে আসতে পারে তবে এটি এই সাইটের জন্য একটি দুর্দান্ত উত্স হয়ে উঠতে পারে।
প্রিটজেল

9
এই প্রশ্নটি কি উইকে পরিণত হতে পারে?
BozoJoe

1
এই এমএসডিএন নিবন্ধটিতে গাছ, গ্রাফ এবং সেটগুলি সহ ডেটা স্ট্রাকচারের একটি বিস্তৃত পরীক্ষা
রায়ান ফিশার

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

উত্তর:


156

আমার মাথার উপরে:

  • Array* - একটি পুরানো স্কুল মেমরি অ্যারে প্রতিনিধিত্ব করে - একটি সাধারণ type[]অ্যারের জন্য একটি উপন্যাসের মতো ধরণের । গণনা করতে পারে। স্বয়ংক্রিয়ভাবে বড় হতে পারে না। আমি খুব দ্রুত inোকানো এবং পুনরুদ্ধারের গতি অনুমান করব।

  • ArrayList- স্বয়ংক্রিয়ভাবে অ্যারে বৃদ্ধি। আরও ওভারহেড যুক্ত করে। এনাম। পারেন, সম্ভবত একটি সাধারণ অ্যারের চেয়ে ধীর কিন্তু তবুও বেশ দ্রুত। নেট। নেট এ এগুলি প্রচুর ব্যবহৃত হয়

  • List- আমার ফেভগুলির মধ্যে একটি - জেনেরিকের সাথে ব্যবহার করা যেতে পারে, যাতে আপনার কাছে দৃ strongly়ভাবে টাইপ করা অ্যারে থাকতে পারে List<string>। এটি বাদেও অনেক ভালো লেগেছেArrayList

  • Hashtable- সাধারণ পুরাতন হ্যাশটেবল ও (1) থেকে ও (এন) সবচেয়ে খারাপ পরিস্থিতি। মান এবং কী বৈশিষ্ট্যগুলি গণনা করতে পারে এবং কী / ভ্যাল জোড়াগুলি করতে পারে

  • Dictionary - উপরের মতো কেবল জেনেরিকের মাধ্যমে কেবল দৃ strongly়ভাবে টাইপ করা Dictionary<string, string>

  • SortedList- একটি বাছাই করা জেনেরিক তালিকা। সন্নিবেশটি ধীরে ধীরে ধীরে ধীরে এটিকে জিনিসগুলি কোথায় রাখা উচিত তা নির্ধারণ করতে হবে। এনাম করতে পারেন ret

আমি ব্যবহার করি Listএবং Dictionaryসর্বদা - একবার আপনি জেনেরিকের সাথে দৃ strongly়ভাবে টাইপ করে এগুলি ব্যবহার শুরু করার পরে স্ট্যান্ডার্ড নন-জেনেরিকগুলিতে ফিরে যাওয়া সত্যিই শক্ত।

এখানে প্রচুর অন্যান্য ডেটা স্ট্রাকচার রয়েছে - এটি রয়েছে KeyValuePairযা আপনি কিছু আকর্ষণীয় কাজ করতে ব্যবহার করতে পারেন, এমন একটি রয়েছে SortedDictionaryযা কার্যকরও হতে পারে।


3
হ্যাশ টেবিলটি ও (1), সবচেয়ে খারাপ ক্ষেত্রে (সংঘর্ষের সাথে) ও (এন) হতে পারে
জাস্টিন বোজনিয়ায়ার

7
এখানে আরও অনেকগুলি ডেটা স্ট্রাকচার যুক্ত করতে হবে। লিঙ্কডলিস্ট, স্কিপ তালিকা, স্ট্যাক, সারি, গাদা, গাছ, গ্রাফের মতো। এগুলি পাশাপাশি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার।
দার্থভেদার

2
সমসাময়িক অভিধান অভিধানে যোগ করা। নেট 4.0 থ্রেড সুরক্ষা সহ একটি জেনেরিক অভিধান সরবরাহ করে
হরিিন্দাকা

2
এছাড়াও ব্লকিংকলেকশন <টি> সুরক্ষা প্রযোজক / গ্রাহক বাস্তবায়নের জন্য একটি থ্রেড সরবরাহ করে
হরিিন্দাকা

7
ArrayListভার্চুয়াল পদ্ধতি ব্যবহার করে, কিন্তু List<T>হয় না। মানক সংগ্রহের জন্য এবং কাস্টম সংগ্রহের জন্য বেস ক্লাস হিসাবে ArrayListমূলত প্রতিস্থাপন করা হয়েছে । মূলত দ্বারা প্রতিস্থাপিত হয়েছে । আমি এড়ানো এবং নতুন কোডের জন্য সুপারিশ করব । List<T>Collection<T>HashtableDictionary<TKey, TValue>ArrayListHashtable
স্যাম হারওয়েল

29

যদি সম্ভব হয় তবে জেনেরিক ব্যবহার করুন। এটা অন্তর্ভুক্ত:

  • অ্যারেলিস্টের পরিবর্তে তালিকাবদ্ধ করুন
  • হ্যাশ টেবিলের পরিবর্তে অভিধান

24

প্রথমে .NET- এ সমস্ত সংগ্রহ IEnumerable প্রয়োগ করে।

দ্বিতীয়ত, প্রচুর সংকলনগুলি নকল হয় কারণ ফ্রেমওয়ার্কের 2.0 সংস্করণে জেনেরিকগুলি যুক্ত করা হয়েছিল।

সুতরাং, যদিও জেনেরিক সংগ্রহগুলি সম্ভবত বেশিরভাগ অংশে বৈশিষ্ট্যগুলি যুক্ত করে:

  • তালিকাটি অ্যারেলিস্টের জেনেরিক বাস্তবায়ন।
  • অভিধান হ্যাশটেবলের জেনেরিক বাস্তবায়ন

অ্যারেগুলি একটি স্থির আকারের সংগ্রহ যা আপনি প্রদত্ত সূচকে সঞ্চিত মান পরিবর্তন করতে পারেন।

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

সুতরাং, আইডিয়ের অভিধান বাস্তবায়নগুলি (যারা কীভ্যালিউপাইয়ারগুলিকে সমর্থন করে) তারা হ'ল: হ্যাশটেবল * অভিধান * সোর্টার্ডলিস্ট * সাজানো অভিধান

.NET 3.5 এ যুক্ত করা হয়েছিল এমন আরও একটি সংগ্রহ হ্যাশসেট। এটি একটি সংগ্রহ যা সেট অপারেশনগুলিকে সমর্থন করে।

এছাড়াও, লিঙ্কডলিস্ট একটি মানযুক্ত লিঙ্কযুক্ত-তালিকা বাস্তবায়ন (দ্রুত পুনরুদ্ধারের জন্য তালিকাটি একটি অ্যারে-তালিকা)।


20

আপনার জন্য কয়েকটি সাধারণ টিপস এখানে রইল:

  • আপনি foreachপ্রয়োগ করতে পারেন এমন ধরণের ক্ষেত্রে ব্যবহার করতে পারেন IEnumerableIListমূলত একটি হয় IEnumberableসঙ্গে Countএবং Itemবৈশিষ্ট্যাবলী (একটি শূন্য ভিত্তিক সূচক ব্যবহার করে এই আইটেমগুলির অ্যাক্সেস করছেন)। IDictionaryঅন্যদিকে আপনি যে কোনও হ্যাশযোগ্য সূচক দ্বারা আইটেমগুলি অ্যাক্সেস করতে পারবেন means

  • Array, ArrayListএবং Listসমস্ত বাস্তবায়ন IListDictionary, SortedDictionaryএবং Hashtableবাস্তবায়ন IDictionary

  • আপনি যদি .NET 2.0 বা ততোধিক ব্যবহার করে থাকেন তবে প্রস্তাবিত ধরণের জেনেরিক অংশগুলি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।

  • এই ধরণের বিভিন্ন ক্রিয়াকলাপের সময় এবং স্থান জটিলতার জন্য আপনার তাদের ডকুমেন্টেশনের পরামর্শ নেওয়া উচিত।

  • .NET ডেটা স্ট্রাকচারগুলি System.Collectionsনামস্থানে রয়েছে। পাওয়ারকল্যাশনের মতো টাইপ লাইব্রেরি রয়েছে যা অতিরিক্ত ডেটা স্ট্রাকচার অফার করে।

  • ডেটা স্ট্রাকচারের পুঙ্খানুপুঙ্খ ধারণা পেতে, সিএলআরএসের মতো সংস্থানসমূহের পরামর্শ নিন ।


1
এমএসডিএন থেকে মনে হচ্ছে, সাজানো তালিকার বাস্তবায়ন আইডিকেশনারি - আইলিস্ট নয়
হাইম বেনদনান

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

9

.NET ডেটা স্ট্রাকচার:

অ্যারেলিস্ট এবং তালিকাগুলি আসলে আলাদা কেন সে সম্পর্কে কথোপকথনের আরও

অ্যারেগুলির

যেমন একজন ব্যবহারকারী বলেছেন, অ্যারেগুলি হ'ল "পুরাতন স্কুল" সংগ্রহ (হ্যাঁ, অ্যারে অংশ না হলেও একটি সংগ্রহ হিসাবে বিবেচিত হয় System.Collections)। তবে, অন্যান্য সংগ্রহগুলির তুলনায় অ্যারে সম্পর্কে "পুরাতন স্কুল" কী, যেমন আপনি আপনার শিরোনামে তালিকাভুক্ত করেছেন (এখানে, অ্যারেলিস্ট এবং তালিকার তালিকা (টি))? অ্যারে দেখে বেসিকগুলি দিয়ে শুরু করা যাক।

শুরু করার জন্য, মাইক্রোসফ্ট .NET এ অ্যারেগুলি হ'ল , "এমন একটি প্রক্রিয়া যা আপনাকে বেশ কয়েকটি [যৌক্তিকভাবে সম্পর্কিত] আইটেমগুলিকে একক সংগ্রহ হিসাবে বিবেচনা করতে দেয়," (লিঙ্কিত নিবন্ধটি দেখুন)) ওটার মানে কি? অ্যারে পৃথক সদস্যদের (উপাদানগুলি) ক্রমানুসারে সংরক্ষণ করে, একের পর এক স্মৃতিতে একটি সূচনা ঠিকানা দিয়ে। অ্যারে ব্যবহার করে, আমরা সহজেই সেই ঠিকানায় শুরু করে ক্রমানুসারে সঞ্চিত উপাদানগুলি অ্যাক্সেস করতে পারি।

এর বাইরে এবং 101 টি সাধারণ ধারণার প্রোগ্রামিংয়ের বিপরীতে অ্যারেগুলি সত্যিই বেশ জটিল হতে পারে:

অ্যারেগুলি একক মাত্রা, বহুমাত্রিক বা জ্যাডেড হতে পারে (জেগড অ্যারেগুলি পড়ার পক্ষে মূল্যবান)। অ্যারেগুলি নিজেরাই গতিশীল নয়: একবার শুরু হয়ে গেলে এন আকারের একটি অ্যারে এন সংখ্যা সংখ্যক ধারণ করতে পর্যাপ্ত স্থান সংরক্ষণ করে। অ্যারের উপাদানগুলির সংখ্যা বাড়তে বা সঙ্কুচিত করতে পারে না। Dim _array As Int32() = New Int32(100)অ্যারেতে 100 ইন্ট 32 প্রিমিটিভ টাইপ অবজেক্টস থাকতে মেমরি ব্লকে পর্যাপ্ত স্থান সংরক্ষণ করে (এই ক্ষেত্রে, অ্যারে 0s ধারণ করে আরম্ভ করা হয়)। এই ব্লকের ঠিকানা ফিরে এসেছে _array

নিবন্ধ অনুসারে, কমন ল্যাঙ্গুয়েজ স্পেসিফিকেশন (সিএলএস) এর জন্য সমস্ত অ্যারে শূন্য-ভিত্তিক হওয়া দরকার। .NET এ অ্যারেগুলি শূন্য-ভিত্তিক অ্যারে সমর্থন করে; তবে, এটি কম সাধারণ। শূন্য-ভিত্তিক অ্যারেগুলির "কমন-নেস" এর ফলস্বরূপ, মাইক্রোসফ্ট তাদের কার্যকারিতাটি অনুকূল করে তুলতে অনেক সময় ব্যয় করেছে ; অতএব, একক মাত্রা, শূন্য-ভিত্তিক (এসজেড) অ্যারেগুলি "বিশেষ" - এবং সত্যিকার অর্থে একটি অ্যারের সর্বোত্তম বাস্তবায়ন (বহুমাত্রিক ইত্যাদির বিপরীতে) - কারণ এসজেডগুলিতে হেরফেরের জন্য নির্দিষ্ট মধ্যস্থতাকারী ভাষা নির্দেশ রয়েছে।

অ্যারে সর্বদা রেফারেন্স দ্বারা পাস করা হয় (একটি মেমরি ঠিকানা হিসাবে) - অ্যারে ধাঁধার একটি গুরুত্বপূর্ণ টুকরা জানতে। যখন তারা সীমানা যাচাই করে (ত্রুটি ছুঁড়ে দেবে), সীমা পরীক্ষা করা অ্যারেতেও অক্ষম করা যায়।

আবার অ্যারেগুলিতে সবচেয়ে বড় বাধা হ'ল তারা পুনরায় আকার ধারণ করতে পারে না। তাদের একটি "স্থির" ক্ষমতা রয়েছে। আমাদের ইতিহাসে অ্যারেলিস্ট এবং তালিকা (টি অফ) উপস্থাপন করা হচ্ছে:

অ্যারেলিস্ট - নন-জেনেরিক তালিকা

ArrayList (বরাবর সঙ্গে List(Of T)- যদিও কিছু সমালোচনামূলক পার্থক্য আছে, এখানে, পরে ব্যাখ্যা) - সম্ভবত সংগ্রহের পাশে উপরন্তু (বিস্তৃত অর্থে) হিসেবে শ্রেষ্ঠ চিন্তা। ArrayList থেকে উত্তরাধিকারী IList ইন্টারফেস ( 'ICollection' বংশধর)। অ্যারেলিস্টগুলি নিজেরাই বাল্কিয়ার - তালিকার চেয়ে ওভারহেডের বেশি প্রয়োজন ।

IListঅ্যারেলিস্টগুলি স্থির আকারের তালিকা হিসাবে বিবেচনা করতে সক্ষম করে (অ্যারেগুলির মতো); তবে অ্যারেলিস্টগুলির দ্বারা যুক্ত অতিরিক্ত কার্যকারিতা অতিক্রম করে এই ক্ষেত্রে অ্যারেলিস্ট (অ্যারেগুলির ওপরে) হিসাবে স্থির আকারের অ্যারেলিস্টগুলি ব্যবহার করার কোনও আসল সুবিধা নেই যা খুব ধীরে ধীরে ধীর।

আমার পড়া থেকে, অ্যারেলিস্টগুলি ঝাঁকুনি দেওয়া যায় না: "উপাদান হিসাবে বহুমাত্রিক অ্যারে ব্যবহার করা ... সমর্থিত নয়"। আবার অ্যারেলিস্টের কফিনে আর একটি পেরেক। ArrayLists এছাড়াও নয় "টাইপ" হয় - যার অর্থ, নীচে সবকিছু, একটি ArrayList কেবল বস্তুর একটি গতিশীল এরে হল: Object[]। এটির অ্যারেলিস্টগুলি প্রয়োগ করার সময় আবার প্রচুর বক্সিং (অন্তর্নিহিত) এবং আনবক্সিং (স্পষ্ট) প্রয়োজন এবং তাদের ওভারহেড যুক্ত করুন।

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

তালিকা (টি এর): অ্যারেলিস্ট কী হয়ে গেছে (এবং আশা করা যায়)

মেমরির ব্যবহারের পার্থক্যটি যথেষ্ট তাৎপর্যপূর্ণ যেখানে একটি তালিকা (অফ32 এর) একই আদিম ধরণের অ্যারেলিস্টের তুলনায় 56% কম মেমরি গ্রাস করেছে (উপরের ভদ্রলোকের সংযুক্ত প্রদর্শনে 8 এমবি বনাম 19 এমবি: আবার, এখানে লিঙ্কযুক্ত ) - যদিও এটি 64-বিট মেশিন দ্বারা মিশ্রিত ফলাফল। এই পার্থক্যটি সত্যই দুটি জিনিস প্রদর্শন করে: প্রথম (1), একটি বক্সযুক্ত ইন্টার 32-প্রকারের "অবজেক্ট" (অ্যারেলিস্ট) খাঁটি ইন্টার 32 প্রিমিটিভ টাইপের (তালিকা) এর চেয়ে অনেক বড়; দ্বিতীয় (২), একটি 64৪-বিট মেশিনের অভ্যন্তরীণ কাজের ফলে পার্থক্যটি প্রকাশযোগ্য।

সুতরাং, পার্থক্য কী এবং একটি তালিকা (টি) কী? এমএসডিএন একটি List(Of T)হিসাবে সংজ্ঞা দেয় , "... সূচক দ্বারা অ্যাক্সেস করা যায় এমন বস্তুর একটি দৃ objects়ভাবে টাইপ করা তালিকা" " এখানে গুরুত্বটি হ'ল "দৃ strongly়ভাবে টাইপ করা" বিট: একটি তালিকা (অফ টি) 'ধরণের স্বীকৃতি দেয়' এবং বস্তুগুলিকে তাদের ধরণের হিসাবে সংরক্ষণ করে। সুতরাং, একটি একটি Int32হিসাবে সংরক্ষণ করা হয় Int32এবং একটি Objectটাইপ নয়। এটি বক্সিং এবং আনবক্সিংয়ের কারণে সৃষ্ট সমস্যাগুলি সরিয়ে দেয়।

এমএসডিএন উল্লেখ করে যে এই পার্থক্যটি কেবলমাত্র প্রারম্ভিক প্রকারগুলি সংরক্ষণ করে যখন রেফারেন্সের ধরণগুলি সংরক্ষণ করে না play এছাড়াও, পার্থক্যটি সত্যই বড় আকারে ঘটে: 500 টিরও বেশি উপাদান। আরও মজার বিষয় হ'ল এমএসডিএন ডকুমেন্টেশনটি পড়েছে, "অ্যারেলিস্ট ক্লাসটি ব্যবহার না করে তালিকার (টি) শ্রেণির প্রকার-নির্দিষ্ট প্রয়োগ প্রয়োগ করা আপনার সুবিধার জন্য ...."

মূলত, তালিকা (অফ টি) অ্যারেলিস্ট, তবে আরও ভাল। এটি অ্যারেলিস্টের "জেনেরিক সমতুল্য"। অ্যারেলিস্টের মতো, এটি বাছাই করা গ্যারান্টিযুক্ত হয় না বাছাই করা পর্যন্ত (চিত্র দেখুন) তালিকার (টি অফ) টিতে কিছু যুক্ত কার্যকারিতা রয়েছে।


5

আমি প্রশ্নের সাথে সহানুভূতি জানালাম - আমিও পছন্দটি খুঁজে পেয়েছি (খুঁজে পেয়েছেন) বিভিল্ডারিং, তাই কোন ডাটা স্ট্রাকচারটি সবচেয়ে দ্রুত (তা আমি ভিসি ব্যবহার করে পরীক্ষা দিয়েছিলাম, তবে আমি ভেবেছিলাম যে সি # হবে একই রকম, যেহেতু উভয় ভাষা থেকেই সিএলআর পর্যায়ে একই জিনিস করুন)। আপনি আমার দ্বারা পরিচালিত কিছু বেঞ্চমার্কিং ফলাফল দেখতে পারেন (কোন পরিস্থিতিতে কোন ডেটা টাইপ ব্যবহার করা সবচেয়ে ভাল তা নিয়েও কিছু আলোচনা রয়েছে)।


3

তারা ইন্টেলিজেন্সে বেশ ভাল বানান করেছে। শুধু টাইপ করুন System. সংগ্রহ। অথবা সিস্টেম.কলেশনস.জেনারিক্স (পছন্দসই) এবং আপনি কী উপলব্ধ তা একটি তালিকা এবং সংক্ষিপ্ত বিবরণ পাবেন।


3

হ্যাশটবেল / ডিকোরিয়ান্স হ'ল ও (1) পারফরম্যান্স, যার অর্থ পারফরম্যান্স কোনও আকারের ফাংশন নয়। এটা জানা গুরুত্বপূর্ণ।

সম্পাদনা: অনুশীলনে, হ্যাশটেবল / ডিকশনারি <> দেখার জন্য গড় সময় জটিলতা হ'ল ও (1)।


5
"পারফরম্যান্স" বলে কিছু নেই। জটিলতা অপারেশন উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি অভিধান <> তে এন উপাদানগুলি সন্নিবেশ করালে পুনরায় ভাগ করার কারণে এটি ও (1) হবে না be
ইলিয়া রাইঝেনকভ

2
এফওয়াইআই, এমনকি রিহ্যাশ করেও অভিধান এখনও ও (1) is অভিধানটি প্রসারিত হওয়ার ঠিক আগে পরিস্থিতিটি বিবেচনা করুন। শেষ সম্প্রসারণের পরে যুক্ত হওয়া - অর্ধেক উপাদানগুলি একবার হ্যাশ করা হবে। বাকি অংশগুলির অর্ধেকটি দুইবার ধোয়া হবে। তার থেকে বাকি অর্ধেক, তিনগুণ ইত্যাদি each প্রসারণের পরপরই পরিস্থিতি মূলত একইরকম, তবে প্রতিটি উপাদানগুলির সাথে একটি অতিরিক্ত সময় হ্যাশ করা হয়েছে (সুতরাং গড় হ্যাশ গণনা তিনটি)। অন্যান্য সমস্ত পরিস্থিতিতে সেগুলির মধ্যে রয়েছে are
সুপারক্যাট

3

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


2

উচ্চ ফ্রিকোয়েন্সি সিস্টেমেটিক ট্রেডিং ইঞ্জিনিয়ারিংয়ের জন্য হ্যাশটেবল বনাম অভিধান সম্পর্কে একটি গুরুত্বপূর্ণ নোট: থ্রেড সুরক্ষা ইস্যু

হ্যাশটেবল একাধিক থ্রেড দ্বারা ব্যবহারের জন্য থ্রেড নিরাপদ। অভিধানের সার্বজনীন স্থিতিশীল সদস্যরা থ্রেড নিরাপদ, তবে কোনও উদাহরণ সদস্যের তা নিশ্চিত হওয়ার নিশ্চয়তা নেই।

সুতরাং হ্যাশটেবল এই ক্ষেত্রে 'স্ট্যান্ডার্ড' পছন্দ হিসাবে রয়ে গেছে।


এটি আংশিক সত্য। Hashtableশুধুমাত্র এক লেখক ও একাধিক পাঠকদের একই সময়ে সঙ্গে ব্যবহার করার জন্য নিরাপদ। অন্যদিকে, Dictionaryএকসাথে পরিবর্তিত না হওয়া পর্যন্ত একাধিক পাঠকদের সাথে এটি ব্যবহার করা নিরাপদ ।
ব্রায়ান মেনার্ড

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

1
.NET 4.0 একটি সম্মিলিত অভিধান সরবরাহ করে <টি কে, টিভিয়াল>
রব

1

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


1

সর্বাধিক জনপ্রিয় সি # ডেটা স্ট্রাকচার এবং সংগ্রহ

  • বিন্যাস
  • ArrayList
  • তালিকা
  • যোজিত তালিকা
  • অভিধান
  • HashSet
  • গাদা
  • কিউ
  • SortedList

সি # .নেটের বিভিন্ন ডেটা স্ট্রাকচার রয়েছে, উদাহরণস্বরূপ, সর্বাধিক সাধারণগুলির মধ্যে একটি অ্যারে। তবে সি # আরও অনেক বেসিক ডেটা স্ট্রাকচারের সাথে আসে। সঠিক ডেটা কাঠামোটি ব্যবহার করার জন্য পছন্দ করা একটি সুগঠিত এবং দক্ষ প্রোগ্রাম লেখার অংশ।

এই নিবন্ধে আমি অন্তর্নির্মিত সি # ডেটা স্ট্রাকচারের ওপরে যাব, যার মধ্যে সি #। নেট 3.5 এ নতুন পরিচিত রয়েছে। মনে রাখবেন যে এগুলির অনেকগুলি ডেটা স্ট্রাকচার অন্যান্য প্রোগ্রামিং ভাষার জন্য প্রয়োগ হয়।

বিন্যাস

সম্ভবত সবচেয়ে সাধারণ এবং সর্বাধিক সাধারণ ডেটা স্ট্রাকচার হ'ল অ্যারে। এসি # অ্যারে মূলত অবজেক্টগুলির একটি তালিকা। এর নির্ধারিত বৈশিষ্ট্য হ'ল সমস্ত বস্তু একই ধরণের (বেশিরভাগ ক্ষেত্রে) এবং সেগুলির একটি নির্দিষ্ট সংখ্যা রয়েছে। অ্যারের প্রকৃতি তালিকার মধ্যে তাদের অবস্থানের ভিত্তিতে উপাদানগুলিতে খুব দ্রুত অ্যাক্সেসের অনুমতি দেয় (অন্যথায় সূচক হিসাবে পরিচিত)। এসি # অ্যারের এভাবে সংজ্ঞায়িত করা হয়:

[object type][] myArray = new [object type][number of elements]

কিছু উদাহরণ:

 int[] myIntArray = new int[5];
 int[] myIntArray2 = { 0, 1, 2, 3, 4 };

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

ArrayList

সি # ডেটা স্ট্রাকচার, অ্যারেলিস্ট একটি গতিশীল অ্যারে। এর অ্যারিলিস্ট বলতে কী বোঝায় যে কোনও পরিমাণ পরিমাণ অবজেক্ট এবং যে কোনও ধরণের থাকতে পারে। এই ডাটা স্ট্রাকচারটি অ্যারেতে নতুন উপাদান যুক্ত করার প্রক্রিয়াগুলি সহজ করার জন্য ডিজাইন করা হয়েছিল। হুডের নিচে, একটি অ্যারেলিস্ট হ'ল একটি অ্যারে যার আকার প্রতিবার স্থানের বাইরে চলে যাওয়ার পরে দ্বিগুণ হয়। অভ্যন্তরীণ অ্যারের আকার দ্বিগুণ করা একটি খুব কার্যকর কৌশল যা দীর্ঘমেয়াদে উপাদান-কপি করার পরিমাণ হ্রাস করে। আমরা এখানে তার প্রমাণ পেতে চাই না। ডেটা স্ট্রাকচারটি ব্যবহার করা খুব সহজ:

    ArrayList myArrayList = new ArrayList();
    myArrayList.Add(56);
    myArrayList.Add("String");
    myArrayList.Add(new Form());

অ্যারেলিস্ট ডেটা স্ট্রাকচারের নেতিবাচক দিকটি হ'ল একটিকে অবশ্যই পুনরুদ্ধারকৃত মানগুলি তাদের মূল ধরণের মধ্যে ফেলে দিতে হবে:

int arrayListValue = (int)myArrayList[0]

উত্স এবং আরও তথ্য আপনি এখানে পেতে পারেন :


1

আমি সংগ্রহ এবং ডেটা স্ট্রাকচার পৃষ্ঠায় মাইক্রোসফ্ট ডক্সের "একটি সংগ্রহ চয়ন করুন" বিভাগটি সত্যই দরকারী

সি # সংগ্রহ এবং ডেটা স্ট্রাকচার: একটি সংগ্রহ চয়ন করুন

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

এবং আরও কয়েকটি বৈশিষ্ট্য তুলনা করতে নিম্নলিখিত ম্যাট্রিক্স

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.