কিভাবে C ++ Priority_queue ব্যবহার করবেন?

How Use C Priority_queue



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

C ++ prior_queue ব্যবহার করার জন্য, প্রোগ্রামটি কোড দিয়ে শুরু করা উচিত:







#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
ব্যবহার নামস্থানঘন্টার;

এটি প্রোগ্রামে কিউ লাইব্রেরি অন্তর্ভুক্ত করে।



পড়া চালিয়ে যাওয়ার জন্য, পাঠকের C ++ এর প্রাথমিক জ্ঞান থাকা উচিত ছিল।



নিবন্ধ বিষয়বস্তু

মৌলিক নির্মাণ

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





অগ্রাধিকার_কিউ<টাইপ>সারির নাম;

এই সিনট্যাক্সের সাহায্যে, সর্বাধিক মানটি প্রথমে সরানো হয়। তাত্ক্ষণিকতার একটি উদাহরণ হল:

অগ্রাধিকার_কিউ<int>pq;

অথবা



অগ্রাধিকার_কিউ<গৃহস্থালি>pq;

ভেক্টর এবং ডেক C ++ এ দুটি ডেটা স্ট্রাকচার। একটি অগ্রাধিকার_কিউ তাদের উভয়ের সাথে তৈরি করা যেতে পারে। ভেক্টর কাঠামো থেকে একটি অগ্রাধিকার সারি তৈরির সিনট্যাক্স হল:

অগ্রাধিকার_কিউ<টাইপ, ভেক্টর<একই রকম>, তুলনা করা>pq;

এই তাত্ক্ষণিকতার একটি উদাহরণ হল:

অগ্রাধিকার_কিউ<int, ভেক্টর<int>, কম<int> >pq;

ঘোষণার শেষে> এবং> এর মধ্যে ব্যবধান লক্ষ্য করুন। এটি >> এর সাথে বিভ্রান্তি রোধ করার জন্য। ডিফল্ট তুলনা কোড কম, যার অর্থ সর্বশ্রেষ্ঠ, এবং অগত্যা প্রথম মান নয়, প্রথমে সরানো হবে। সুতরাং, সৃষ্টি বিবৃতিটি কেবল এইভাবে লেখা যেতে পারে:

অগ্রাধিকার_কিউ<int, ভেক্টর<int> >pq;

যদি সর্বনিম্ন মানটি প্রথমে সরানো হয়, তাহলে বিবৃতিটি হতে হবে:

অগ্রাধিকার_কিউ<int, ভেক্টর<int>, বৃহত্তর<int> >pq;

গুরুত্বপূর্ণ সদস্যের কাজ

Push () ফাংশন
এই ফাংশনটি একটি মানকে ধাক্কা দেয়, যা তার যুক্তি, অগ্রাধিকার_কিউতে। এটি শূন্য ফিরে আসে। নিচের কোডটি এটিকে ব্যাখ্যা করে:

অগ্রাধিকার_কিউ<int>pq;

pqধাক্কা(10);
pqধাক্কা(30);
pqধাক্কা(বিশ);
pqধাক্কা(পঞ্চাশ);
pqধাক্কা(40);

এই অগ্রাধিকার_কিউ 10, 30, 20, 50, 40 ক্রম অনুসারে 5 টি পূর্ণসংখ্যা মান পেয়েছে। 20, 10।

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

অগ্রাধিকার_কিউ<গৃহস্থালি, ভেক্টর<গৃহস্থালি>, বৃহত্তর<int> >pq;
pqধাক্কা('প্রতি');pqধাক্কা('গ');pqধাক্কা('খ');pqধাক্কা('এবং');pqধাক্কা('ডি');

মনে রাখবেন যে একটি সদস্য ফাংশন কল করার জন্য, বস্তুর নাম একটি বিন্দু দ্বারা অনুসরণ করতে হবে, এবং তারপর ফাংশন।

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

অগ্রাধিকার_কিউ<গৃহস্থালি, ভেক্টর<গৃহস্থালি>, বৃহত্তর<int> >pq;
pqধাক্কা('প্রতি');pqধাক্কা('গ');pqধাক্কা('খ');pqধাক্কা('এবং');pqধাক্কা('ডি');
গৃহস্থালিch1=pqশীর্ষ();pqপপ();
গৃহস্থালিch2=pqশীর্ষ();pqপপ();
গৃহস্থালিch3=pqশীর্ষ();pqপপ();
গৃহস্থালিch4=pqশীর্ষ();pqপপ();
গৃহস্থালিch5=pqশীর্ষ();pqপপ();

খরচ<<ch1<<''<<ch2<<''<<ch3<<''<<ch4<<''<<ch5<<'n';

আউটপুট হল 'a' 'b' 'c' 'd' 'e'।

খালি () ফাংশন
যদি কোন প্রোগ্রামার ব্যবহার করে শীর্ষ () একটি খালি অগ্রাধিকার_কিউতে ফাংশন, সফল সংকলনের পরে, তিনি একটি ত্রুটি বার্তা পাবেন যেমন:

