কেবল পঠনযোগ্য স্ট্যাক ব্যবহার করে বাছাই করা


14

নিম্নলিখিত সেটিংটি বিবেচনা করুন:

  • আমরা একটি স্ট্যাক দেওয়া হয় s যা রয়েছে n আইটেম।
  • আমরা অতিরিক্ত স্ট্যাকের একটি ধ্রুবক O(1) সংখ্যা ব্যবহার করতে পারি ।
  • আমরা এই স্ট্যাকগুলিতে নিম্নলিখিত ক্রিয়াকলাপগুলি প্রয়োগ করতে পারি:
    1. একটি স্ট্যাক খালি আছে কিনা তা পরীক্ষা করুন
    2. দুটি স্ট্যাকের শীর্ষ আইটেমগুলি তুলনা করুন,
    3. একটি স্ট্যাকের শীর্ষ আইটেম মুছুন,
    4. একটি স্ট্যাকের উপরের আইটেমটি মুদ্রণ করুন,
    5. স্ট্যাকের শীর্ষ আইটেমটি অন্য স্ট্যাকে অনুলিপি করুন,
    6. একটি স্ট্যাকের সামগ্রীটিকে অন্য স্ট্যাকে অনুলিপি করুন।

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

O(n2) তুলনা দিয়ে স্ট্যাকগুলি বাছাই করার জন্য এখানে একটি অ্যালগরিদম রয়েছে :

last := empty
for i from 1 to n
  min := empty
  w := s
  while w is not empty
    if w.top > last and w.top < min
      min := w.top
    delete w.top
  print min
  last := min

আমরা কি আরও ভাল করতে পারি?

এমন কোনও প্রোগ্রাম রয়েছে যা কেবলমাত্র O(nlogn) তুলনা ব্যবহার করে স্ট্যাকের আইটেমগুলির সাজানো তালিকা প্রিন্ট করে ?


2
মনে হচ্ছে রেজিস্ট্রিরা স্ট্যাকের মতো আচরণ করে? মনে হচ্ছে আপনি ধাক্কা এবং পপ অপারেশন সম্পর্কে কথা বলছেন। এটা কি আপনার প্রশ্ন? আপনি কয়েকটি স্ট্যাক এবং স্ট্যাক অপারেশন ব্যবহার করে একটি স্ট্যাককে কীভাবে সাজান?
আতুরস্যামস

2
সঙ্গে রেজিস্টার আপনি পারেন: শুধু যে এক নম্বর রেজিস্টার (রাখা হে ( ) ) এবং তারপর একটি স্বাভাবিক বাছাই আলগোরিদিম (প্রযোজ্য হে ( এলজি এন ) )। nO(n)O(nlgn)
কাভেহ

1
আপনি রেজিস্টার ব্যবহার করতে চান ? নাহলে সমস্যাটি তুচ্ছ করে, যেমনটি কাভে মন্তব্য করেছেন। O(1)
যুবাল ফিল্ম

1
আপনি স্বাগত জানাই। আমি ভেবেছিলাম যে আমাদের কেবল একটি নয়, বেশ কয়েকটি স্ট্যাক দেওয়া হয়েছে, আমি এটি ঠিক করব।
কাভেঃ

2
@ কাপ্পা, আপনি কি নিশ্চিত যে এই দেখার জন্য ব্যবহার করা যেতে পারে? আকারের হারানো কোনও সালমানের চেয়ে বড় আকারের 1 টি রাখতে পারি না you আপনার কি বাছাই করা ব্লকগুলি সংরক্ষণ করার দরকার নেই?
কাভেঃ

উত্তর:


1

আমি মনে করি যে আমি এখন একটি অনানুষ্ঠানিক নিম্ন সীমানা প্রদর্শন করতে পারি। ধারণাটি হ'ল তুলনামূলক শাখা কর্মসূচীর পরিবারের সাথে এই জাতীয় কোনও প্রোগ্রাম বাস্তবায়ন করা। 'কেবল পঠনযোগ্য' অনুমানের অর্থ হ'ল আমাদের শাখা প্রশাখার প্রোগ্রামগুলির পরিবার অল্প, অর্থাত্ , স্পেস ব্যবহার করে। তারপরে আমরা নীচে সীমাবদ্ধ এস টি = Ω ( এন 2 ) প্রয়োগ করি বোরোডিন এট আল দ্বারা প্রমাণিত। "অ-বিস্মৃত যন্ত্রগুলিতে বাছাইয়ের জন্য একটি সময়-স্পেস ট্রেড অফ" in এটি আমাদেরকে একটি এন 2 / লগ এন সময়ের জন্য নিম্ন সীমাবদ্ধ করে।O(logn)ST=Ω(n2)n2/logn

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

ধরুন আমাদের রেজিস্টার প্রোগ্রামে কোড এবং কে রেজিস্টারগুলির লাইন রয়েছে , এক্স 1 , , এক্স কেkX1,,Xk

