बुक स्टैक सॉर्ट


21

स्टैकिंग किताबें जब आप आमतौर पर सबसे बड़े वाले को सबसे नीचे रखना चाहते हैं और सबसे छोटे वाले को। हालाँकि, मेरी अव्यक्त OCD मुझे बहुत बेचैनी का अनुभव कराती है अगर मुझे दो किताबें मिलें जहाँ एक छोटी हो (ऊँचाई में) लेकिन दूसरे की तुलना में व्यापक। कोई फर्क नहीं पड़ता कि मैं उन्हें किस क्रम में रखता हूं, शीर्ष पुस्तक एक तरफ नीचे की किताब से आगे बढ़ेगी।

उदाहरण के रूप में, कहते हैं कि एक पुस्तक में आयाम हैं (10,15)और दूसरे में आयाम हैं (11,14)। कोई फर्क नहीं पड़ता कि किस तरह से मैंने उन्हें लगाया, मुझे एक ओवरहांग मिला। लेकिन अगर मेरे पास आयामों वाली किताबें हैं (4,3)और (5,6), मैं पहले वाले को नीचे रखकर एक ओवरहैजिंग से बच सकता हूं।

इस चुनौती के प्रयोजनों के लिए हम केवल पुस्तक के संबंध में overhangs पर विचार करेगी तुरंत नीचे । उदाहरण के लिए अगर मैं एक ढेर है (5,5), (3,3), (4,4)(किसी भी समझदार व्यक्ति ऐसा होता है कि नहीं), एक की अधिकता के रूप में शीर्ष किताब में गिना जाता है, हालांकि यह नीचे किताब से बाहर भी नहीं करता है। इसी तरह, ढेर (3,3), (3,3), (4,4)भी केवल एक की अधिकता, शीर्ष पुस्तक नीचे एक से परे का विस्तार के बावजूद है।

चुनौती

पुस्तक आयामों के लिए पूर्णांक जोड़े की सूची को देखते हुए, उन जोड़ियों / पुस्तकों को क्रमबद्ध करें, जैसे कि ओवरहैंग की संख्या न्यूनतम हो। आपको पुस्तकों को घुमाना नहीं चाहिए - मैं चाहता हूं कि सभी रीढ़ एक ही दिशा का सामना कर रहे हों। यदि एक ही संख्या के ओवरहैंग के साथ कई समाधान हैं, तो आप ऐसा कोई भी आदेश चुन सकते हैं। आपके सॉर्टिंग एल्गोरिथ्म को स्थिर होने की आवश्यकता नहीं है। आपका कार्यान्वयन यह मान सकता है कि पुस्तक के आयाम 2 16 से कम हैं ।

समय की जटिलता: इसे थोड़ा और दिलचस्प बनाने के लिए, आपके एल्गोरिथ्म की असममित सबसे खराब स्थिति को ढेर के आकार में बहुपद होना चाहिए। तो आप बस हर संभव क्रमचय का परीक्षण नहीं कर सकते। कृपया अपने एल्गोरिथ्म की इष्टतमता और जटिलता का एक छोटा सा प्रमाण शामिल करें और वैकल्पिक रूप से एक भूखंड जो बड़े यादृच्छिक आदानों के लिए स्केलिंग दिखाता है। बेशक, आप इनपुट के अधिकतम आकार का उपयोग इस तर्क के रूप में नहीं कर सकते कि आपका कोड O (1) में चलता है।

आप किसी प्रोग्राम या फ़ंक्शन को लिख सकते हैं, किसी भी सुविधाजनक (पूर्वप्रक्रमित) सूची प्रारूप में एसटीडीआईएन, एआरजीवी या फ़ंक्शन तर्क के माध्यम से इनपुट ले सकते हैं और परिणाम को प्रिंट या वापस कर सकते हैं।

यह कोड गोल्फ है, इसलिए सबसे छोटा उत्तर (बाइट्स में) जीतता है।

मुझे विश्वास है कि एक बहुपद-समाधान मौजूद है, लेकिन अगर आप मुझे गलत साबित कर सकते हैं, तो आप गोल्फ प्रूफ प्रस्तुत करने के बजाय इस तरह के प्रमाण प्रस्तुत कर सकते हैं। इस मामले में, आप पी ≠ एनपी मान सकते हैं । मैं पहले सही ऐसे प्रमाण को स्वीकार करूंगा और इसके लिए एक इनाम दूंगा।

उदाहरण

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 मैंने इस बारे में एक पैराग्राफ जोड़ा है कि मैं वास्तव में गलत हूं, लेकिन इस पर भरोसा नहीं करते। ;)
मार्टिन एंडर

