অভিধান বনাম তালিকা


30

কাজেই আমি Dictionary<int, int>আজকের দিনে ছুটে এসেছি । এটি আমার কাছে কেবল অদ্ভুত বলে মনে হয়েছিল কারণ আমি সম্ভবত একটি List<int>পরিবর্তে ব্যবহার করতাম । কোনও পার্থক্য আছে এবং এমন কোনও ব্যবহারের ক্ষেত্রে কী আছে যেখানে অন্য কাঠামোর চেয়ে অন্য কাঠামোর পছন্দ হবে?


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

3
নামের অভিধানটি আমার কাছে তা স্পষ্ট করে তোলে। যখন আপনাকে কিছু দ্রুত দেখার দরকার হয় তখন আপনি একটি অভিধান ব্যবহার করেন।
ক্যাসপ্যান্ডিয়ন

2
@ChaosPandion: একটি List<T>.NET কাঠামোর মধ্যে একটি র্যান্ডম এক্সেস অ্যারে, যেখানে একটা লুকআপ অপারেশন সাধারণত হয় দ্রুত একটি চেয়ে Dictionary<int,T>
ডক ব্রাউন

2
@ ডকব্রাউন - সংখ্যার সূচকটি কী হিসাবে ব্যবহার করার ক্ষেত্রে কেবল অদ্ভুত ক্ষেত্রে। অন্যান্য বুদ্ধিমান চেহারা ব্যবহার করার সময় দ্রুত হতে হবে Dictionary<TKey, TValue>
কেওসপ্যান্ডিয়ন

2
@ চাওস এই প্রশ্নটি সেই অদ্ভুত ঘটনা সম্পর্কে
MarkJ

উত্তর:


32

Dictionary<int, int>আপনার সূচকগুলির কেবলমাত্র অবস্থানগত অবস্থানের পাশাপাশি কোনও বিশেষ অর্থ থাকলে আপনি একটি ব্যবহার করবেন ।

তাৎক্ষণিক উদাহরণ যা মনে আসে তা হ'ল একটি ডাটাবেসে একটি আইডি কলাম এবং কোন কলাম কলাম সংরক্ষণ করা। উদাহরণস্বরূপ, আপনার যদি একটি [person-id]কলাম এবং একটি [personal-pin]কলাম থাকে, তবে আপনি এগুলিকে একটিতে আনতে পারেন Dictionary<int, int>। এই উপায়ে pinDict[person-id]আপনাকে একটি পিন দেয় তবে সূচকটি অর্থবহ এবং কেবল একটি অবস্থানে নয় List<int>

তবে সত্যই, যে কোনও সময় আপনার সাথে দুটি পূর্ণসংখ্যার সম্পর্কিত তালিকা থাকে, এটি একটি উপযুক্ত ডেটা কাঠামো হতে পারে।


যদি আমার পার্সোনাল-আইডি 0, ..., 999 এর পরিসীমা থেকে আসে এবং আমাকে সমস্ত 1000 ব্যক্তির জন্য ব্যক্তিগত-পিন মানগুলি মেমোরিতে লোড করতে হবে, আমি সাধারণত List<int>একটি অভিধান বেছে নেব না। আমার উত্তর নীচে দেখুন।
ডক ব্রাউন

3
হ্যাঁ তবে একটি অভিধান বিচ্ছিন্ন হতে পারে
জে.কে.

@ জে কে: আমি আমার উত্তরে বিস্তৃত করার চেষ্টা করেছি ঠিক এটিই।
ডক ব্রাউন

7
ব্যক্তিগত পিন? নিদারুণ শোনায়।
জ্যাক 6

এইচএম, যখন সূচকটির "একটি বিশেষ অর্থ" থাকে, বাস্তব বিশ্ব-পরিস্থিতিগুলিতে এটি সম্ভবত একটি সংক্ষিপ্ত পরিসীমা তৈরি না করে থাকতে পারে [0, ..., এন] (যদিও এটি বাধ্যতামূলক নয়), তাই এই উত্তরটি হ'ল স্পষ্টত ভুল নয়, কিন্তু অসম্পূর্ণ। তবুও আইএমএইচও সিদ্ধান্ত এই "বিশেষ অর্থ জিনিস" এর উপর ভিত্তি করে করা উচিত নয়, তবে কেবল "কীগুলি প্রায় একটি অন্তর [0, ..., n] তৈরি করে"। আমার অনুমানের সংখ্যার ভিত্তিতে আমি অনুমান করি যে বেশিরভাগ পাঠক এই পয়েন্টটি মিস করেছেন।
ডক ব্রাউন

28

