পাইথন ডিক বাস্তবায়নের জন্য কেন হ্যাশ টেবিল ব্যবহার করে, তবে রেড-ব্ল্যাক ট্রি নয়? [বন্ধ]


11

পাইথন ডিক বাস্তবায়নের জন্য কেন হ্যাশ টেবিল ব্যবহার করে, তবে রেড-ব্ল্যাক ট্রি নয়?

কী কী? কর্মক্ষমতা?


2
আপনার গবেষণা ভাগ করে নেওয়া প্রত্যেককে সহায়তা করে । আপনি কী চেষ্টা করেছেন এবং কেন এটি আপনার প্রয়োজনীয়তা মেটেনি তা আমাদের বলুন। এটি প্রমাণ করে যে আপনি নিজেকে সাহায্য করার চেষ্টা করার জন্য সময় নিয়েছেন, এটি আমাদের সুস্পষ্ট উত্তরের পুনরাবৃত্তি থেকে বাঁচায় এবং সর্বোপরি এটি আপনাকে আরও নির্দিষ্ট এবং প্রাসঙ্গিক উত্তর পেতে সহায়তা করে। এছাড়াও কীভাবে জিজ্ঞাসা করবেন দেখুন
gnat

উত্তর:


16

এটি একটি সাধারণ, পাইথন-নির্দিষ্ট উত্তর।

অ্যালগরিদমিক জটিলতার তুলনা

       | 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)প্রচেষ্টা)।

  • হ্যাশ টেবিলগুলি স্বভাবগতভাবে পরিবর্তনযোগ্য, যেখানে একটি আরবি-ট্রিও একটি পরিবর্তনযোগ্য ফ্যাশনে প্রয়োগ করা যেতে পারে। তবে এটি খুব কমই কার্যকর।


সংঘর্ষযুক্ত হ্যাশগুলির জন্য আমরা কীভাবে সামান্য আরবি-গাছ সহ একটি হ্যাশ টেবিল রাখতে পারি?
আরগায়ার

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

গাছগুলিকে "<" সমর্থন করে এমন জিনিসগুলির প্রয়োজন। হ্যাশ টেবিলগুলিতে হ্যাশ + "=" সমর্থন করে এমন সামগ্রী প্রয়োজন। সুতরাং আরবি গাছগুলি সম্ভব নাও হতে পারে। তবে সত্যিই যদি আপনার হ্যাশ টেবিলের কোনও উল্লেখযোগ্য পরিমাণ সংঘর্ষ হয় তবে আপনার নতুন হ্যাশ ফাংশন প্রয়োজন, সংঘর্ষের কীগুলির জন্য বিকল্প অ্যালগরিদম নয়।
gnasher729

1

সত্য কারণ হতে পারে এমন একটি সম্পূর্ণ পরিসীমা রয়েছে তবে মূল কারণগুলি সম্ভবত:

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

সাধারণত লেখার / রক্ষণাবেক্ষণ করা সহজ, এবং সাধারণ ব্যবহারের ক্ষেত্রে পারফরম্যান্স বিজয়ী? আমাকে সাইন আপ করুন, দয়া করে!

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