बस मामले में, संभावित सबूत कि कोई बहुपद-काल एल्गोरिथ्म मौजूद नहीं है, यह मानने की अनुमति दी जानी चाहिए कि P, NP के बराबर नहीं है।
xnor

जवाबों:


2

अजगर , ३०

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

यह grc के कमाल के एल्गोरिथ्म का एक सीधा गोल्फ है। यहाँ अपने संकलित अजगर कोड में उपरोक्त पायथ कार्यक्रम का सटीक समकक्ष है।

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 = []" की आवश्यकता है, यदि आप पायथन 2 में हैं, तो निष्कासन को हटा दें, और योग को दूसरे तर्क की आवश्यकता है sum(Y,[])। यह सब Pyth में काम करना चाहिए, बस अनुवाद स्वचालित रूप से इसे शामिल नहीं करता है।
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 को क्रेडिट)।

सबसे पहले, हम एक एंटीपाइल या एंटीचिन की धारणा को परिभाषित करते हैं, ( @xnor से उद्धृत ):

एक एंटीपाइल घटती ऊंचाई की किताबों का एक क्रम है, लेकिन बढ़ती चौड़ाई
इसलिए, प्रत्येक क्रमिक पुस्तक सख्ती से लम्बी होती है, लेकिन कड़ाई से कम चौड़ी होती है
ध्यान दें कि एंटीपाइल में किसी भी किताब में एंटीपाइल में किसी भी अन्य पुस्तक के ऊपर ओवरहैंग्स होते हैं
, इसलिए एंटीपाइल के साथ कोई भी दो पुस्तक नहीं हो सकती है। एक ही ढेर में हो
एक परिणाम के रूप में, आप एक्स पुस्तकों के एक antipile मिल सकता है, तो उन पुस्तकों अलग बवासीर में होना चाहिए
तो, सबसे बड़ा antipile का आकार कम है बवासीर की संख्या पर बाध्य

फिर, हम पुस्तकों को उनकी चौड़ाई (प्रथम) और उनकी ऊँचाई (दूसरी) * से घटते क्रम में क्रमबद्ध करते हैं।

प्रत्येक पुस्तक B के लिए , हम इस प्रकार हैं:

  1. यदि बी पहले ढेर पर फिट हो सकता है, तो हम इसे वहां रखते हैं और आगे बढ़ते हैं।
  2. अन्यथा, हम जल्द से जल्द * ढेर एक्स पाते हैं जिसे बी शीर्ष पर रखा जा सकता है। यदि आवश्यक हो तो यह एक नया ढेर हो सकता है।
  3. अगला, हम बी को पी से जोड़ते हैं , जहां पी पिछले पाइल एक्स - 1 पर शीर्ष पुस्तक है ।
  4. अब हम जानते हैं कि:
    • B , P की तुलना में कड़ाई से * छोटा है , क्योंकि पुस्तकें चौड़ाई द्वारा अवरोही क्रम में क्रमबद्ध हैं
    • B , P की तुलना में कड़ाई से अधिक है या हमने B को P के ऊपर रखा होगा

अब, हमने हर किताब (पहले ढेर में उन लोगों को छोड़कर) का निर्माण किया है, जो पिछले ढेर में एक किताब है जो चौड़ाई में अधिक है और ऊंचाई में कम है।

@ Sp3000 का उत्कृष्ट चित्र इसको अच्छी तरह दर्शाता है:

अंतिम ढेर (दाएं) से किसी भी पथ का अनुसरण करके, पहले ढेर (बाईं ओर) पर, हमें एक एंटीपाइल मिलता है। महत्वपूर्ण रूप से, इस एंटीपाइल की लंबाई बवासीर की संख्या के बराबर है। इसलिए, उपयोग किए गए ढेर की संख्या न्यूनतम है।

अंत में, चूंकि हमने किताबों को ओवरलैप के बिना ढेर की न्यूनतम संख्या में व्यवस्थित किया है, इसलिए हम उन्हें ओवरलैप की न्यूनतम संख्या के साथ एक ढेर पाने के लिए एक-दूसरे के ऊपर ढेर कर सकते हैं।

* यह उपयोगी टिप्पणी कुछ बातें समझाती है


3
एक्सपोजिटिव सबूत और चर्चा के लिंक के लिए +1। Xnor एट अल के लिए सहारा।
COTO

मुझे स्पष्ट करना चाहिए कि दिलवर्थ की प्रमेय पूरे प्रमाण को कवर नहीं करता है, बस तथ्य यह है कि बवासीर की सबसे छोटी संख्या सबसे बड़े आकार के एंटीपाइल के बराबर होती है।
xnor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.