Listঅ্যারে এবং হ্যাশ টেবিলDictionary হিসাবে ভাবেন । আপনি শুধুমাত্র ব্যবহার করবেDictionary যদি মানগুলির (বা সংযুক্ত) অর্থবোধক কীগুলি মানচিত্রের প্রয়োজন হয় তবে আপনি Listকেবলমাত্র মানচিত্রের (বা সহযোগী) অবস্থানগুলির (বা সূচকগুলি) মানগুলিতে ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, বলুন আপনি কোনও ব্যক্তির বয়স এবং তার উচ্চতার মধ্যে একটি সমিতি সঞ্চয় করতে চেয়েছিলেন। আপনি Dictionary<int, int>ব্যক্তির বয়স ( ক int) এর উচ্চতা (এ) ম্যাপ করতে একটি ব্যবহার করতে পারেন int:

Dictionary<int, int> personHeightMap = new Dictionary<int, int>();

personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);

int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;

খুব কার্যকর উদাহরণ নয়, তবে মূল কথাটি হ'ল আপনি এটিকে মার্জিতভাবে Listএটির সাথে সক্ষম করতে পারবেন না কারণ এটি এই মানগুলিকে অবস্থানগতভাবে সংরক্ষণ করতে হবে।


7
+1 টি উল্লেখ একটি যে জন্য Listসঙ্গে পুলিশ অর্ডার , যেখানে একটা Dictionaryসাথে চুক্তি সমিতি । আপনার যদি প্রতিবার একটি নির্দিষ্ট ক্রমে আপনার ডেটা নেওয়া দরকার হয় বা একে অপরের সাথে সম্পর্কিত তাদের ক্রমটি গুরুত্বপূর্ণ Listহয় তবে একটি উপায়। Dictionariesঅযৌক্তিক হতে থাকে এবং ম্যাপিং কী -> মান সম্পর্কের সাথে ডিল করে।
কেচালোক্স

2
সর্বশেষে, যখন আপনি কী সন্ধান করছেন তা যখন জানবেন, হ্যাশ টেবিলটি ও (1) সময়ের কাছাকাছি, যখন অ্যারেটি হ'ল (লগএন) সেরা ক্ষেত্রে (সাজানো এবং ডাব্লু / ডুপ্লিকেট) এবং ও (এন) সবচেয়ে খারাপ অবস্থা।
জেনসজি

1
+1 টি। আমার মতামত অনুসারে অন্যরা কেউ সেই বিন্দুটিকে সম্বোধন করেছে বলে মনে হয় না যে তালিকাটি শব্দার্থিকভাবে অর্ডার করা হয়েছে এবং ডিক্টগুলি শব্দার্থতভাবে অনুসন্ধান করা হয় যা একেবারে মৌলিক , আমার মতে।
বেনিয়ামিন হডসন

15

শব্দার্থকভাবে, একটি Dictionary<int, T>এবং List<T>খুব অনুরূপ, উভয়ই .NET ফ্রেমওয়ার্কের এলোমেলো অ্যাক্সেস ধারক। অভিধানের প্রতিস্থাপন হিসাবে একটি তালিকা ব্যবহার করতে, আপনার তালিকার খালি স্লটগুলি উপস্থাপন করার জন্য আপনার টাইপের T(যেমন null) একটি বিশেষ মান প্রয়োজন । যদি Tকোনও প্রবণতা মতো পছন্দ না হয় তবে আপনি এর পরিবর্তে intব্যবহার করতে পারেন int?, বা আপনি যদি ইতিবাচক মানগুলি সঞ্চয় করার প্রত্যাশা করেন তবে খালি স্লটগুলি উপস্থাপন করতে আপনি -1 এর মতো একটি বিশেষ মানও ব্যবহার করতে পারেন।

আপনি কোনটি বেছে নেবেন তা মূল মানগুলির সীমার উপর নির্ভর করবে। আপনার চাবি যদিDictionary<int, T> কোনও পূর্ণসংখ্যার ব্যবধানের মধ্যে থাকে তবে তাদের মধ্যে অনেকগুলি ফাঁক ছাড়াই (উদাহরণস্বরূপ, [0, ... 100] এর মধ্যে 80 টি মান), তবে List<T>সূচকগুলির মাধ্যমে অ্যাক্সেস দ্রুততর হওয়ার কারণে একটি আরও উপযুক্ত হবে and এই ক্ষেত্রে একটি অভিধানের তুলনায় মেমরি এবং সময় ওভারহেড কম রয়েছে।

