সি # অভিধানের দক্ষতা


14

সি # অভিধানগুলি কোনও কিছুর অস্তিত্ব আছে কিনা তা সন্ধান করার একটি সহজ উপায় ইত্যাদি etc. এগুলি কীভাবে কাজ করে সে সম্পর্কে আমার একটি প্রশ্ন রয়েছে। একটি অভিধানের পরিবর্তে বলি আমি একটি অ্যারেলিস্ট ব্যবহার করি। ব্যবহার করার পরিবর্তে ContainsKey(বা অন্য ভাষায় একটি সমতুল্য পদ্ধতি) ArrayList মাধ্যমে আমি লুপ যদি কিছু (বাইনারি অনুসন্ধান বা করণ যদি ডাটা অনুসারে বাছাই করা হয় বা কিছু অনুরূপ) অস্তিত্ব আছে বার করো। দক্ষতার পার্থক্য কী? কি ContainsKeyআরো কিছু কার্যকর উপায় ব্যবহার বদলে কী ও পরীক্ষার মধ্য দিয়ে লুপিং আমি কি যদি অনুসন্ধানের বিদ্যমান পদ্ধতি?

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

মূলত আমি যা চাইছি তা হ'ল। অভিধানগুলি প্রোগ্রামারদের জন্য সহায়ক। এগুলির মধ্যে এমন পদ্ধতি রয়েছে যা অনেকগুলি জিনিসকে সহায়তা করে এবং তারা স্ট্রিংগুলি পূর্ণসংখ্যার (কী এবং মান) এবং আরও অনেক কিছুর সাথে একত্রিত করে। তবে দক্ষতার বিষয়ে তারা কী অফার করে? একটি তার মধ্যে পার্থক্য কি dictionaryএকটি বনাম ArrayListএরstructs(string,int)


আপনি এখানে কমলাগুলির সাথে আপেলকে তুলনা করছেন। আমার মনে হয় আপনি যে কীওয়ার্ডটি সন্ধান করছেন তা হ'ল Data Structures এই উইকির লিঙ্কটি আপনার পক্ষে আরও সাহায্য করতে পারে
এম্পিট

উত্তর:


23

আপনি একটি বিট খনন দেখতে কিভাবে পেয়েছেন অভিধান তার না যত সুস্পষ্ট - C # এর বাস্তবায়িত হয় HashMap (ক হ্যাশ টেবিল) অথবা TreeMap (ক সাজানো গাছ) (বা ConcurrentSkipListMap - একটি Skip তালিকা )।

যদি আপনি "মন্তব্যগুলি" বিভাগে খনন করেন:

অভিধান জেনেরিক শ্রেণিটি কীগুলির সেট থেকে মানগুলির একটি সেট থেকে ম্যাপিং সরবরাহ করে। অভিধানে প্রতিটি সংযোজনে একটি মান এবং এর সাথে সম্পর্কিত কী থাকে। এর কীটি ব্যবহার করে কোনও মান পুনরুদ্ধার করা খুব দ্রুত, ও (1) এর কাছাকাছি, কারণ অভিধান ক্লাসটি হ্যাশ টেবিল হিসাবে প্রয়োগ করা হয়।

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

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

বিভিন্ন দেখার দক্ষতা হিসাবে / রয়েছে?

  • একটি অচিরাচরিত তালিকা হাঁটা: ও (এন)
  • বাছাই করা অ্যারেগুলির বাইনারি অনুসন্ধান: ও (লগ এন)
  • সাজানো গাছ: ও (লগ এন)
  • হ্যাশ টেবিল: ও (1)

বেশিরভাগ লোকের জন্য হ্যাশ টেবিলটি তারা চায়।

আপনি দেখতে পাচ্ছেন যে পরিবর্তিত সারণি অভিধানটি আপনি যা চান তা চাইলে:

SortedDictionary<TKey, TValue>জেনেরিক বর্গ হে (লগ ঢ) আহরণ, যেখানে n অভিধানে উপাদানের সংখ্যা সঙ্গে একটি বাইনারি অনুসন্ধান বৃক্ষ হয়। এই ক্ষেত্রে, এটি SortedList<TKey, TValue>জেনেরিক বর্গের মতো। দুটি ক্লাসে একই রকম অবজেক্ট মডেল রয়েছে এবং উভয়ের ও (লগ এন) পুনরুদ্ধার রয়েছে।

যদিও, আবারও, যদি ডেটা স্ট্রাকচারটি আপনার ডেটার সাথে আদর্শভাবে কাজ করে না তবে আপনার ডেটার জন্য সবচেয়ে ভাল কাজ করে এমন একটি লেখার জন্য আপনাকে সরঞ্জামগুলি (ইন্টারফেস) দেওয়া হবে।

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


5
ও (1) অগত্যা "দ্রুত" নয়। অ্যাপ্লিকেশন যে মাপের সাথে কাজ করছে তার সংগ্রহের জন্য হ্যাশটেবলের চেয়ে একটি তালিকার মধ্য দিয়ে লুপিং করা আরও দ্রুত হতে পারে।
কিয়াসনাম

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

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

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

প্রাসঙ্গিক উদাহরণ হিসাবে, আমি সম্প্রতি সি ++ তে কিছু কোড অপ্টিমাইজ করেছি যা মূলত প্রায় 20 টি এন্ট্রিগুলির ডেটা সেটগুলির জন্য হ্যাশ টেবিল ব্যবহার করে এবং প্রায় 400 মিমিগুলি সম্পূর্ণ করতে নিচ্ছিল। একটি বাইনারি গাছের স্যুইচিং এটিকে 200 মিমি এনেছে, কারণ গাছটি অ্যাক্সেস করা সহজ। তবে নাম মান জোড়ার একটি অ্যারে এবং একটি হিউরিস্টিক লুক আপ ফাংশন ব্যবহার করে আমি এটি আরও কাটাতে সক্ষম হয়েছি যা অনুমান করেছিল যে অতীত অ্যাক্সেসের নিদর্শনগুলির উপর ভিত্তি করে কোথায় অনুসন্ধান শুরু করা যায়। সুতরাং এটি অ্যাক্সেসগুলিতে (যেমন স্থানীয়তা) কতটা ডেটা আছে এবং কী ধরণের প্যাটার্ন রয়েছে তা সমস্ত বিষয়।
জুলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.