বাইনারি মিনি-হিপ-এ বৃদ্ধি এবং কী হ্রাস-কী


16

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

যেমন

IncreaseKey(int pos, int newValue)
{
   heap[pos] = newValue;
   while(left(pos) < heap.Length)
   {
      int smallest = left(pos);
      if(heap[right(pos)] < heap[left(pos)])
         smallest = right(pos);
      if(heap[pos] < heap[smallest])
      { 
         swap(smallest, pos);
         pos= smallest;
      }
      else return;
   }   
}

উপরেরটি কি সঠিক? তা না হলে কেন? যদি হ্যাঁ, তবে কেন ন্যূনতম হিপগুলির জন্য তালিকাভুক্ত কী বাড়ানো হচ্ছে না?


1
সমস্ত উত্তর পড়ার পরে, আমি বলব, এটি একটি আশ্চর্যজনক বাদ পড়েছে, সম্ভবত historতিহাসিকভাবে ডিজকস্ট্রার অ্যালগরিদমের সর্বনিম্ন minতিহাসিকভাবে ব্যবহার হয়েছে।
মার্টিনাস

3
আপনি অবশ্যই সন্নিবেশের পরে মুছে ফেলা ব্যবহার করে সর্বদা বৃদ্ধি-কী প্রয়োগ করতে পারেন এবং মুছা-মুছা নিজেই হ্রাস-কী (to -∞) হিসাবে ডিলিট-মিনিট হিসাবে প্রয়োগ করা যেতে পারে।
ডেভম্যাক

@ maaartinus মন্তব্য সঠিক উত্তর।
সর্বোচ্চ

উত্তর:


6

আপনার প্রস্তাবিত অ্যালগরিদমটি কেবল হিপিফায়েট। এবং প্রকৃতপক্ষে - আপনি যদি একটি মিনিটের গাদাতে কোনও উপাদানের মান বাড়িয়ে দেন এবং তার সাবট্রিটি হিপিফাই করে থাকেন তবে আপনি একটি আইনী ন্যূনতম গাদা দিয়ে শেষ করবেন।


তাহলে সিএলআর বা উইকিপিডিয়া তালিকা কেন সমর্থিত ক্রিয়াকলাপ হিসাবে কী বাড়ায়?
এটুকু

আমি সম্মত হই যে এটি বিভ্রান্তিকর, তবে আমি অ্যালগরিদমে কোনও ভুল দেখছি না।
শাল

5

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

বাইনারি হ্যাপগুলি বিমূর্ত ডেটা স্ট্রাকচারের অগ্রাধিকারের সারিটি প্রয়োগ করে, যা অপারেশনগুলি হল_সেম্পটি, অ্যাড-এলিমেন্ট (তার অগ্রাধিকার সহ একটি কী), ফাইন্ড_মিন এবং মুছুন_মিন। আরও উন্নত সারিগুলি কীটিকে অগ্রাধিকার হ্রাস করতে (মিন_হ্যাপে) বা এমনকি বাড়ানোর অনুমতি দেয়। আসলে, আপনি একটি বাস্তবায়ন দিয়েছেন।

দুটি মন্তব্য। আপনার অপারেশন হিপিফাই ফাংশনে ব্যবহৃত হয়, এটি দক্ষতার সাথে একটি অ্যারের থেকে একটি গাদা তৈরি করে। হিপিফাইয়ে আপনার ক্রিয়াকলাপ পুনরাবৃত্তি হয় (শেষ কী থেকে শুরু)।

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


1
বর্নানার জন্য ধন্যবাদ. তবে, সিএলআর হ্রাস কীটিতে পরামিতি হিসাবে নোডের অবস্থানও রয়েছে।
গ্যাটোটপুজো

তুমি ঠিক. সিএলআরএসের ect.৫.৫ বিভাগে অগ্রাধিকারের সারিগুলির সংজ্ঞাতে আমি এই অসম্পূর্ণতার কারণ খুঁজে পাইনি। নোট বৃদ্ধি-কী এই অধ্যায়ের প্রয়োগ হিপসোর্টে ব্যবহৃত হয় না। দেখে মনে হচ্ছে বৃদ্ধি এবং হ্রাসের মধ্যে অসমত্ব কেবলমাত্র উদাহরণস্বরূপ ডিজকস্ট্রার অ্যালগরিদম যেমন ডেটা কাঠামো ব্যবহৃত হয় তার সাথে সম্পর্কিত। সেখানে (একটি মিনিট-হিপ ব্যবহার করে) কয়েকটি নির্বাচিত নোড আরও জরুরি হয়ে উঠতে পারে এবং গাদাতে 'আপ' সরিয়ে নিয়ে যেতে পারে।
হেনড্রিক জানুয়ারী

0

আমি মনে করি যে প্রথম বিবেচ্য বিষয়টি হ'ল সমর্থিত অপারেশনটি কী?

"একটি নির্দিষ্ট, স্থির কী সহ একটি মান সন্নিবেশকরণ" (উদাহরণস্বরূপ পূর্ণসংখ্যার ক্ষেত্র থেকে নেওয়া কীগুলির জন্য, কী = 3 দিয়ে সন্নিবেশ করানো) কি মিনিটের গাদা জন্য সমর্থিত ক্রিয়াকলাপের সাথে মিলে যায়?

না, কারণ সেই অপারেশনটি আরও সাধারণ সমর্থিত ক্রিয়াকলাপগুলির সাথে তুচ্ছভাবে প্রয়োগ করা যেতে পারে। তেমনি, অজানা insertক্রিয়াকলাপের সাথে একবারে 2 টি উপাদান যুক্ত করা যায় ।

অন্যদিকে, insertপ্রয়োগের বিবরণ প্রকাশের চেয়ে অপারেশনটিকে অন্যথায় সংজ্ঞায়িত করা যায় না। উইকিপিডিয়া পৃষ্ঠায় তালিকাভুক্ত অপারেশনগুলির ক্ষেত্রে এটি বেশ একইরকম, heapifyব্যতীত, সম্ভবত এটির একটি ক্রম দ্বারা প্রয়োগ করা যেতে পারে insert

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

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

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

আমার দ্বিতীয় বক্তব্যটি কীভাবে আমরা একটি অগ্রাধিকারের সারিটি সংজ্ঞায়িত করব (এটি বাইনারি হিপসের রেসন ডি'ত্রে)। কি increase_keyযে ডাটাটাইপ জন্য একটি প্রয়োজনীয় অপারেশন, অর্থাত্ এর সঠিক ব্যবহারের জন্য?

আপনি দেখতে পাচ্ছেন যে আমার কোণটি সমস্ত সংজ্ঞা সম্পর্কিত। আমি সত্যিই আপনার প্রশ্নের উত্তর সরবরাহ করি না, কেবলমাত্র কিছু পয়েন্টার, সুতরাং বর্ধনসমূহ স্বাগত।


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

খুব ভাল পয়েন্ট। আমার দৃষ্টিভঙ্গি কিছুটা সীমাবদ্ধ বলে মনে হচ্ছে। সত্যিই, @ হেন্ডরিকজান উত্তরটি খুব ভাল ব্যাখ্যা নিয়ে আসে।
didierc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.