ঠিক করা । আমরা নীচে n দৈর্ঘ্যের স্ট্রিংগুলির জন্য তুলনা শাখা প্রোগ্রাম তৈরি করি । প্রতিটি টিপল ( i , d 1 , , d কে ) এর জন্য একটি নোড তৈরি করুন যেখানে 1 i এবং 0 d 1 , , ডি কেএন । ধারণাটি হ'ল, রেজিস্টার মেশিনে গণনাগুলি ব্রাঞ্চিং প্রোগ্রামের পাথের সাথে সামঞ্জস্যপূর্ণ এবং আমরা নোডে আছি ( i , d 1 , , d)nn(i,d1,,dk)1i0d1,,dkn যদি আমরা লাইনে আছেন আমি রেজিস্টার মেশিন এবং স্ট্রিং সঞ্চিত দৈর্ঘ্য এক্স আমি হয়আমি । এখন, আমাদের ব্রাঞ্চিং প্রোগ্রামের নির্দেশিত প্রান্তগুলি নির্ধারণ করতে হবে(i,d1,,dk)iXidi

লাইন যদি ফর্ম হয়i

যদি তারপর এতে যান আমি 1 আর এতে যান আমি 2Xu<Xvi1i2

তারপরে সমস্ত , নোডের জন্য ( i , d 1 , , d কে ) ইনপুটটির d u -th এবং d v -th উপাদানটির তুলনা করে লেবেলযুক্ত এবং "সত্য" প্রান্তে যেতে হবে ( i 1 , d 1 , , d কে ) এবং "মিথ্যা" প্রান্তটি ( i 2 , d 1 , , d k)d1,,dk(i,d1,,dk)dudv(i1,d1,,dk)(i2,d1,,dk)

লাইন যদি ফর্ম হয়i

, এতে যান লাইন আমি 'X1tail(X2)i

তারপরে যে কোনও নোড থেকে ( i , d 2 - 1 , , ডি কে ) থেকে একটি তীর রয়েছে ।(i,d1,,dk)(i,d21,,dk)

লাইন যদি ফর্ম হয়i

, এতে যান লাইন আমি 'print(head(Xu))i

তারপরে যে কোনও নোড থেকে ( i , d 1 , , d কে ) থেকে একটি তীর রয়েছে যা ইনপুটটির ডি ইউ- নথ দ্বারা লেবেলযুক্ত রয়েছে ।(i,d1,,dk)(i,d1,,dk)du

আশা করি এই উদাহরণগুলি স্পষ্ট করে দিয়েছে যে আমি কীভাবে আমার শাখা প্রশাখার প্রোগ্রামটি তৈরির পরিকল্পনা করি। সব কিছু বলা এবং হয়ে গেলে, এই শাখাগুলি প্রোগ্রামটিতে সর্বাধিক নোড থাকে, সুতরাং এতে স্পেস ( লগ এন ) থাকেnkO(logn)


0

আপনি উপাদান গণনা করতে সক্ষম? তারপরে, আমি মনে করি, এখানে মোটামুটি সহজ Mergesort বাস্তবায়ন রয়েছে। আপনি যদি স্ট্যাকের উপর অতিরিক্ত চিহ্ন স্থাপন করতে সক্ষম হন তবে আপনি এটি 3 টি স্ট্যাকের সাহায্যে সমাধান করতে পারেন:

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

সমস্ত ক্রিয়াকলাপ লিনিয়ার সময় ব্যয় করে, সুতরাং আমরা ( n লগ এন ) এ তালিকাটি বাছাই করেছিO(nlogn)

(নোট, যে আমরা আকারের স্ট্যাকগুলি প্রয়োজন কারণ বিচ্ছেদ চিহ্ন, কিন্তু এই সহজে অন্য স্ট্যাক ব্যবহার করে সংশোধন করা যেতে পারে)nlogn


যেহেতু আপনি স্ট্যাকের উপর নতুন উপাদান রাখতে পারবেন না আপনি বিচ্ছেদ পয়েন্টগুলিতে সমস্যা পেতে পারেন। এটি সমাধানের জন্য আপনি কয়েকটি অতিরিক্ত স্ট্যাকের সাহায্যে নিম্নলিখিতটি করতে পারেন:

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

শেষ অবধি অতিরিক্ত উপাদানগুলির সাথে প্রক্রিয়াটি বেশিরভাগ সময়ে পুনরাবৃত্তি করুন এবং লিনিয়ার সময়ে তাদের মূল স্ট্যাকের সাথে একীভূত করুন। স্ট্যাকগুলি খরচ বাছাই কিছু ধ্রুবক জন্য, , সর্বাধিক N লগ ইন করুন এন + + এনlognccnlogn+cn2logn2+cn4logn4+ ...=O(nlogn)O(nlogn)


আমি নিশ্চিত নই যে আমি বুঝেছি. আমরা যখন কোনও উপাদানকে কখনই কোনও স্ট্যাকের দিকে ঠেলে দিতে পারি না, আমরা কীভাবে, উদাহরণস্বরূপ, বিপরীত ক্রমে স্ট্যাকের উপরের অর্ধেকটি অনুলিপি করতে পারি?
সিদ্ধার্থ

আমরা কোনও নতুন উপাদান একটি স্ট্যাকের দিকে ঠেলাতে পারি না, তবে 5 অনুসারে আমরা একটি স্ট্যাকের শীর্ষ উপাদানটিকে অন্যটিতে ঠেলাতে সক্ষম হয়েছি। সুতরাং স্ট্যাকটি বিপরীত ক্রমে অনুলিপি করতে বেশিরভাগ রৈখিক সময়ে প্রয়োজন। সুতরাং আমি মনে করি, আপনি যা চেয়েছিলেন তা ছিল না?
cero

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