আসুন ধরে নেওয়া যাক আমরা যে স্ট্যাকের উপর কাজ করব তা হ'ল:
6 , minvalue=2
2 , minvalue=2
5 , minvalue=3
3 , minvalue=3
9 , minvalue=7
7 , minvalue=7
8 , minvalue=8
উপরের উপস্থাপনায় স্ট্যাকটি কেবলমাত্র বাম মানের দ্বারা নির্মিত হয় [মানচিত্র] কেবল চিত্রণমূলক উদ্দেশ্যে লেখা হয় যা একটি ভেরিয়েবলে সংরক্ষণ করা হবে।
আসল সমস্যাটি হ'ল যখন মানটি যা ন্যূনতম মান হয় সেই সময়ে সরিয়ে ফেলা হয় আমরা কীভাবে জানতে পারি যে স্ট্যাকের উপরে পুনরাবৃত্তি না করে পরবর্তী ন্যূনতম উপাদানটি কী।
উদাহরণস্বরূপ আমাদের স্ট্যাকের 6 টি যখন পপড হয় তখন আমরা জানি যে এটি ন্যূনতম উপাদান নয় কারণ ন্যূনতম উপাদান 2, তাই আমরা আমাদের ন্যূনতম মানটি আপডেট না করে নিরাপদে এটিকে সরাতে পারি।
তবে আমরা যখন 2 পপ করি তখন আমরা দেখতে পাই যে এখনই সর্বনিম্ন মান 2 হয় এবং যদি এটি পপআপ হয়ে যায় তবে আমাদের ন্যূনতম মানটি 3 এ আপডেট করতে হবে।
Point1:
এখন আপনি যদি সাবধানে পর্যবেক্ষণ করেন তবে আমাদের এই বিশেষ অবস্থা [2, মিনাল্যু = 2] থেকে মিনিভ্যালু = 3 উত্পন্ন করতে হবে। অথবা আপনি যদি স্ট্যাকটি ডিপারিনে যান তবে আমাদের এই বিশেষ রাজ্য থেকে আমাদের ন্যূনতম = 7 উত্পন্ন করতে হবে [3, মিনিভ্যালু = 3] অথবা আপনি যদি স্ট্যাকের আরও বেশি ডিপারে যান তবে আমাদের এই বিশেষ অবস্থা থেকে মিনিভ্যালু = 8 উত্পন্ন করতে হবে [7, মিনিভ্যালু = 7]
উপরোক্ত 3 টি ক্ষেত্রে আপনি কি সাধারণ কিছু লক্ষ্য করেছেন যে আমাদের যে মানটি তৈরি করতে হবে তা দুটি ভেরিয়েবলের উপর নির্ভর করে যা উভয় সমান। সঠিক। কেন এমনটি হচ্ছে কারণ যখন আমরা যখন কিছু উপাদানকে বর্তমানের মিনিমালুতে আরও ছোট করি তখন আমরা মূলত সেই উপাদানটিকে স্ট্যাকের মধ্যে ধাক্কা দিয়ে দেখি এবং একই সংখ্যাকে মিনিভ্যালুতে আপডেটও করি।
Point2:
সুতরাং আমরা মূলত একই সংখ্যার সদৃশ একবার স্ট্যাক এবং একবার মিনাল্যু ভেরিয়েবল সংরক্ষণ করি। আমাদের এই অনুলিপি এড়ানোর উপর দৃষ্টি নিবদ্ধ করা এবং উপরের CASES হিসাবে প্রদর্শিত আগের ন্যূনতম উত্পন্ন করতে স্ট্যাক বা মিনিভ্যালুতে দরকারী কিছু ডেটা সংরক্ষণ করতে হবে।
আসুন আমরা কী স্ট্যাকে সঞ্চয় করব সেদিকে মনোনিবেশ করা যাক যখন ধাক্কায় রাখার জন্য মানটি কম দামের চেয়ে কম থাকে। আসুন এই ভেরিয়েবলটির নাম দিন, সুতরাং এখন আমাদের স্ট্যাকটি এরকম কিছু দেখাবে:
6 , minvalue=2
y1 , minvalue=2
5 , minvalue=3
y2 , minvalue=3
9 , minvalue=7
y3 , minvalue=7
8 , minvalue=8
তাদের সকলেরই একই মূল্য থাকবে এমন বিভ্রান্তি এড়াতে আমি তাদের নামকরণ করেছি y1, y2, y3।
Point3:
এখন যাক y1, y2 এবং y3 এর কিছু বাধা খুঁজে পাওয়ার চেষ্টা করি। আপনার কি মনে আছে ঠিক কখন পপ () করার সময় আমাদের মিনিভ্যালুটি আপডেট করতে হবে, কেবল তখনই যখন আমরা অ্যালুমেন্টের সমতুল্য উপাদানটি পপ করি। আমরা যদি মিনাল্যু থেকে বড় কিছু পপ করি তবে আমাদের নূন্যতম আপডেট করতে হবে না। সুতরাং ন্যূনতমের আপডেটটি ট্রিগার করতে, y1, y2 এবং y3 এর তুলনায় এটি যথাযথ মাইনাল্যু থেকে ছোট হওয়া উচিত [[সদৃশ [এটিকে পয়েন্ট 2] এড়ানোর জন্য আমরা সমতা উপভোগ করছি যাতে সীমাবদ্ধতা [y <minValue] হয়।
এখন y তে ফিরে আসা যাক, আমাদের কিছু ধরণের মান উত্পন্ন করতে হবে এবং ধাক্কা দেওয়ার সময় y স্থাপন করা উচিত, মনে রাখবেন। এক্স হিসাবে ধাক্কা দেওয়ার জন্য যে মানটি আসছে তা গ্রহণ করুন যা পূর্বপরিচয়টি কম, এবং আমরা যে মানটিকে স্ট্যাকের জন্য y বলে ধাক্কা দেব। সুতরাং একটি জিনিস সুস্পষ্ট যে newMinValue = x, এবং y <newMinvalue।
এখন আমাদের y ক্যালুলেট করতে হবে (মনে রাখবেন y যে কোনও সংখ্যা হতে পারে যা নিউমিনভ্যালু (এক্স) এর চেয়ে কম) সুতরাং আমাদের অ্যাডমিনালিউ এবং এক্স (নিউমিনাল্যু) এর সাহায্যে এমন কিছু সংখ্যক সন্ধান করা দরকার যা আমাদের সীমাবদ্ধতা পূরণ করতে পারে)।
Let's do the math:
x < prevMinvalue [Given]
x - prevMinvalue < 0
x - prevMinValue + x < 0 + x [Add x on both side]
2*x - prevMinValue < x
this is the y which we were looking for less than x(newMinValue).
y = 2*x - prevMinValue. 'or' y = 2*newMinValue - prevMinValue 'or' y = 2*curMinValue - prevMinValue [taking curMinValue=newMinValue].
তাই x ধাকানোর সময় যদি এটি পূর্বমিনালুয়ের চেয়ে কম হয় তবে আমরা y [2 * x-prevMinValue] টিপুন এবং newMinValue = x আপডেট করি।
এবং পপ করার সময় যদি স্ট্যাকটিতে মিনিভ্যালু থেকে কিছু কম থাকে তবে এটি মিনিভ্যালু আপডেট করার জন্য আমাদের ট্রিগার। আমাদের curMinValue এবং y থেকে prevMinValue গণনা করতে হবে। y = 2 * curMinValue - prevMinValue [প্রমাণিত] prevMinVAlue = 2 * curMinvalue - y।
2 * কারমিনভ্যালু - y হল সেই সংখ্যাটি যা আমাদের এখনই প্রিপমিনভ্যালুতে আপডেট করতে হবে।
একই যুক্তির জন্য কোড নীচে ও (1) সময় এবং ও (1) স্থান জটিলতার সাথে ভাগ করা হয়েছে।
// C++ program to implement a stack that supports
// getMinimum() in O(1) time and O(1) extra space.
#include <bits/stdc++.h>
using namespace std;
// A user defined stack that supports getMin() in
// addition to push() and pop()
struct MyStack
{
stack<int> s;
int minEle;
// Prints minimum element of MyStack
void getMin()
{
if (s.empty())
cout << "Stack is empty\n";
// variable minEle stores the minimum element
// in the stack.
else
cout <<"Minimum Element in the stack is: "
<< minEle << "\n";
}
// Prints top element of MyStack
void peek()
{
if (s.empty())
{
cout << "Stack is empty ";
return;
}
int t = s.top(); // Top element.
cout << "Top Most Element is: ";
// If t < minEle means minEle stores
// value of t.
(t < minEle)? cout << minEle: cout << t;
}
// Remove the top element from MyStack
void pop()
{
if (s.empty())
{
cout << "Stack is empty\n";
return;
}
cout << "Top Most Element Removed: ";
int t = s.top();
s.pop();
// Minimum will change as the minimum element
// of the stack is being removed.
if (t < minEle)
{
cout << minEle << "\n";
minEle = 2*minEle - t;
}
else
cout << t << "\n";
}
// Removes top element from MyStack
void push(int x)
{
// Insert new number into the stack
if (s.empty())
{
minEle = x;
s.push(x);
cout << "Number Inserted: " << x << "\n";
return;
}
// If new number is less than minEle
if (x < minEle)
{
s.push(2*x - minEle);
minEle = x;
}
else
s.push(x);
cout << "Number Inserted: " << x << "\n";
}
};
// Driver Code
int main()
{
MyStack s;
s.push(3);
s.push(5);
s.getMin();
s.push(2);
s.push(1);
s.getMin();
s.pop();
s.getMin();
s.pop();
s.peek();
return 0;
}