নীচের উত্তরটি 'প্রতারণা', এটি অপারেশনগুলির মধ্যে কোনও স্থান ব্যবহার না করে অপারেশনগুলি স্থানের চেয়ে বেশি ব্যবহার করতে পারে । এমন কোনও উত্তরের জন্য এই থ্রেডের অন্য কোথাও দেখুন thatO(1)
আপনার সঠিক প্রশ্নের উত্তর আমার কাছে না থাকলেও আমি একটি অ্যালগরিদম পেয়েছি যা সময়ে পরিবর্তে কাজ করে । আমি বিশ্বাস করি এটি শক্ত, যদিও আমার কাছে প্রমাণ নেই। যদি কিছু হয় তবে অ্যালগরিদম দেখায় যে নিম্ন সীমাটি প্রমাণ করার চেষ্টা করা বৃথা, তাই এটি আপনার প্রশ্নের উত্তর দিতে সহায়তা করতে পারে।ও(এন)ও(এন)O(n−−√)O(n)O(n)
আমি দুটি অ্যালগরিদম উপস্থাপন করছি, প্রথমটি হ'ল একটি সাধারণ অ্যালগরিদম পপের জন্য একটি চলমান সময় এবং দ্বিতীয়টি পপের জন্য ও চলমান সময় সহ। আমি প্রথমটির বর্ণনাটি মূলত তার সরলতার কারণে করি যাতে দ্বিতীয়টি বোঝা সহজ হয়।ও ( √ )O(n)O(n−−√)
আরও বিশদ দেওয়ার জন্য: প্রথমটিতে কোনও অতিরিক্ত স্থান ব্যবহার করে না, এর মধ্যে একটি সবচেয়ে খারাপ কেস (এবং amorised) পুশ এবং একটি সবচেয়ে খারাপ কেস (এবং amorised) পপ রয়েছে, তবে সবচেয়ে খারাপ ক্ষেত্রে আচরণটি সর্বদা ট্রিগার হয় না। যেহেতু এটি দুটি সারি ছাড়িয়ে কোনও অতিরিক্ত স্থান ব্যবহার করে না, রস স্নাইডারের প্রস্তাবিত সমাধানের চেয়ে এটি কিছুটা 'ভাল'।ও ( এন )O(1)O(n)
দ্বিতীয়টিতে একটি একক পূর্ণসংখ্যার ক্ষেত্র (সুতরাং অতিরিক্ত স্থান) ব্যবহার করা হয়, এতে একটি সবচেয়ে খারাপ পরিস্থিতি (এবং মোড়কৃত) পুশ এবং একটি পল্লবিত করা হয়। এটি চলমান সময়টি 'সহজ' পদ্ধতির চেয়ে উল্লেখযোগ্যভাবে ভাল, তবুও এটি কিছু অতিরিক্ত জায়গা ব্যবহার করে।ও ( 1 ) ও ( √ )O(1)O(1)O(n−−√)
প্রথম অ্যালগরিদম
আমাদের দুটি সারি রয়েছে: সারিতে এবং সারি । হবে আমাদের 'পুশ কিউ', এবং ইতিমধ্যে 'স্ট্যাক ক্রম' এ থাকা সারি হবে।s e c o n d f i r s t s e c o n dfirstsecondfirstsecond
- পুশ করা সহজভাবে প্যারামিটারটি সারিবদ্ধ করেই করা হয় ।first
- পপিং নিম্নলিখিত হিসাবে সম্পন্ন করা হয়। যদি খালি থাকে, আমরা কেবল প্রাপ্য করে ফলাফলটি ফিরিয়ে দেব । অন্যথায়, আমরা বিপরীত , থেকে সমস্ত সংযোজন এবং এবং অদলবদল । তারপরে আমরা স্থানটি প্রেরণ করি এবং শিরোনামের ফলাফলটি ফিরিয়ে দেব।গুলি ই গ ণ এন ঘ চ আমি r গুলি টি গুলি ই গ ণ এন ঘ চ আমি r গুলি টন চ আমি r গুলি টি গুলি ই গ ণ এন ঘ গুলি ই গ ণ এন ঘfirstsecondfirstsecondfirstfirstsecondsecond
প্রথম অ্যালগরিদমের জন্য সি # কোড
আপনি এটি আগে কখনও সি # না দেখলেও এটি বেশ পঠনযোগ্য হতে পারে। জেনেরিক কী তা যদি আপনি না জানেন তবে কেবল স্ট্রিংয়ের জন্য স্ট্রিংয়ের জন্য আপনার মনে 'স্ট্রিং' দিয়ে 'টি' এর সমস্ত উদাহরণ প্রতিস্থাপন করুন।
public class Stack<T> {
private Queue<T> first = new Queue<T>();
private Queue<T> second = new Queue<T>();
public void Push(T value) {
first.Enqueue(value);
}
public T Pop() {
if (first.Count == 0) {
if (second.Count > 0)
return second.Dequeue();
else
throw new InvalidOperationException("Empty stack.");
} else {
int nrOfItemsInFirst = first.Count;
T[] reverser = new T[nrOfItemsInFirst];
// Reverse first
for (int i = 0; i < nrOfItemsInFirst; i++)
reverser[i] = first.Dequeue();
for (int i = nrOfItemsInFirst - 1; i >= 0; i--)
first.Enqueue(reverser[i]);
// Append second to first
while (second.Count > 0)
first.Enqueue(second.Dequeue());
// Swap first and second
Queue<T> temp = first; first = second; second = temp;
return second.Dequeue();
}
}
}
বিশ্লেষণ
অবশ্যই পুশ সময়ে কাজ করে works পপ এবং অভ্যন্তরে সমস্ত কিছু স্পর্শ করতে পারে ধীরে ধীরে কয়েকবার, তাই আমাদের সবচেয়ে খারাপ অবস্থায় রয়েছে। অ্যালগরিদম এই আচরণটি প্রদর্শন করে (উদাহরণস্বরূপ) যদি কেউ উপাদানগুলিকে স্ট্যাকের দিকে ঠেলে দেয় এবং তারপরে বারবার একটি সাইন পুশ এবং ক্রমাগত একক পপ অপারেশন করে।O(1)firstsecondO(n)n
দ্বিতীয় অ্যালগরিদম
আমাদের দুটি সারি রয়েছে: সারিতে এবং সারি । হবে আমাদের 'পুশ কিউ', এবং ইতিমধ্যে 'স্ট্যাক ক্রম' এ থাকা সারি হবে।firstsecondfirstsecond
এই প্রথম অ্যালগরিদম, যা আমরা অবিলম্বে 'এলোমেলো' বিষয়বস্তু না একজন অভিযোজিত সংস্করণ মধ্যে । পরিবর্তে, যদি তুলনায় উপাদানের একটি যথেষ্ট সংখ্যা উপস্থিত রয়েছে (যথা উপাদানের সংখ্যা বর্গমূল ), আমরা শুধুমাত্র পুনঃসংগঠিত স্ট্যাক অর্ডার মধ্যে এবং সঙ্গে এটি একত্রীকরণ না ।firstsecondfirstsecondsecondfirstsecond
- পুশিংটি এখনও প্যারামিটারটি সহজভাবে তৈরি করেই করা হয় ।first
- পপিং নিম্নলিখিত হিসাবে সম্পন্ন করা হয়। যদি খালি থাকে, আমরা কেবল প্রাপ্য করে ফলাফলটি ফিরিয়ে দেব । অন্যথায়, আমরা সামগ্রীর পুনর্গঠন করি যাতে তারা স্ট্যাক ক্রমে থাকে। যদি আমরা কেবল প্রাপ্য এবং ফলাফলটি ফিরিয়ে দিই । অন্যথায়, আমরা দিকে সংযোজন , এবং অদলবদল , শিরোনাম এবং ফলাফল ফিরে।firstsecondfirst|first|<|second|−−−−−−−√firstsecondfirstfirstsecondsecond
প্রথম অ্যালগরিদমের জন্য সি # কোড
আপনি এটি আগে কখনও সি # না দেখলেও এটি বেশ পঠনযোগ্য হতে পারে। জেনেরিক কী তা যদি আপনি না জানেন তবে কেবল স্ট্রিংয়ের জন্য স্ট্রিংয়ের জন্য আপনার মনে 'স্ট্রিং' দিয়ে 'টি' এর সমস্ত উদাহরণ প্রতিস্থাপন করুন।
public class Stack<T> {
private Queue<T> first = new Queue<T>();
private Queue<T> second = new Queue<T>();
int unsortedPart = 0;
public void Push(T value) {
unsortedPart++;
first.Enqueue(value);
}
public T Pop() {
if (first.Count == 0) {
if (second.Count > 0)
return second.Dequeue();
else
throw new InvalidOperationException("Empty stack.");
} else {
int nrOfItemsInFirst = first.Count;
T[] reverser = new T[nrOfItemsInFirst];
for (int i = nrOfItemsInFirst - unsortedPart - 1; i >= 0; i--)
reverser[i] = first.Dequeue();
for (int i = nrOfItemsInFirst - unsortedPart; i < nrOfItemsInFirst; i++)
reverser[i] = first.Dequeue();
for (int i = nrOfItemsInFirst - 1; i >= 0; i--)
first.Enqueue(reverser[i]);
unsortedPart = 0;
if (first.Count * first.Count < second.Count)
return first.Dequeue();
else {
while (second.Count > 0)
first.Enqueue(second.Dequeue());
Queue<T> temp = first; first = second; second = temp;
return second.Dequeue();
}
}
}
}
বিশ্লেষণ
অবশ্যই পুশ সময়ে কাজ করে worksO(1)
পপ মোড়িত সময়ে কাজ করে। দুটি ক্ষেত্রে আছে: যদি , তারপরে আমরা স্ট্যাক অর্ডারে স্থানান্তরিত করব । যদি , তারপরে অবশ্যই আমাদের কমপক্ষে ush পুশের জন্য কল করা উচিত। অতএব, আমরা কেবল প্রতি কেস পুশ এবং পপকে এই আঘাত করতে পারি । এই ক্ষেত্রে আসল চলমান সময় হ'ল , সুতরাং অনুপাতের সময়টি হ'ল rac ।O(n−−√)|first|<|second|−−−−−−−√firstO(|first|)=O(n−−√)|first|≥|second|−−−−−−−√n−−√n−−√O(n)O(nn√)=O(n−−√)
চূড়ান্ত নোট
পপকে সমস্ত কাজ করার পরিবর্তে প্রতি কলটিতে পুনর্গঠিত করে পপ- ক্রিয়াকলাপ তৈরি করে অতিরিক্ত ভেরিয়েবলটি নির্মূল করা সম্ভব ।O(n−−√)first