যদি আপনার মূল মানগুলি int[0, ..., 1000000] এর মতো ব্যাপ্তি থেকে 100 টি মান হয়, তবে List<T>টি এর 1000000 মান ধরে রাখতে একটি মেমরি দরকার, যেখানে আপনার অভিধানের টি এর 100 টি মানের প্রায় ক্রমান্বয়ে একটি মেমরির প্রয়োজন হবে, ইনট এর 100 মান (প্লাস কিছু ওভারহেড, বাস্তবে সেই 100 টি কী এবং মানগুলি সঞ্চয় করার জন্য মেমরির চেয়ে প্রায় 2 গুণ বেশি প্রত্যাশা করে)। সুতরাং পরবর্তী ক্ষেত্রে একটি অভিধান আরও উপযুক্ত হবে।


6
এই গুরুত্বপূর্ণ পার্থক্য এই প্রোগ্রামটিতে হয়, অভিধান <int- এ, int-> বিক্ষিপ্ত হতে পারে
জে।

সেক্ষেত্রে আমরা <কীভ্যালিউয়ার <<<<<<< তালিকা ব্যবহার করতে পারি না? লিনিয়ার ট্র্যাভারসাল জন্য কোনটি ভাল হবে?
দীপক মিশ্র

@ প্রদীপমিশ্রা: এখানে মূল পার্থক্য List<KeyValuePair<int,T>>হ'ল কোনও ও (১) লুকিং অপারেশন উপলব্ধ নেই। দ্বিতীয়ত, উপাদানগুলির List<KeyValuePair<int,T>>একটি নির্দিষ্ট ক্রম থাকতে পারে, যা তাদের মূল মান থেকে পৃথক। আপনি আধুনিক কিন্তু সাবেক প্রয়োজন যদি List<KeyValuePair<int,T>>বা List<Tuple<int,T>>ভাল পছন্দ হতে পারে। আপনার যদি উভয়ের প্রয়োজন হয় তবে তাও আছে OrderedDictionary
ডক ব্রাউন

@ ডকব্রাউন লিনিয়ার ট্র্যাভারসাল (অর্থাত্ ফোরাচ) এবং operationোকানো অপারেশনের জন্য কোনটি আরও ভাল হবে, সরাসরি অনুসন্ধানের প্রয়োজন নেই?
দীপক মিশ্র

@ প্রদীপমিশ্র: সফ্টওয়্যার বিকাশের ক্ষেত্রে "সাধারণভাবে আরও ভাল" এর মতো আর কিছু নেই। এখানে আরও ভাল মানে দ্রুত, পড়া ভাল, টাইপ করার জন্য কম কোড, আসন্ন প্রয়োজনীয়তার জন্য প্রসারিত সহজ। তবে সাধারণভাবে, এটিকে বোঝা বন্ধ করুন, এমন একটি বাস্তবায়ন করুন যা আপনার সমস্যাটি সঠিকভাবে সমাধান করে এবং আপনার চোখে সর্বাধিক সহজ , আপনার উদ্দেশ্যে এটি পর্যাপ্ত দ্রুত কিনা তা পরীক্ষা করে দেখুন এবং আপনি যখন ত্রুটিগুলি লক্ষ্য করেন তখন এতে আরও বেশি চিন্তাভাবনা বিনিয়োগ করুন।
ডক ব্রাউন

6

কীভাবে কেউ তাদের সমতুল্য বিবেচনা করতে পারে?

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

খুব কম পরিস্থিতি হবে যেখানে একজন নাটকীয়ভাবে অন্যের চেয়ে উচ্চতর ছিল না।


2

অন্যদিকে: অন্যান্য প্রোগ্রামিং ভাষা এই ধরণের ডেটা স্ট্রাকচারকে অভিধানের পরিবর্তে মানচিত্র হিসাবে উল্লেখ করে।

যদি আপনার ডেটা অর্থপূর্ণভাবে কী / মান জোড় হিসাবে সংজ্ঞায়িত করা যায় তবে একটি অভিধান এর কী ব্যবহার করে যদি কোনও মান খুঁজে বের করতে হয় তবে আপনাকে আরও দ্রুত অ্যাক্সেস সরবরাহ করবে।

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

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


1

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

আরও সম্পর্কে .... উদাহরণস্বরূপ অভিধান বনাম তালিকা


-1

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


-3

এগুলি দুর্দান্ত উত্তর যা বেসগুলি আবরণ করে বলে মনে হচ্ছে।

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


8
আমি একমত নই অভিধান / মানচিত্র হল একটি মৌলিক ডেটা কাঠামো যা প্রতিটি সফ্টওয়্যার ইঞ্জিনিয়ারের সাথে ঘনিষ্ঠভাবে পরিচিত হওয়া উচিত। যে কোনও উপায়ে: আপনার কোনও ডেটা স্ট্রাকচার ব্যবহার করার জন্য ন্যায়সঙ্গত কারণ প্রয়োজন; তালিকা সহ।
স্টিভেন এভার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.