পাইথন ডিক বাস্তবায়নের জন্য কেন হ্যাশ টেবিল ব্যবহার করে, তবে রেড-ব্ল্যাক ট্রি নয়?
কী কী? কর্মক্ষমতা?
পাইথন ডিক বাস্তবায়নের জন্য কেন হ্যাশ টেবিল ব্যবহার করে, তবে রেড-ব্ল্যাক ট্রি নয়?
কী কী? কর্মক্ষমতা?
উত্তর:
এটি একটি সাধারণ, পাইথন-নির্দিষ্ট উত্তর।
| Hash Table | Red-Black Tree |
-------+-------------+---------------------+
Space | O(n) : O(n) | O(n) : O(n) |
Insert | O(1) : O(n) | O(log n) : O(log n) |
Fetch | O(1) : O(n) | O(log n) : O(log n) |
Delete | O(1) : O(n) | O(log n) : O(log n) |
| avg :worst | average : worst |
হ্যাশ টেবিলগুলির সাথে সমস্যা হ্যাশগুলির সংঘর্ষ হতে পারে। সংঘর্ষগুলি সমাধান করার জন্য বিভিন্ন প্রক্রিয়া রয়েছে, যেমন মুক্ত ঠিকানা বা পৃথক চেইন। পরম সবচেয়ে খারাপ ক্ষেত্রে হ'ল সমস্ত কীগুলির একই হ্যাশ কোড রয়েছে, এক্ষেত্রে একটি হ্যাশ টেবিল একটি লিঙ্কযুক্ত তালিকায় অবনমিত হবে।
অন্যান্য সমস্ত ক্ষেত্রে, একটি হ্যাশ টেবিল একটি দুর্দান্ত ডেটা স্ট্রাকচার যা কার্যকর করা সহজ এবং ভাল কার্য সম্পাদন করে। একটি খারাপ দিকটি হ'ল বাস্তবায়নগুলি যেগুলি দ্রুত টেবিলটি বাড়িয়ে তুলতে পারে এবং তাদের এন্ট্রিগুলিকে পুনরায় বিতরণ করতে পারে বাস্তবে ব্যবহৃত প্রায় মেমরিটি সম্ভবত নষ্ট করবে।
আরবি-ট্রিগুলি স্ব-ভারসাম্যপূর্ণ এবং সবচেয়ে খারাপ ক্ষেত্রে তাদের অ্যালগরিদমিক জটিলতা পরিবর্তন করে না। তবে এগুলি কার্যকর করা আরও কঠিন। তাদের গড় জটিলতা হ্যাশ টেবিলের চেয়েও খারাপ।
একটি হ্যাশ টেবিলের সমস্ত কী একে অপরের মধ্যে সাম্যের জন্য হ্যাশেবল এবং তুলনীয় হতে হবে। এটি স্ট্রিং বা পূর্ণসংখ্যার জন্য বিশেষত সহজ, তবে এটি ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলিতে প্রসারিত করার জন্য মোটামুটি সোজা। জাভা মত কিছু ভাষায় এই বৈশিষ্ট্যগুলি সংজ্ঞা দ্বারা নিশ্চিত করা হয়।
আরবি-ট্রি-র কীগুলির অবশ্যই একটি মোট ক্রম থাকতে হবে: প্রতিটি কী অবশ্যই অন্য কোনও কী এর সাথে তুলনীয় হতে হবে এবং দুটি কী অবশ্যই ছোট, বৃহত্তর বা সমান তুলনা করতে হবে। এই অর্ডারিং সাম্যতা অবশ্যই শব্দার্থ সমতার সমতুল্য হতে হবে। এটি পূর্ণসংখ্যার এবং অন্যান্য সংখ্যার জন্য সোজা, স্ট্রিংয়ের জন্যও যথেষ্ট সহজ (ক্রমটি কেবল সামঞ্জস্যপূর্ণ এবং বাহ্যিকভাবে পর্যবেক্ষণযোগ্য নয়, সুতরাং আদেশটি লোকালগুলি বিবেচনা করার প্রয়োজন নেই [1] ), তবে অন্য প্রকারের পক্ষে যাদের অন্তর্নিহিত ক্রম নেই তাদের পক্ষেও কঠিন । তাদের মধ্যে কিছু তুলনা সম্ভব না হলে বিভিন্ন ধরণের কীগুলি থাকা একেবারেই অসম্ভব।
[1]: আসলে, আমি এখানে ভুল। দুটি স্ট্রিং বাইট-সমান না হলেও কিছু ভাষার নিয়ম অনুসারে সমতুল্য হতে পারে। উদাহরণস্বরূপ, ইউনিকোডের সাধারণকরণ দেখুন যেখানে দুটি সমান স্ট্রিং আলাদাভাবে এনকোড করা হয়। আপনার হ্যাশ কীটির জন্য ইউনিকোড অক্ষর রচনার বিষয়টি গুরুত্বপূর্ণ কিনা তা হ্যাশ টেবিল বাস্তবায়ন জানতে পারে না।
কেউ ভাবতে পারেন যে আরবি-ট্রি কীগুলির জন্য সুলভ সমাধান হ'ল সমতার জন্য প্রথমে পরীক্ষা করা, তারপরে পরিচয়ের তুলনা (অর্থাত্ পয়েন্টারগুলির তুলনা)। যাইহোক, এই ক্রমটি সংক্রামক হবে না: যদি a == b
এবং id(a) > id(c)
, তবে এটি অবশ্যই তা অনুসরণ করতে হবে id(b) > id(c)
, যা এখানে গ্যারান্টিযুক্ত নয়। পরিবর্তে, আমরা কীগুলির হ্যাশ কোডটি লুকিং কী হিসাবে ব্যবহার করতে পারি। এখানে, ক্রমটি সঠিকভাবে কাজ করে তবে আমরা একই হ্যাশ কোড সহ একাধিক স্বতন্ত্র কীগুলি সহ শেষ করতে পারি, যা আরবি ট্রিতে একই নোডকে বরাদ্দ করা হবে। এই হ্যাশ সংঘর্ষগুলি সমাধান করার জন্য আমরা হ্যাশ টেবিলগুলির মতো পৃথক চেইন ব্যবহার করতে পারি, তবে এটি হ্যাশ টেবিলগুলির জন্যও সবচেয়ে খারাপ ক্ষেত্রে আচরণের উত্তরাধিকারী হয় - উভয় বিশ্বের সবচেয়ে খারাপ of
আমি হ্যাশ টেবিলের কাছে গাছের চেয়ে মেমরির স্থানীয় অবস্থানের আশা করি কারণ হ্যাশ টেবিলটি মূলত কেবল একটি অ্যারে হয়।
উভয় ডেটা স্ট্রাকচারে প্রবেশের ক্ষেত্রে মোটামুটি উচ্চ ওভারহেড রয়েছে:
কোনও আরবি-ট্রিতে সন্নিবেশ এবং মোছার মধ্যে গাছের আবর্তন জড়িত। এগুলি আসলে ব্যয়বহুল নয়, তবে একটি ওভারহেড জড়িত। একটি হ্যাশে, সন্নিবেশ এবং মুছে ফেলা সহজ অ্যাক্সেসের চেয়ে বেশি ব্যয়বহুল নয় (যদিও সন্নিবেশের উপর একটি হ্যাশ টেবিলের আকার পরিবর্তন করা একটি O(n)
প্রচেষ্টা)।
হ্যাশ টেবিলগুলি স্বভাবগতভাবে পরিবর্তনযোগ্য, যেখানে একটি আরবি-ট্রিও একটি পরিবর্তনযোগ্য ফ্যাশনে প্রয়োগ করা যেতে পারে। তবে এটি খুব কমই কার্যকর।
সত্য কারণ হতে পারে এমন একটি সম্পূর্ণ পরিসীমা রয়েছে তবে মূল কারণগুলি সম্ভবত:
সাধারণত লেখার / রক্ষণাবেক্ষণ করা সহজ, এবং সাধারণ ব্যবহারের ক্ষেত্রে পারফরম্যান্স বিজয়ী? আমাকে সাইন আপ করুন, দয়া করে!