বিভাজন দোষ(মূল পরিত্যক্ত)

সুতরাং, ব্যবহার করার আগে সর্বদা অগ্রাধিকার সারি খালি না কিনা তা পরীক্ষা করুন শীর্ষ () ফাংশন দ্য খালি () সদস্য ফাংশন একটি বুল, সত্য, যদি সারি খালি থাকে, এবং মিথ্যা যদি সারি খালি না হয়। নিচের কোডটি এটিকে ব্যাখ্যা করে:

অগ্রাধিকার_কিউ<int>pq;
inti1= 10; inti2= 30; inti3= বিশ; inti4= পঞ্চাশ; inti5= 40;
pqধাক্কা(i1);pqধাক্কা(i2);pqধাক্কা(i3);pqধাক্কা(i4);pqধাক্কা(i5);

যখন(!pqখালি())
{
খরচ <<pqশীর্ষ() << '';
pqপপ();
}
খরচ << 'n';

অন্যান্য অগ্রাধিকার সারি ফাংশন

আকার () ফাংশন
এই ফাংশনটি অগ্রাধিকার সারির দৈর্ঘ্য প্রদান করে, যেমন নিম্নলিখিত কোডটি ব্যাখ্যা করে:

অগ্রাধিকার_কিউ<int>pq;
inti1= 10; inti2= 30; inti3= বিশ; inti4= পঞ্চাশ; inti5= 40;
pqধাক্কা(i1);pqধাক্কা(i2);pqধাক্কা(i3);pqধাক্কা(i4);pqধাক্কা(i5);

intলেন=pqআকার();
খরচ <<লেন<< 'n';

আউটপুট 5।

সোয়াপ () ফাংশন
যদি দুটি অগ্রাধিকার_কিউ একই ধরনের এবং আকারের হয়, তাহলে এই ফাংশন দ্বারা সেগুলি অদলবদল করা যাবে, যেমন নিম্নোক্ত কোড দেখায়:

অগ্রাধিকার_কিউ<int>pq1;
inti1= 10; inti2= 30; inti3= বিশ; inti4= পঞ্চাশ; inti5= 40;
pq1।ধাক্কা(i1);pq1।ধাক্কা(i2);pq1।ধাক্কা(i3);pq1।ধাক্কা(i4);pq1।ধাক্কা(i5);

অগ্রাধিকার_কিউ<int>pqA;
intএটা 1= ; intএটি 2= 3; intএটা 3= 2; intএটা 4= 5; intএটা 5= 4;
pqA।ধাক্কা(এটা 1);pqA।ধাক্কা(এটি 2);pqA।ধাক্কা(এটা 3);pqA।ধাক্কা(এটা 4);pqA।ধাক্কা(এটা 5);

pq1।বিনিময়(pqA);

যখন(!pq1।খালি())
{
খরচ <<pq1।শীর্ষ() << '';
pq1।পপ();
} খরচ<<'n';

যখন(!pqA।খালি())
{
খরচ <<pqA।শীর্ষ() << '';
pqA।পপ();
} খরচ<<'n';

আউটপুট হল:

& emsp; 5 & emsp; 4 & emsp; 3 & emsp; 2 & emsp; 1
& emsp; 50 & emsp; 40 & emsp; 30 & emsp; 20 & emsp; 10

এমপ্লেস () ফ্যাকশন
দ্য বসানো () ফাংশন পুশ ফাংশনের অনুরূপ। নিচের কোডটি এটিকে ব্যাখ্যা করে:

অগ্রাধিকার_কিউ<int>pq1;
inti1= 10; inti2= 30; inti3= বিশ; inti4= পঞ্চাশ; inti5= 40;
pq1।স্থাপন করা(i1);pq1।স্থাপন করা(i2);pq1।স্থাপন করা(i3);pq1।স্থাপন করা(i4);pq1।স্থাপন করা(i5);

যখন(!pq1।খালি())
{
খরচ <<pq1।শীর্ষ() << '';
pq1।পপ();
} খরচ<<'n';

আউটপুট হল:

50 40 30 20 10

স্ট্রিং ডেটা

স্ট্রিংগুলির তুলনা করার সময়, স্ট্রিং ক্লাসটি ব্যবহার করা উচিত এবং স্ট্রিং লিটারেলের সরাসরি ব্যবহার নয় কারণ এটি পয়েন্টারগুলির তুলনা করবে এবং প্রকৃত স্ট্রিংগুলির সাথে নয়। নিচের কোডটি দেখায় কিভাবে স্ট্রিং ক্লাস ব্যবহার করা হয়:

#অন্তর্ভুক্ত
অগ্রাধিকার_কিউ<স্ট্রিং>pq1;
স্ট্রিং s1=স্ট্রিং('কলম'), s2=স্ট্রিং('পেন্সিল'), s3=স্ট্রিং('অনুশীলনের বই'), s4=স্ট্রিং('পাঠ্য বই'), s5=স্ট্রিং('শাসক');

