বইয়ের স্ট্যাক বাছাই


21

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

উদাহরণস্বরূপ, বলুন একটি বইয়ের মাত্রা রয়েছে (10,15)এবং অন্যটির রয়েছে মাত্রা (11,14)। আমি তাদের যেদিকেই রেখেছি তা বিবেচনা করেই নয়, আমি একটি ওভারহান পেয়েছি। তবে আমার যদি ডাইমেনশন সহ বই আছে (4,3)এবং (5,6), আমি পূর্বেরটির নীচের অংশটি রেখে অতিরিক্ত চাপ এড়াতে পারি।

এই চ্যালেঞ্জের উদ্দেশ্যে আমরা কেবলমাত্র নীচের বইয়ের সাথে সম্পর্কিত ওভারহ্যাঙ্গগুলি বিবেচনা করব । যেমন আমি যদি একটি স্ট্যাক আছে (5,5), (3,3), (4,4)(যে কোন বিবেকী ব্যক্তির তা করতে হবে না), একটি ত্রিশঙ্কু যেমন উপরের বই গন্য, যদিও এটি নীচে বই অতিক্রম প্রসারিত করে না। একইভাবে, স্ট্যাক (3,3), (3,3), (4,4)শুধু এক ত্রিশঙ্কু, শীর্ষ বই নীচে এক পরলোক ব্যাপ্ত সত্ত্বেও হয়েছে।

চ্যালেঞ্জ

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

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

আপনি কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন, STDIN, ARGV বা ফাংশন আর্গুমেন্টের মাধ্যমে কোনও সুবিধাজনক (প্রাকপ্রসেসড নয়) তালিকার ফর্ম্যাটে ইনপুট নিতে পারেন এবং ফলটি মুদ্রণ বা ফিরে আসতে পারেন।

এটি কোড গল্ফ, তাই সংক্ষিপ্ত উত্তরটি (বাইটে) জেতে।

আমি আত্মবিশ্বাসী যে একটি বহুপদী-সমাধান বিদ্যমান, তবে আপনি যদি আমাকে ভুল প্রমাণ করতে পারেন তবে আপনি গল্ফযুক্ত জমা দেওয়ার পরিবর্তে এই জাতীয় প্রমাণ জমা দিতে পারেন। এই ক্ষেত্রে, আপনি P ≠ NP ধরে নিতে পারেন । আমি এই জাতীয় প্রথম সঠিক প্রমাণ গ্রহণ করব এবং এটিকে একটি অনুদান দেব award

উদাহরণ

In:  [[1, 1], [10, 10], [4, 5], [7, 5], [7, 7], [10, 10], [9, 8], [7, 5], [7, 5], [3, 1]]
Out: [[10, 10], [10, 10], [9, 8], [7, 7], [7, 5], [7, 5], [7, 5], [4, 5], [3, 1], [1, 1]]

In:  [[4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [5, 4], [4, 5]]
Out: [[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [5, 4]]
  or [[5, 4], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5]]

In:  [[2, 3], [1, 1], [5, 5], [7, 1]]
Out: [[5, 5], [2, 3], [7, 1], [1, 1]]
 or  [[5, 5], [2, 3], [1, 1], [7, 1]]
 or  [[7, 1], [5, 5], [2, 3], [1, 1]]
 or  [[7, 1], [1, 1], [5, 5], [2, 3]]

আমি এগুলি হাতে হাতে তৈরি করেছি, সুতরাং আপনি যদি কোনও ভুল চিহ্নিত করেন তবে আমাকে জানান।


3
আপনি কি নিশ্চিত যে ন্যূনতম সংখ্যক ওভারহ্যাংগুলির একটি সমাধান সন্ধান বহুবর্ষীয় সময়ে সমাধান করা যায়?
COTO

@COTO আমি মোটামুটি আত্মবিশ্বাসী, হ্যাঁ।
মার্টিন ইন্ডার

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

@ COTO আমি আসলে ভুল হয়ে থাকলে আমি এই সম্পর্কে একটি অনুচ্ছেদ যুক্ত করেছি, তবে এটির উপর নির্ভর করবেন না। ;)
মার্টিন ইন্ডার

ঠিক সেক্ষেত্রে, কোনও বহুপাক্ষিক-সময়ের অ্যালগরিদম নেই এমন সম্ভাব্য প্রমাণগুলিকে এই অনুমান করার অনুমতি দেওয়া উচিত যে পি এনপি এর সমান নয়।
xnor

উত্তর:


2

পাইথ , 30

FN_SQFbYIgeeYeb~b]NB)E~Y]]N;sY

এটি গ্রিসের দুর্দান্ত অ্যালগরিদমের একটি সরাসরি গল্ফ। এখানে সংকলিত পাইথন কোডে উপরের পাইথ প্রোগ্রামের যথাযথ সমতুল্য এখানে দেওয়া আছে।

Q = eval(input())
Y = []
for N in sorted(Q)[::-1]:
     for b in Y:
         if Y[-1][-1] >= b[-1]:
             b += [N]
             break
     else:
         Y += [[N]]
print(Psum(Y))

এই প্রসঙ্গে, Psum(Y)ফাংশনটি অজগরটির সমান sum(Y,[])

প্রকৃত সংকলিত এবং রান কোড (থেকে pyth -d):

Y=[]
Q=copy(eval(input()))
for N in neg(Psorted(Q)):
 for b in Y:
  if gte(end(end(Y)),end(b)):
   b+=[N]
   break
 else:
  Y+=[[N]]
Pprint("\n",Psum(Y))

1
পাইথন অনুবাদের প্রয়োজনীয়তার থাকা "Y = []", Eval অপসারণ আপনি পাইথন 2, এবং যোগফল দ্বিতীয় যুক্তি প্রয়োজন sum(Y,[])। পাইথের মধ্যে এই সমস্ত কাজ করা উচিত, কেবল অনুবাদ এটি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হয় না।
xnor

@xnor শেষ লাইনটি সত্যিই লেখা আছে: Pprint("\n",Psum(Y))। আমি মনে করি তিনি সুবিধার জন্য এটা সরলীকৃত হতে পারে, সব বরাবর -1গুলি ইত্যাদি Psumআসলে আরো ভালো চালানো হবে reduce(lambda x,y:x+y, Y[1:], Y[0])
FryAmTheEggman

20

পাইথন, 113

P=[]
for n in sorted(input())[::-1]:
 for p in P:
  if p[-1][1]>=n[1]:p+=[n];break
 else:P+=[[n]]
print sum(P,[])

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

সময়ের জটিলতায় আমি খুব একটা ভাল নই, তবে আমি বিশ্বাস করি এটির ( এন 2 ) এর সবচেয়ে খারাপ পরিস্থিতি হবে । দুটি লুপ রয়েছে, প্রতিটি সর্বাধিক এন পুনরাবৃত্তির সাথে। আমি পাইথনের বিল্টিন বাছাইও ব্যবহার করি যা ( এন লগ এন )।


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

এখানে যাইহোক প্রমাণের একটি সংক্ষিপ্ত বিবরণ (@xnor এবং @ Sp3000- এ জমা দেওয়া)।

প্রথমত, আমরা একটি অ্যান্টিপাইল বা অ্যান্টিকেনের ধারণাটি সংজ্ঞায়িত করি ( @ এক্সনোর থেকে উদ্ধৃত ):

একটি এন্টিপাইল হ্রাসমান উচ্চতার বইগুলির ক্রম, তবে প্রস্থ বৃদ্ধি করা হয়
, সুতরাং প্রতিটি ধারাবাহিক বই কঠোরভাবে লম্বা হয় তবে কঠোরভাবে কম প্রশস্ত থাকে
নোট করুন যে কোনও এন্টিপাইলের কোনও বই কোনও এন্টিপাইলের অন্য কোনও বইয়ের চেয়ে ওভারহ্যাং করে
তাই কোনও প্রতিষেধকের মধ্যে কোনও দুটি বইই পারে না একই
স্তূপে থাকুন ফলস্বরূপ, আপনি যদি X বইয়ের একটি প্রতিরোধের সন্ধান করতে পারেন, তবে সেই বইগুলি অবশ্যই বিভিন্ন পাইলের মধ্যে থাকতে হবে
, সুতরাং, বৃহত্তম এন্টিপাইলের আকারটি পাইলসের সংখ্যার উপর একটি কম আবদ্ধ

তারপরে, আমরা বইগুলি তাদের প্রস্থ (প্রথম) এবং তাদের উচ্চতা (দ্বিতীয়) * দ্বারা সাজানো ক্রম অনুসারে বাছাই করেছি।

প্রতিটি বি বিয়ের জন্য , আমরা নিম্নলিখিতটি করি:

  1. বি যদি প্রথম স্তূপে ফিট করতে পারে তবে আমরা এটি সেখানে রেখে এগিয়ে চলেছি।
  2. অন্যথায়, আমরা প্রারম্ভিক * পাইল x খুঁজে পাই যা বি এর উপরে স্থাপন করা যেতে পারে। প্রয়োজনে এটি একটি নতুন গাদা হতে পারে।
  3. এরপরে, আমরা বি কে পি এর সাথে সংযুক্ত করব , যেখানে পি পূর্ববর্তী গাদা x - 1 এর শীর্ষস্থানীয় বই ।
  4. আমরা এখন জানি যে:
    • বি পি এর চেয়ে প্রস্থে কঠোরভাবে * ছোট , যেহেতু বইগুলি প্রস্থ অনুসারে অবতরণ অনুসারে সাজানো হয়েছে
    • বি চেয়ে উচ্চতায় যথাযথভাবে বেশী হয় পি , অথবা আমরা স্থাপন করত বি উপরে পি

এখন, আমরা প্রতিটি বইয়ের (প্রথম স্তূপের বইগুলি বাদে) পূর্ববর্তী স্তূপের একটি বইয়ের লিঙ্ক তৈরি করেছি যা প্রস্থে বৃহত্তর এবং উচ্চতায় কম lower

@ এসপি 3000 এর দুর্দান্ত চিত্রটি এটির চিত্রিত করে:

সর্বশেষ গাদা (ডানদিকে) থেকে প্রথম গাদা (বাম দিকে) যে কোনও পথ অনুসরণ করে, আমরা একটি অ্যান্টিপাইল পাই। গুরুত্বপূর্ণভাবে, এই অ্যান্টিপাইলের দৈর্ঘ্য পাইলগুলির সংখ্যার সমান। সুতরাং, ব্যবহৃত পাইলসের সংখ্যা ন্যূনতম।

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

* এই সহায়ক মন্তব্যটি কয়েকটি বিষয় ব্যাখ্যা করে


3
এক্সপ্রেসিটিভ প্রুফের জন্য +1 এবং আলোচনার লিঙ্ক। প্রপস এক্সনর এট আল।
COTO

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