pq1।ধাক্কা(s1);pq1।ধাক্কা(s2);pq1।ধাক্কা(s3);pq1।ধাক্কা(s4);pq1।ধাক্কা(s5);
যখন(!pq1।খালি())
{
খরচ <<pq1।শীর্ষ() << '';
pq1।পপ();
} খরচ<<'n';

আউটপুট হল:

& emsp; পাঠ্য বই & emsp; শাসক & emsp; পেন্সিল & emsp; কলম & emsp; ব্যায়াম বই

অন্যান্য অগ্রাধিকার সারি নির্মাণ

একটি ভেক্টর থেকে স্পষ্ট সৃষ্টি
একটি ভেক্টর থেকে স্পষ্টভাবে একটি অগ্রাধিকার সারি তৈরি করা যেতে পারে যেমন নিম্নলিখিত কোডটি দেখায়:

#অন্তর্ভুক্ত
ভেক্টর<int>vtr= {10,30,বিশ,পঞ্চাশ,40};

অগ্রাধিকার_কিউ<int>pq(vtrশুরু(), vtrশেষ());

যখন(!pqখালি())
{
খরচ <<pqশীর্ষ() << '';
pqপপ();
} খরচ<<'n';

আউটপুট হল: 50 40 30 20 10. এই সময়, ভেক্টর হেডারটিও অন্তর্ভুক্ত করতে হবে। কনস্ট্রাক্টর ফাংশনের আর্গুমেন্টগুলি ভেক্টরের শুরু এবং শেষ পয়েন্টার নেয়। ভেক্টরের জন্য ডাটা টাইপ এবং অগ্রাধিকার_কিউ এর ডাটা টাইপ একই হতে হবে।

ন্যূনতম মানকে অগ্রাধিকার দেওয়ার জন্য, নির্মাতার জন্য ঘোষণাটি হবে:

অগ্রাধিকার_কিউ<int, ভেক্টর<int>, বৃহত্তর>int> >pq(vtrশুরু(), vtrশেষ());

একটি অ্যারে থেকে স্পষ্ট সৃষ্টি
একটি অ্যারে থেকে স্পষ্টভাবে একটি অগ্রাধিকার সারি তৈরি করা যেতে পারে যেমন নিম্নলিখিত কোডটি দেখায়:

intআগমন[] = {10,30,বিশ,পঞ্চাশ,40};

অগ্রাধিকার_কিউ<int>pq(arr, arr+5);

যখন(!pqখালি())
{
খরচ <<pqশীর্ষ() << '';
pqপপ();
} খরচ<<'n';

আউটপুট হল: 50 40 30 20 10. কনস্ট্রাক্টর ফাংশনের আর্গুমেন্টগুলি অ্যারের শুরু এবং শেষ পয়েন্টার নেয়। arr স্টার্ট পয়েন্টার রিটার্ন করে, arr+5 অ্যারের ঠিক আগে পয়েন্টার রিটার্ন করে, আর 5 হচ্ছে অ্যারের সাইজ। অ্যারের জন্য ডাটা টাইপ এবং অগ্রাধিকার_কিউ এর ডাটা টাইপ একই হতে হবে।

ন্যূনতম মানকে অগ্রাধিকার দেওয়ার জন্য, নির্মাতার জন্য ঘোষণাটি হবে:

অগ্রাধিকার_কিউ<int, ভেক্টর<int>, বৃহত্তর<int> >pq(arr, arr+5);

দ্রষ্টব্য: C ++ এ, অগ্রাধিকার_কিউ আসলে একটি অ্যাডাপ্টার বলা হয়, শুধু একটি ধারক নয়।

কাস্টম তুলনা কোড

অগ্রাধিকার সারিতে আরোহণ বা সমস্ত অবতরণের সমস্ত মান থাকা অগ্রাধিকার সারির একমাত্র বিকল্প নয়। উদাহরণস্বরূপ, সর্বাধিক গাদা জন্য 11 পূর্ণসংখ্যার একটি তালিকা হল:

88, 86, 87, 84, 82, 79,74, 80, 81, 64, 69

সর্বোচ্চ মান হল 88. এর পরে দুটি সংখ্যা রয়েছে: 86 এবং 87, যা 88 এর চেয়ে কম। বাকি সংখ্যাগুলি এই তিনটি সংখ্যার চেয়ে কম, কিন্তু প্রকৃত অর্থে নয়। তালিকায় দুটি খালি ঘর রয়েছে। 84 এবং 82 সংখ্যা 86 এর চেয়ে কম। 79 এবং 74 সংখ্যা 87 এর চেয়ে কম। 80 এবং 81 সংখ্যা 84 এর চেয়ে কম। 64 এবং 69 সংখ্যা 79 এর চেয়ে কম।

সংখ্যাগুলির বসানো সর্বাধিক গাদা মানদণ্ড অনুসরণ করে-পরে দেখুন। অগ্রাধিকার_কিউ এর জন্য এই ধরনের একটি স্কিম প্রদানের জন্য, প্রোগ্রামারকে তার নিজের তুলনা কোড প্রদান করতে হবে - পরে দেখুন।

উপসংহার

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