मैं कुशलतापूर्वक ढेर से मोज़े कैसे जोड़ सकता हूं?


3911

कल मैं साफ कपड़े धोने से मोज़े बाँध रहा था और मुझे लगा कि मैं जो कर रहा हूँ वह बहुत कुशल नहीं है। मैं एक भोली खोज कर रहा था - एक जुर्राब उठा रहा था और अपनी जोड़ी को खोजने के लिए ढेर को "परेशान" कर रहा था। यह n / 2 * n / 4 = n पर पुनरावृत्ति की आवश्यकता है 2 /8 औसतन मोजे।

एक कंप्यूटर वैज्ञानिक के रूप में मैं सोच रहा था कि मैं क्या कर सकता हूं? एक O (NlogN) समाधान को प्राप्त करने के लिए छंटनी (आकार / रंग / ... के अनुसार) का ध्यान आया।

Hashing या अन्य नॉट-इन-प्लेस समाधान एक विकल्प नहीं हैं, क्योंकि मैं अपने मोज़े की नकल करने में सक्षम नहीं हूं (हालांकि अगर मैं कर सकता था तो यह अच्छा हो सकता है)।

तो, सवाल मूल रूप से है:

nमोज़े के जोड़े के ढेर को देखते हुए , 2nतत्वों से युक्त (मान लें कि प्रत्येक जुर्राब में एक मेल खाने वाली जोड़ी है), उन्हें लघुगणक अतिरिक्त स्थान तक कुशलतापूर्वक जोड़ी बनाने का सबसे अच्छा तरीका क्या है? (मुझे विश्वास है कि मैं जरूरत पड़ने पर उस राशि को याद रख सकता हूं।)

मैं एक जवाब की सराहना करूंगा जो निम्नलिखित पहलुओं को संबोधित करता है:

  • बड़ी संख्या में मोजे के लिए एक सामान्य सैद्धांतिक समाधान।
  • मोज़े की वास्तविक संख्या इतनी बड़ी नहीं है, मुझे अपने पति या पत्नी पर विश्वास नहीं है और मेरे पास 30 से अधिक जोड़े हैं। (और यह मेरे मोजे और उसके बीच अंतर करना काफी आसान है; क्या यह भी इस्तेमाल किया जा सकता है?)
  • क्या यह तत्व विशिष्टता समस्या के बराबर है ?

448
मैं कपड़े धोने के ढेर से जोड़ी बनाने के लिए कबूतर छेद सिद्धांत का उपयोग करता हूं। मेरे पास मोज़े के 3 अलग-अलग रंग हैं (लाल, नीला और हरा) और प्रत्येक रंग के 2 जोड़े। मैं हर बार 4 नंबर के मोज़े उठाता हूं और मैं हमेशा एक जोड़ी बनाता हूं और काम करता हूं।
श्रीनिवास

59
फिर भी एक और कबूतर छेद सिद्धांत: यदि आप n / 2 +1 मोजे का एक सबसेट लेते हैं, तो इस उपसमुच्चय में कम से कम एक जोड़ा होना चाहिए
वाइल्डपलासर

40
बड़ा अच्छा सवाल! आप एक संबंधित समस्या पर मेरे लेख में दिलचस्पी ले सकते हैं, जो ढेर से दो मिलान किए गए मोज़े खींचने की संभावना की चर्चा है: blogs.msdn.com/b/ericlippert/archive/2010/03/03/22/…
एरिक लिप्टर

335
क्यों नहीं एक बच्चे को और waitpidइसलिए कि माता-पिता के रूप में, आप अपने आप को किसी भी प्रकार के सॉर्ट नहीं कर रहे हैं?
छद्म

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

जवाबों:


2448

सॉर्टिंग समाधान प्रस्तावित किए गए हैं, लेकिन सॉर्टिंग बहुत अधिक है : हमें ऑर्डर की आवश्यकता नहीं है; हमें सिर्फ समानता समूहों की आवश्यकता है

इसलिए हैशिंग काफी (और तेज) होगी।

  1. मोजे के प्रत्येक रंग के लिए, एक ढेर बनाएं । अपनी इनपुट टोकरी में सभी मोज़ों पर फेरबदल करें और उन्हें रंग बवासीर पर वितरित करें
  2. प्रत्येक ढेर पर फेरबदल करें और इसे कुछ अन्य मीट्रिक (जैसे पैटर्न) द्वारा बवासीर के दूसरे सेट में वितरित करें
  3. इस योजना को तब तक लागू करें जब तक कि आपने बहुत छोटे बवासीर पर सभी मोज़े वितरित नहीं किए हैं, जिसे आप तुरंत प्रक्रिया कर सकते हैं

इस तरह के पुनरावर्ती हैश विभाजन वास्तव में SQL सर्वर द्वारा किया जा रहा है जब इसे अन्य डेटा सेट पर हैश में शामिल होने या हैश करने की आवश्यकता होती है। यह अपनी बिल्ड इनपुट स्ट्रीम को कई विभाजन में वितरित करता है जो स्वतंत्र हैं। यह योजना डेटा की मनमानी मात्रा और कई सीपीयू को रैखिक रूप से मापती है।

यदि आपको एक वितरण कुंजी (हैश की) मिल सकती है जो आपको पर्याप्त बाल्टी प्रदान करती है तो आपको पुनरावर्ती विभाजन की आवश्यकता नहीं है, प्रत्येक बाल्टी बहुत छोटी है जो बहुत जल्दी संसाधित होती है। दुर्भाग्य से, मुझे नहीं लगता कि मोजे में ऐसी संपत्ति है।

यदि प्रत्येक जुर्राब में एक पूर्णांक होता है, जिसे "PairID" कहा जाता है, तो उन्हें PairID % 10(अंतिम अंक) के अनुसार 10 बाल्टी में आसानी से वितरित किया जा सकता है ।

सबसे अच्छा वास्तविक दुनिया विभाजन मैं सोच सकता हूं कि बवासीर का एक आयत बना रहा है : एक आयाम रंग है, दूसरा पैटर्न है। एक आयत क्यों? क्योंकि हमें पाइल्स के लिए O (1) यादृच्छिक-अभिगम की आवश्यकता होती है। (एक 3 डी घनाभ भी काम करेगा, लेकिन यह बहुत व्यावहारिक नहीं है।)


अपडेट करें:

समानता के बारे में क्या ? क्या कई मनुष्य तेजी से मोजे से मेल खा सकते हैं?

  1. सबसे सरल समानांतरकरण की रणनीति कई श्रमिकों को इनपुट टोकरी से लेने और पाइल्स पर मोज़े लगाने की है। यह केवल इतना बढ़ाता है - 10 बवासीर से लड़ने वाले 100 लोगों की कल्पना करें। तुल्यकालन लागत (खुद को हाथ-टकराव और मानव संचार के रूप में प्रकट करना) दक्षता और गति-अप को नष्ट कर देती है (देखें यूनिवर्सल टालबिलिटी लॉ !)। क्या यह गतिरोध है ? नहीं, क्योंकि प्रत्येक कार्यकर्ता को एक समय में केवल एक ढेर तक पहुंचने की आवश्यकता होती है। केवल एक "लॉक" के साथ एक गतिरोध नहीं हो सकता है। लाइवलॉक इस आधार पर संभव हो सकता है कि मनुष्य कैसे बवासीर तक पहुंच का समन्वय करता है। वे बस यादृच्छिक बैकऑफ़ का उपयोग कर सकते हैंजैसे नेटवर्क कार्ड एक भौतिक स्तर पर यह निर्धारित करने के लिए करते हैं कि कौन सा कार्ड विशेष रूप से नेटवर्क वायर तक पहुंच सकता है। यदि यह एनआईसी के लिए काम करता है , तो इसे मनुष्यों के लिए भी काम करना चाहिए।
  2. यह लगभग अनिश्चित काल तक चलता है अगर प्रत्येक कार्यकर्ता का अपना ढेर हो । श्रमिक तब इनपुट टोकरी से मोज़े के बड़े हिस्से ले सकते हैं (बहुत कम विवाद जैसा कि वे शायद ही कभी कर रहे हैं) और मोजे को बिल्कुल भी वितरित करते समय उन्हें सिंक्रनाइज़ करने की आवश्यकता नहीं है (क्योंकि उनके पास थ्रेड-लोकल बवासीर है)। अंत में, सभी श्रमिकों को अपने ढेर-सेटों को मिलाने की जरूरत है। मेरा मानना ​​है कि यदि श्रमिक एकत्रीकरण का पेड़ बनाते हैं तो ओ (लॉग (वर्कर काउंट * पिल्स प्रति वर्कर)) में किया जा सकता है ।

तत्व विशिष्टता समस्या के बारे में क्या ? जैसा कि लेख बताता है, तत्व विशिष्टता की समस्या को हल किया जा सकता है O(N)। मोज़े की समस्या के लिए भी यही है ( O(N)यदि आपको केवल एक वितरण चरण की आवश्यकता है (मैंने केवल कई चरणों का प्रस्ताव किया है क्योंकि मानव गणना में खराब हैं - एक कदम पर्याप्त है यदि आप वितरित करते हैं md5(color, length, pattern, ...), अर्थात सभी विशेषताओं का एक आदर्श हैश )।

स्पष्ट रूप से, कोई भी तेजी से नहीं जा सकता है O(N), इसलिए हम इष्टतम निचले सीमा तक पहुंच गए हैं ।

हालांकि आउटपुट बिल्कुल एक नहीं हैं (एक मामले में, सिर्फ एक बूलियन। दूसरे मामले में, मोज़े के जोड़े), असममित जटिलताएं समान हैं।


72
यह वही है जो मैं करता हूं! मैं जुर्राब के उद्घाटन की शैली पर ढेर लगाता हूं (मेरे पास केवल सफेद है), जो मुझे उनमें से प्रत्येक को जल्दी से मिलान करने के लिए पर्याप्त "बाल्टी" देता है।
स्कॉट चैंबरलेन

29
मैंने अपने मोज़े के साथ यह कोशिश की है (मुझे आसानी से 30+ जोड़े मिले हैं) और आदमी यह तेज़ है। एक समस्या मुझे मिली है, जब मेरे पास एक अच्छा पर्याप्त हैश एल्गोरिथ्म नहीं हो सकता है (मुझे बिना किसी पैटर्न के बहुत सारे सफेद मोज़े मिले हैं) इसलिए यह कठिन हो जाता है। उस मामले में, यह करने का सबसे इष्टतम तरीका क्या होगा?
NothingsImpossible

56
@NothingsImpossible है कि हैश टक्कर के हमलों को एक खराब वेब सर्वर के लिए कैसा महसूस होता है! क्या सफेद मोज़े किसी विशेषता से अलग हैं? कुछ ऐसा होना चाहिए जिसे आप उन्हें वितरित कर सकें। अन्यथा, आप बस मनमाने ढंग से जोड़े बना सकते हैं।
usr

37
यह एक मूलांक सॉर्ट है, जो मैं मानता हूं कि सही उत्तर है। @MarkPeters मुझे नहीं लगता कि आपको लुकअप टेबल चाहिए। मोजे के ऊपर एक एकल रैखिक पास मोजे को नंबर वैक्टर में बदल सकता है, जिससे "सॉक्स सेगमेंट" की मैपिंग बाल्टी तुच्छ हो सकती है। मोजे को स्ट्रिंग के साथ वैक्टर से बांधा जा सकता है ताकि आपको अंत में एक और रैखिक पास की आवश्यकता न हो।
नुकीले

49
एक लड़का जिसे मैं वास्तव में PairIDs के साथ कॉलेज गया था। धागे के साथ प्रत्येक जोड़ी पर इसे सीवन किया गया था: 1, 2, 3, 4 ...
रयान लुंडी

579

जैसा कि मानव मस्तिष्क की वास्तुकला एक आधुनिक सीपीयू से पूरी तरह से अलग है, यह सवाल कोई व्यावहारिक अर्थ नहीं रखता है।

मनुष्य सीपीयू एल्गोरिदम पर इस तथ्य का उपयोग कर जीत सकता है कि "एक मिलान जोड़ी ढूंढना" एक सेट के लिए एक ऑपरेशन हो सकता है जो बहुत बड़ा नहीं है।

मेरा एल्गोरिथ्म:

spread_all_socks_on_flat_surface();
while (socks_left_on_a_surface()) {
     // Thanks to human visual SIMD, this is one, quick operation.
     pair = notice_any_matching_pair();
     remove_socks_pair_from_surface(pair);
}

कम से कम यह वही है जो मैं वास्तविक जीवन में उपयोग कर रहा हूं, और मुझे यह बहुत कुशल लगता है। नकारात्मक पक्ष यह है कि एक सपाट सतह की आवश्यकता होती है, लेकिन यह आमतौर पर प्रचुर मात्रा में है।


228
जैसे-जैसे मोज़े की संख्या बढ़ती है, मानव का SIMD सीपीयू से बेहतर नहीं होता है।
रेयान

25
सबसे अच्छा जवाब, IMO। हालांकि यह एक कंप्यूटर एल्गोरिथ्म के लिए दिन-प्रतिदिन की समस्या को कम करने के लिए मजेदार और चतुर (और एसओ के लिए उपयुक्त) है, यह मनुष्य के आंख / मस्तिष्क की संकल्प शक्ति का उपयोग करने के लिए बहुत अधिक समझ में आता है ~ ~ 60 मोज़े के रूप में छोटे सेट के लिए।
drug_user841417

13
@ लिरियन यदि मोजे समान रूप से वितरित किए जाते हैं, तो आप जन्मदिन के विरोधाभास के कारण मोजे के किसी भी पर्याप्त छोटे सेट में एक जोड़ी को देखेंगे जब तक कि आप रंगों को मनमाने ढंग से अलग नहीं कर सकते, जो मुझे संदेह है) तो यहां अड़चन नहीं होगी मानव रंग मिलान एल्गोरिथ्म लेकिन प्रसार कदम।
थॉमस

13
@ dpc.ucore.info नहीं, क्योंकि उनके पास अलग-अलग बुने हुए कफ पैटर्न, कफ लंबाई, समग्र लंबाई और रंगों के काले रंग हैं (मेरी पत्नी शायद उस आखिरी के लिए मुझे शारीरिक रूप से चोट पहुंचाएगी)।
क्रिश्चियन

199
आपको बेहतर उम्मीद थी कि आपके पास मोज़े की एक समान संख्या है, अन्यथा आप लंबे समय तक मोज़े मोड़ने वाले हैं ...
पैट्रिक जेम्स मैकडॉगल

258

केस 1 : सभी मोजे समान हैं (यह मैं वास्तविक जीवन में वैसे ही करता हूं)।

जोड़ी बनाने के लिए उनमें से किसी दो को चुनें। लगातार समय।

केस 2 : संयोजन (स्वामित्व, रंग, आकार, बनावट, आदि) की एक निरंतर संख्या है।

मूलांक का प्रयोग करें । यह केवल रैखिक समय है क्योंकि तुलना की आवश्यकता नहीं है।

केस 3 : संयोजन की संख्या पहले से ज्ञात नहीं है (सामान्य मामला)।

हमें यह जांचने के लिए तुलना करनी होगी कि क्या दो मोजे जोड़ी में आते हैं। O(n log n)तुलना-आधारित सॉर्टिंग एल्गोरिदम में से एक चुनें ।

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


8
> अनुक्रमिक खोज की तुलना में इसे और भी अधिक समय लग सकता है, जिसके लिए सिद्धांत में द्विघात समय की आवश्यकता होती है। हाँ, यही कारण है कि मुझे ऐसा करने से नफरत है, शायद मुझे अपने सभी मोज़े फेंकने चाहिए और केस 1 से शुरू करना चाहिए
निल्स

57
सभी समान मोज़े होने के नीचे का पक्ष यह है कि वे अलग-अलग दरों पर आयु के होते हैं। तो आप अभी भी उन्हें कैसे पहना जाता है, इसके आधार पर मिलान करने की कोशिश कर रहे हैं। (जो केवल पैटर्न से मेल खाने से ज्यादा कठिन है)
SDC

118
60 जोड़ी समान मोजे वाले समस्या "क्योंकि यह युग्मन को आसान बनाता है" यह है कि यह लोगों को आपके कंप्यूटर के साथ काम करने की छाप देता है।
स्टीव इव्स

13
केस 1 लगातार समय नहीं है जब इसमें एक ऑपरेशन शामिल होता है, जैसे कि जोड़ियों को एक साथ मोड़ना। इस मामले में, यह सबसे छोटे स्थिर कारक (जिसका प्रमाण पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है) के साथ रैखिक समय है। एक जोड़ी और एक बाल्टी मोज़े को मोड़ने में संभवतः एक ही समय नहीं लगेगा। हालांकि, यह रैखिक रूप से मापता है। Amdahl के नियम के अनुसार, इसमें ओवरहेड को अनदेखा करते हुए असीमित स्पीडअप है। गुस्ताफ़सन के नियम के अनुसार, आप ओवरहेड को अनदेखा करते हुए, पर्याप्त श्रमिकों को दिए गए एक जोड़ी (पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है) को मोड़ने के लिए जितने जोड़े ले सकते हैं, उतने जोड़ सकते हैं।
13

7
@PauloMadeira छँटाई लगातार समय है - आप सिर्फ ढेर लेते हैं और इसे अपने दराज में डालते हैं। इस मामले में एकमात्र ऑपरेशन वास्तव में आपके पैरों पर मोज़े डाल रहा है जो निरंतर भी है। प्रदर्शन जुर्राब पहने के आस्थगित निष्पादन द्वारा प्राप्त किया जाता है, संभवतः अंतरिक्ष में कुछ बलिदान के साथ (गैर-मुड़ा हुआ मोज़े का भस्म स्थान मुड़ा हुआ से बड़ा है)। मेरा तर्क है कि यह इसके लायक है; मैं आमतौर पर अपनी पत्नी के साथ इस तर्क को खो देता हूं।
ट्रैविस

157

गैर-एल्गोरिथम उत्तर, फिर भी "कुशल" जब मैं करता हूं:

  • चरण 1) अपने सभी मौजूदा मोजे को त्याग दें

  • चरण 2) वॉलमार्ट पर जाएं और उन्हें 10 के पैकेट - सफेद के पैकेट और काले रंग के मी पैकेट से खरीदें। रोजमर्रा की जिंदगी में अन्य रंगों की जरूरत नहीं।

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

एल्गोरिथमिक उत्तर:

इस बात पर विचार करें कि क्या आप मोजे के दूसरे स्टैक के लिए केवल एक जुर्राब खींचते हैं, जैसा कि आप कर रहे हैं, एक भोली खोज में मिलान जुर्राब खोजने की आपकी संभावना काफी कम है।

  • इसलिए उनमें से पांच को यादृच्छिक रूप से चुनें, और उनके आकार या उनकी लंबाई को याद करें।

पांच क्यों? आम तौर पर मनुष्य अच्छे होते हैं, काम करने वाले मेमोरी में पाँच और सात अलग-अलग तत्वों के बीच याद करते हैं - आरपीएन स्टैक के मानव समकक्ष की तरह थोड़ा - पांच एक सुरक्षित डिफ़ॉल्ट है।

  • 2n-5 के ढेर से एक उठाओ।

  • अब एक मैच देखें (दृश्य पैटर्न का मिलान - मनुष्य उस छोटे से ढेर के साथ अच्छे हैं) जिसे आपने आकर्षित किया है, अगर आपको एक नहीं मिलता है, तो उसे अपने पांच में जोड़ें।

  • स्टैक से बेतरतीब ढंग से मोज़े उठाते रहें और एक मैच के लिए अपने 5 + 1 मोजे की तुलना करें। जैसे-जैसे आपका स्टैक बढ़ता है, यह आपके प्रदर्शन को कम करेगा लेकिन आपकी बाधाओं को बढ़ाएगा। काफी तेज।

एक मैच के 50% बाधाओं के लिए आपको कितने नमूनों की गणना करने के लिए सूत्र लिखने के लिए स्वतंत्र महसूस करें। IIRC यह एक हाइपरजोमेट्रिक कानून है।

मैं हर सुबह ऐसा करता हूं और शायद ही कभी तीन से अधिक ड्रॉ की जरूरत होती है - लेकिन मेरे पास nसमान जोड़े हैं (लगभग 10, mआकार के सफेद मोज़े देते हैं या खो गए हैं) । अब आप मेरे स्टॉक्स के आकार का अनुमान लगा सकते हैं :-)

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


25
'गैर-एल्गोरिथम' उत्तर के लिए अपवोट करें। यह वही है जो मैं करता हूं और यह आश्चर्यजनक रूप से काम करता है। प्रतिस्थापन मुद्दा एक समस्या नहीं है यदि आप अपने सॉक्स स्टॉक को वापस धोते हैं और सुबह दराज के सामने से खींचते हैं। सभी मोजे समान रूप से पहनते हैं। जब मैं एक पर कुछ पहनना शुरू कर देता हूं, तो मैं खरीदारी की सूची में मोज़े की पूरी कक्षा को पूरी तरह से बदलने के लिए डाल देता हूं। पुराने सॉक्स के लिए, मैं गुडविल को सर्वश्रेष्ठ 20% देता हूं (किराने की थैली में बंधा हुआ है ताकि वे वापस मिश्रित न हों) और बाकी को पिच करें। आप मोजे बर्बाद नहीं कर रहे हैं, इस बिंदु पर, 80% के पास वैसे भी 6 महीने बाकी हैं।
FastAl

2
BTW (1) अपने मोजे को लोचदार में बांधने से एक स्ट्रेच्ड हो जाता है और यह बहुत जल्दी विफल हो जाएगा। आपके पास अद्वितीय मोज़े के प्रकार को सीमित करना बाध्यकारी को अनपेड करता है। (2) अद्वितीय मोजे को सीमित करने का एक नुकसान यह है कि कुछ निश्चित फैशन चिंताओं वाले लोगों के लिए, विधि अनुपयुक्त हो सकती है।
FastAl

3
मैं विशेष रूप से आपके "गैर-एल्गोरिथम" उत्तर को पोस्ट करने के लिए यहां आया था। सच्चे कंप्यूटर विज्ञान की तरह, अधिकांश लोग डेटा और इसकी संरचना पर पर्याप्त ध्यान नहीं देते हैं।
bkconrad

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

3
«सफेद और काले रंग के मी पैकेट। रोज़मर्रा के जीवन में अन्य रंगों की आवश्यकता नहीं है »आसान जुर्राब चयन के लिए एक अच्छा मानक नियम वास्तव में यह है कि उन्हें आपके पतलून के रंग या आपकी बेल्ट के रंग से मेल खाना चाहिए। इस कारण से, सबसे अधिक इस्तेमाल किए जाने वाले रंग संभवतः काले, नीले, ग्रे और कुछ भूरे रंग के होंगे। यह विश्वास करना मुश्किल है कि एक को कई सफेद मोजे की जरूरत है।
एंड्रिया लज्जाज़ारो

106

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

यह दृष्टिकोण काफी आसानी से एक सरणी में लागू किया जा सकता है, यह मानते हुए कि मोजे को "हटाना" एक विकल्प है। वास्तव में, आपको मोजे को "हटाने" की भी आवश्यकता नहीं है। यदि आपको मोज़े की छंटाई की आवश्यकता नहीं है (नीचे देखें), तो आप बस उन्हें चारों ओर घुमा सकते हैं और एक सरणी के साथ समाप्त कर सकते हैं जिसमें सभी मोज़े जोड़े में सरणी में व्यवस्थित होते हैं।

यह मानते हुए कि मोजे के लिए एकमात्र ऑपरेशन समानता के लिए तुलना करना है, यह एल्गोरिथ्म मूल रूप से अभी भी एक एन 2 एल्गोरिथ्म है, हालांकि मुझे औसत मामले के बारे में नहीं पता है (कभी भी उस की गणना करना नहीं सीखा)।

छाँटना, निश्चित रूप से दक्षता में सुधार करता है, विशेष रूप से वास्तविक जीवन में जहां आप आसानी से दो अन्य मोजे के बीच एक जुर्राब "सम्मिलित" कर सकते हैं। कंप्यूटिंग में एक पेड़ द्वारा हासिल किया जा सकता है, लेकिन यह अतिरिक्त जगह है। और, ज़ाहिर है, हम NlogN पर वापस आ गए हैं (या थोड़ा और, यदि कई मोज़े हैं जो मापदंड को छांट कर समान हैं, लेकिन एक ही जोड़ी से नहीं)।

इसके अलावा, मैं कुछ भी नहीं सोच सकता, लेकिन यह विधि वास्तविक जीवन में बहुत कुशल लगती है। :)


7
यह वह भी है जो मैं करता हूं, (ध्यान दें कि यदि आप केवल रिक्त स्थान छोड़ते हैं तो आवेषण भी ओ (1) हैं), लेकिन यह सैद्धांतिक रूप से बड़ी संख्या में मोजे के साथ खराब होता है।
मूइंग डक

15
प्रकार के मोज़े के सैद्धांतिक रूप से बड़ी संख्या के साथ खराब पैमाने पर
स्टीवन लू

@StevenLu - जैसा कि मैंने कहा - यह n * n या nogn है, इस पर निर्भर करता है कि आप इसे सॉर्ट करते हैं या नहीं। तो यह किसी भी छँटाई एल्गोरिथ्म के रूप में के रूप में के बारे में खराब तराजू। यदि आप तेजी से चाहते हैं, तो उन्हें संख्या दें और मूलांक का उपयोग करें।
विल्क्स-

यह अनिवार्य रूप से एक हैश-आधारित लुकअप में पाया-पर-मेल नहीं किए गए मोजे संग्रहीत कर रहा है। एक आदर्श हैश के साथ यह ओ (एन) है, लेकिन अगर आपने पर्याप्त मोज़े संग्रहीत किए हैं, तो हैश खराब होना शुरू हो जाता है, यह उसी के अनुसार बहुत जटिल हो जाता है।
जॉन हैना

3
2 अन्य मोजे के बीच एक जुर्राब डालने का क्या मूल्य मोज़े बाँधने के लक्ष्य को प्रदान करता है? मोजे की कोई कार्डिनैलिटी नहीं है। : -x
जोब्रेकहॉउस

60

यह गलत प्रश्न पूछ रहा है। पूछने के लिए सही सवाल यह है कि, मैं सॉर्ट करने में समय क्यों लगा रहा हूं? वार्षिक आधार पर आपकी लागत कितनी है, जब आप अपनी पसंद की एक्स मौद्रिक इकाइयों के लिए अपना खाली समय देते हैं?

और अधिक बार नहीं, यह सिर्फ कोई खाली समय नहीं है, यह सुबह का खाली समय है, जिसे आप बिस्तर में खर्च कर सकते हैं, या अपनी कॉफी की चुस्की ले सकते हैं, या थोड़ा जल्दी छोड़ सकते हैं और यातायात में फंस नहीं सकते हैं।

अक्सर एक कदम वापस लेना अच्छा होता है, और समस्या के बारे में सोचने का तरीका।

और एक रास्ता है!

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

यह बेहतर है अगर बाएं और दाएं पैर के मोजे के बीच कोई अंतर नहीं है, लेकिन यह महत्वपूर्ण नहीं है। यदि मोजे बाएं-दाएं सममित हैं, तो एक जोड़ी ओ (1) ऑपरेशन है, और सॉर्ट करना लगभग ओ (एम) ऑपरेशन है, जहां एम आपके घर में उन स्थानों की संख्या है, जिन्हें आपने मोजे से ढका है, आदर्श रूप से कुछ छोटी निरंतर संख्या।

यदि आपने अलग-अलग बाएं और दाएं जुर्राब के साथ एक फैंसी जोड़ी चुनी है, तो बाएं और दाएं पैर की बाल्टी के लिए एक पूर्ण बाल्टी प्रकार ओ (एन + एम) लेते हैं, जहां एन मोज़े की संख्या है और एम ऊपर के समान है। कोई और पहली जोड़ी को खोजने के औसत पुनरावृत्तियों के लिए सूत्र दे सकता है, लेकिन अंधा खोज के साथ एक जोड़ी खोजने के लिए सबसे खराब स्थिति एन / 2 + 1 है, जो उचित एन के लिए खगोलीय रूप से असंभावित मामला बन जाता है। यह उन्नत छवि का उपयोग करके ऊपर जा सकता है मान्यता एल्गोरिदम और heuristics, जब Mk1 नेत्रगोलक के साथ बिना जुराब के ढेर को स्कैन करते हैं ।

तो, O (1) जुर्राब युग्मन दक्षता प्राप्त करने के लिए एक एल्गोरिथ्म (सममितीय झटके को मानते हुए) है:

  1. आपको यह अनुमान लगाने की आवश्यकता है कि आपके पूरे जीवन में कितने जोड़े मोजे की आवश्यकता होगी, या शायद तब तक जब तक आप रिटायर न हो जाएं और गर्म जलवायु में चले जाएं, फिर से मोजे पहनने की कोई आवश्यकता नहीं है। यदि आप युवा हैं, तो आप यह अनुमान लगा सकते हैं कि इससे पहले कि हमारे घरों में सभी सॉक्स-सॉर्टिंग रोबोट हों, और पूरी समस्या अप्रासंगिक हो जाती है, कितना समय लगता है।

  2. आपको यह पता लगाने की आवश्यकता है कि आप थोक में अपने चयनित जुर्राब को कैसे ऑर्डर कर सकते हैं, और इसकी लागत कितनी है, और वे वितरित करते हैं।

  3. मोजे ऑर्डर करें!

  4. अपने पुराने मोजे से छुटकारा पाएं।

एक वैकल्पिक चरण 3 में वर्षों में एक बार में कुछ जोड़े की तुलना में शायद कुछ सस्ते मोज़े खरीदने की लागत की तुलना करना और सॉर्टिंग सॉक्स की लागत को जोड़ना शामिल होगा, लेकिन इसके लिए मेरा शब्द लेना: थोक में खरीदना सस्ता है! इसके अलावा, भंडारण में मोजे स्टॉक मूल्य मुद्रास्फीति की दर से मूल्य में वृद्धि करते हैं, जो कि कई निवेशों पर आपको मिलता है। फिर फिर से भंडारण की लागत भी है, लेकिन मोज़े वास्तव में एक कोठरी के शीर्ष शेल्फ पर ज्यादा जगह नहीं लेते हैं।

समस्या सुलझ गयी। तो, बस नए मोज़े प्राप्त करें, अपने पुराने लोगों को दूर फेंक / दान करें, और यह जानने के बाद कि आप अपने जीवन के हर दिन पैसे और समय की बचत कर रहे हैं, खुश रहें।


एक जीवन भर (75 साल तक) मोज़े की आपूर्ति (यह मानते हुए कि आप 4 जोड़े / महीने को समाप्त करते हैं, जो 3600 जोड़े बनाता है) ले जाएगा (मोजे की एक नई जोड़ी 20 घन इंच लेता है) कुल 1 1/2 घन गज। यह अंतरिक्ष की एक विशाल राशि है। यह मानते हुए कि वे इसे आपको एक बॉक्स में वितरित करते हैं जो मोटे तौर पर एक घन है, एक तरफ एक टोकरा लगभग 3 फीट 4 इंच का होगा।
AJMansfield

2
@AJMansfield वैध चिंता। हालाँकि, मैं आपके कुछ नंबरों से असहमत हूं। मैं सिर्फ 40 साल (25 ... 65) का समय ले सकता हूं (माता-पिता / छात्रावास / आदि में रहने और सेवानिवृत्त होने के बीच का समय, ऊपर देखें)। इसके अलावा, मुझे लगता है कि मूल पैकेजिंग में एक जोड़ी 0,5x4x6 इंच की तरह लगती है। ये संख्या आपके अंतरिक्ष एस्टीम को काफी नीचे लाती है!
हाइड

चरण 4 अनावश्यक रूप से बेकार है, -1।
दान बेचार

2
AJMansfield की माप से भ्रमित हो सकने वाले अन्य लोगों के लिए गाइड, मीट्रिक में अनुवाद: »ले जाएगा (मोजे की एक नई जोड़ी 327 सेमी³ लेता है) कुल 1.14 वर्ग मीटर। यह अंतरिक्ष की एक विशाल राशि है। यह मानते हुए कि वे इसे आपको एक बॉक्स में वितरित करते हैं जो लगभग एक घन है, जो टोकरा एक तरफ लगभग 1.04 होगा। «
जॉय

एक जिज्ञासा-आधारित प्रश्न "गलत प्रश्न" कैसे हो सकता है? क्लासिक
स्टैकओवरफ़्लो

52

सैद्धांतिक सीमा ओ (एन) है क्योंकि आपको प्रत्येक जुर्राब को छूने की आवश्यकता है (जब तक कि कुछ पहले से ही किसी तरह से जोड़ा नहीं जाता है)।

आप मूलांक के साथ O (n) प्राप्त कर सकते हैं । आपको केवल बाल्टियों के लिए कुछ विशेषताओं को चुनने की आवश्यकता है।

  1. पहले आप चुन सकते हैं (उसका, मेरा) - उन्हें 2 ढेर में विभाजित करें,
  2. फिर रंगों का उपयोग करें (रंगों के लिए कोई भी आदेश हो सकता है, जैसे वर्णानुक्रम में रंग नाम से) - उन्हें रंग से बवासीर में विभाजित करें (एक ही ढेर में सभी मोज़ों के लिए चरण 1 से प्रारंभिक आदेश रखने के लिए याद रखें),
  3. तब जुर्राब की लंबाई,
  4. फिर बनावट, ....

यदि आप सीमित संख्या में गुण चुन सकते हैं, लेकिन पर्याप्त विशेषताएँ जो प्रत्येक जोड़ी को विशिष्ट रूप से पहचान सकती हैं, तो आपको O (k * n) में किया जाना चाहिए, जो कि O है (n) यदि हम विचार कर सकते हैं कि k सीमित है।


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

29
@ विलेक्स- क्यों?!? क्या यह पूरी बात नहीं है कि वे अप्रभेद्य हों?
फ़्लॉप

2
@ फुलअप - मुझे लगता है कि पूरे बिंदु को बड़े बंडलों में बेचना है। :) मेरे लिए, यह उन्हें जोड़े में नीचे पहनने में मदद करता है। अन्यथा मैं तीन बहुत पहने हुए मोज़े और एक नया ब्रांड के साथ समाप्त कर सकता हूं। किंदा मूर्खतापूर्ण।
विल्क्स-

13
मैं O (n) की गणना से असहमत हूं। $ K $ क्या है? $ k $ विशेषताओं की संख्या है। मेरा तर्क है कि $ k $ $ O (लॉग एन) $ है क्योंकि इसे प्रत्येक जोड़ी को विशिष्ट रूप से पहचानने के लिए पर्याप्त होना चाहिए। यदि आपके पास 2 जोड़े (काले और सफेद) हैं, तो रंग ($ k = 1, n = 2 $) पर्याप्त है। यदि आपके पास एक जोड़ी है काली, छोटी; एक जोड़ी काला, लंबा; सफेद, छोटी की एक जोड़ी; और सफेद की एक जोड़ी, लंबी - तो $ k = 2, n = 4 $। तब यदि हम $ k $ को सीमित करते हैं, तो हम उसी समय $ n $ को सीमित करते हैं। यदि हम $ n $ को सीमित करने जा रहे हैं तो ऑर्डर गणना का कोई मतलब नहीं है।
एमोरी

3
@emory, मुझे लगता है कि आप $अपने सामान को कोड-वाई बनाने के लिए बैकटिक की तलाश कर रहे हैं, चरित्र की नहीं ।
Xymostech

33

एक व्यावहारिक समाधान के रूप में:

  1. जल्दी से आसानी से अलग मोजे के ढेर बना। (रंग से कहो)
  2. हर ढेर को क्विकॉर्ट करें और तुलना के लिए जुर्राब की लंबाई का उपयोग करें। एक इंसान के रूप में आप एक बहुत ही त्वरित निर्णय ले सकते हैं जो कि सबसे खराब स्थिति से बचने वाले विभाजन का उपयोग करने के लिए बोता है। (आप समानांतर में कई मोज़े देख सकते हैं, अपने लाभ के लिए इसका उपयोग करें!)
  3. जब वे एक सीमा पर पहुँचते हैं, तो आप बवासीर को छाँटना बंद कर देते हैं, जिस पर आप तुरंत जगह के जोड़े और बिना जुराब के मोज़े पा सकते हैं

यदि आपके पास 1000 मोज़े हैं, 8 रंगों और एक औसत वितरण के साथ, आप प्रत्येक 125 मोज़े के 4 ढेर को c * n समय में कर सकते हैं। 5 जुराबों की एक सीमा के साथ आप हर ढेर को 6 रनों में सॉर्ट कर सकते हैं। (2 सेकंड की गिनती सही ढेर पर एक जुर्राब फेंकने के लिए यह आपको 4 घंटे से कम समय लगेगा।)

यदि आपके पास सिर्फ 60 मोज़े, 3 रंग और 2 तरह के मोज़े (आपकी / आपकी पत्नी की) हैं, तो आप 10 जुराबों के हर ढेर को 1 रन (फिर से दहलीज = 5) में सॉर्ट कर सकते हैं। (2 सेकंड की गिनती में आपको 2 मिनट लगेंगे)।

प्रारंभिक बाल्टी छंटाई आपकी प्रक्रिया को गति देगी, क्योंकि यह आपके n मोज़े को k बाल्टी में विभाजित c*nकरता है ताकि आपको केवल c*n*log(k)काम करना पड़े । (सीमा को ध्यान में नहीं रखते हुए)। तो सभी में आप काम के बारे में n*c*(1 + log(k))करते हैं, जहां सी ढेर पर एक जुर्राब फेंकने का समय है।

c*x*n + O(1)जब तक मोटे तौर पर किसी भी विधि की तुलना में यह दृष्टिकोण अनुकूल होगा log(k) < x - 1


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

विधि को नेस्टेड भी किया जा सकता है, अगर हमारे पास कई तुल्यता संबंध हैं -> रंग ढेर बनाते हैं, बनावट पर हर ढेर विभाजन के भीतर, लंबाई की तरह। किसी भी तुल्यता संबंध जो 2 से अधिक तत्वों के साथ एक विभाजन बनाता है जो आकार के बारे में है, छँटाई पर एक गति में सुधार लाएगा (बशर्ते हम सीधे उसके ढेर पर एक जुर्राब असाइन कर सकते हैं), और छोटे डेटा सेट पर छंटनी बहुत जल्दी हो सकती है।


3
मानव अनुकूलन: मैं तर्क देता हूं कि एक इंसान के रूप में, चरण 2 के लिए, आपको मोज़े को मोटे तौर पर आरोही क्रम में नीचे चढ़ाना चाहिए, फिर बारीक और बारीक बारीकता के साथ दोहराएं, जब तक कि शेल सॉर्ट नहीं हो जाता। यह तुलना-स्वैप आधारित दृष्टिकोण की तुलना में मानव (दृश्य अनुमान) के लिए बहुत तेज़ होगा।
एंड्रयूज

28

आप गलत समस्या को हल करने की कोशिश कर रहे हैं।

समाधान 1: हर बार जब आप अपने कपड़े धोने की टोकरी में गंदे मोजे डालते हैं, तो उन्हें थोड़ा गाँठ में बांधें। इस तरह से आपको धुलाई के बाद कोई छंटाई नहीं करनी पड़ेगी। इसे एक मानगो डेटाबेस में एक सूचकांक दर्ज करने की तरह सोचें। भविष्य में कुछ सीपीयू बचत के लिए थोड़ा सा काम।

समाधान 2: यदि यह सर्दियों का है, तो आपको मैचिंग मोज़े पहनने की ज़रूरत नहीं है। हम प्रोग्रामर हैं। किसी को भी जानने की जरूरत नहीं है, जब तक यह काम करता है।

समाधान 3: काम को फैलाएं। आप यूआई को ब्लॉक किए बिना ऐसी जटिल सीपीयू प्रक्रिया को अतुल्यकालिक रूप से निष्पादित करना चाहते हैं। मोजे के उस ढेर को लें और उन्हें एक बैग में भर दें। केवल एक जोड़ी की तलाश करें जब आपको इसकी आवश्यकता हो। इस तरह से काम करने की मात्रा कम ध्यान देने योग्य है।

उम्मीद है की यह मदद करेगा!


5
एक गाँठ में मोज़े (या किसी भी कपड़े) बांधने से कपड़े धोने के लिए वॉशर की क्षमता कम हो जाती है, और उन्हें पहनने के लिए एकजुट करना मुश्किल हो जाता है। समाधान 2 रखरखाव को और अधिक कठिन बनाता है जब मामलों की स्थिति आगे बढ़ती है; 6 महीने के बाद, जब आपको शॉर्ट्स और स्नीकर्स की एक जोड़ी के साथ पहनने के लिए दो काले टखने के मोज़े की आवश्यकता होती है, तो 6 महीने तक जो भी काम करना है, उस जोड़ी को उसी स्थिति में ढूंढना होगा (गंदे / स्वच्छ, समान पहनने)। समाधान 3 कम "अतुल्यकालिक" और अधिक सीधे-अप "आलसी" है; जब आपको आवश्यकता हो, तब न्यूनतम कार्य करें।
कीथ्स

पुन :: समाधान 2: लोगों को पता होगा कि मैंने मैचिंग मोजे नहीं पहने हैं क्योंकि वे उन्हें मेरे बर्क में देखेंगे :)
बॉब प्रोब्स्ट

@ याकूबप्रॉस्ट हाँ, लेकिन आपके साथी प्रोग्रामर भी बिरक्स के साथ बेजोड़ मोज़े पहने होंगे और इसलिए वे सिर्फ यह देखकर खुश होंगे कि वे अकेले नहीं हैं।
फ्रांसेस्को पासा

27

यह प्रश्न वास्तव में गहरा दार्शनिक है। दिल में यह बात है कि क्या लोगों की समस्याओं को हल करने की शक्ति (हमारे दिमाग के "वेटवेयर") एल्गोरिदम द्वारा पूरी की जा सकती है।

जुर्राब छँटाई के लिए एक स्पष्ट एल्गोरिथ्म है:

Let N be the set of socks that are still unpaired, initially empty
for each sock s taken from the dryer
  if s matches a sock t in N
    remove t from N, bundle s and t together, and throw them in the basket
  else
    add s to N

अब इस समस्या में कंप्यूटर विज्ञान सभी चरणों के बारे में है

  1. "अगर n में sock t के साथ जोड़े हैं"। कितनी जल्दी हम "याद" कर सकते हैं कि हमने अब तक क्या देखा है?
  2. "एन से टी हटाएं" और "एस से एन जोड़ें"। अब तक हमने जो कुछ देखा है, उस पर नज़र रखना कितना महंगा है?

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

मोज़े के मामले में, परफेक्ट रिकॉल का मतलब है कि एक जुर्राब को देखना sहमेशा अपने भाई-बहन की याददाश्त पैदा करता है t, जिसमें tनिरंतर समय में पता लगाने के लिए पर्याप्त जानकारी (जहां यह इस्त्री बोर्ड पर है) शामिल है । फोटोग्राफिक मेमोरी वाला व्यक्ति बिना किसी असफलता के निरंतर समय में 1 और 2 दोनों को पूरा करता है।

सही मेमोरी से कम वाला कोई व्यक्ति ट्रैक करने की अपनी क्षमता के अनुसार सुविधाओं के आधार पर कुछ कॉमन्सेंस समतुल्यता वर्गों का उपयोग कर सकता है: आकार (पापा, मामा, बच्चा), रंग (हरा-भूरा, लाल, आदि), पैटर्न (argyle, प्लेन, आदि)। , शैली (पैर, घुटने-उच्च, आदि)। इसलिए इस्त्री बोर्ड को श्रेणियों के लिए वर्गों में विभाजित किया जाएगा। यह आमतौर पर श्रेणी को स्मृति द्वारा निरंतर समय में स्थित करने की अनुमति देता है, लेकिन तब "बाल्टी" श्रेणी के माध्यम से एक रैखिक खोज की आवश्यकता होती है।

बिना किसी स्मृति या कल्पना के कोई भी व्यक्ति (क्षमा करें) सिर्फ मोजे को एक ढेर में रखेगा और पूरे ढेर की एक रेखीय खोज करेगा।

एक स्वच्छ सनकी जोड़े के लिए संख्यात्मक लेबल का उपयोग कर सकता है जैसा कि किसी ने सुझाव दिया है। यह कुल ऑर्डर करने के लिए दरवाजा खोलता है, जो मानव को ठीक उसी एल्गोरिदम का उपयोग करने की अनुमति देता है जो हम सीपीयू के साथ कर सकते हैं: बाइनरी सर्च, ट्री, हैश, आदि।

तो "सबसे अच्छा" एल्गोरिथ्म वेटवेयर / हार्डवेयर / सॉफ़्टवेयर के गुणों पर निर्भर करता है जो इसे चला रहा है और जोड़े पर कुल आदेश लागू करके "धोखा" देने की हमारी इच्छा है। निश्चित रूप से एक "सर्वश्रेष्ठ" मेटा- अल्गोरिथम दुनिया को सबसे अच्छा सॉकर-सोकर किराए पर लेने के लिए है: एक व्यक्ति या मशीन जो एक विशेष सेट एन-सॉक विशेषता सेट की एक बड़ी मात्रा में N को लगातार समय पर देखने, सम्मिलित करने के साथ एक्वायर और जल्दी से स्टोर कर सकती है; और हटाएं। इस तरह के लोगों और मशीनों दोनों की खरीद की जा सकती है। यदि आपके पास एक है, तो आप एन जोड़े के लिए ओ (एन) समय में सभी मोजे जोड़ सकते हैं, जो कि इष्टतम है। कुल आदेश टैग आपको मानव या हार्डवेयर कंप्यूटर के साथ समान परिणाम प्राप्त करने के लिए मानक हैशिंग का उपयोग करने की अनुमति देते हैं।


ठीक है, यह बेहतर है, हालांकि यह अभी भी काफी गलत है ... यह सवाल उस बारे में नहीं है। चर्च-ट्यूरिंग थीसिस सही है या नहीं, मानव और हमारे कंप्यूटर दोनों सॉक्स को सॉर्ट कर सकते हैं। (वास्तविकता यह है कि, मनुष्य, अत्यधिक परिमित होने के नाते, ट्यूरिंग मशीनों की तुलना में कहीं कम कम्प्यूटेशनल शक्ति है ... और हमारे कंप्यूटरों के बारे में भी यही सच है, लेकिन सीमाएं अलग हैं।)
जिम बेल्टर

मैं असहमत हूं। बेशक हमारे किसी भी वर्तमान कंप्यूटर में टीएम के बजाय अनिवार्य रूप से और डीएफए (मोडुलो आई / ओ मतभेद) हैं। कोई भी एनालॉग डिवाइस, हालांकि, जैसे कि हमारे शरीर, एक अनंत टेप का अनुकरण करने में सक्षम हैं। जिस तरह से हमारे दिमाग की गणना होती है, उसका अब तक कोई उपयोगी लक्षण वर्णन नहीं है।
जीन

मनुष्यों या अन्य भौतिक उपकरणों के लिए कोई अनंत टेप नहीं क्योंकि मानव मस्तिष्क में कुछ भी अनंत संकल्प नहीं है, न ही यह कर सकता है। यह कुछ तंत्रिका विज्ञान सीखने में भी मदद करेगा। किसी भी मामले में, यहां कोई भी गहन दार्शनिक सवाल नहीं था, भले ही आपको एक इंजेक्शन लगाने की इच्छा हो। लेकिन विश्वास करो कि तुम क्या करोगे ... इस तरह की बहस के लिए यह जगह नहीं है और मैंने पहले भी कई बार ऐसा किया है। लेकिन मैं हमेशा ऐसे लोगों द्वारा चकित होता हूं जो मुश्किल से सरल समस्याओं को हल कर सकते हैं (यह हम सभी के लिए है) यह कल्पना करते हुए कि वे टीएम-समतुल्य हैं।
जिम बेल्टर

22

लागत: बढ़ते मोजे -> उच्च, लाइन में खोज / खोज मोजे -> छोटा

हम जो करना चाहते हैं वह चालों की संख्या को कम करता है, और खोजों की संख्या के साथ क्षतिपूर्ति करता है। इसके अलावा, हम होमो सेपियन्स के बहुस्तरीय वातावरण का उपयोग कर सकते हैं ताकि खस्ताहाल कैश में अधिक चीजों को रखा जा सके।

एक्स = तुम्हारा, वाई = आपके पति

सभी मोजे के ढेर से:

दो सॉक्स चुनें, एक्स लाइन में संबंधित एक्स सॉक लगाएं, और वाई स्क्वॉस अगले उपलब्ध स्थिति में वाई लाइन में।

जब तक A खाली न हो जाए।

प्रत्येक पंक्ति X और Y के लिए

  1. पहली जुर्राब को लाइन में चुनें, पंक्ति के साथ तब तक खोजें जब तक वह संबंधित जुर्राब को न खोज ले।

  2. मोजे की संगत समाप्त लाइन में रखो।

  3. वैकल्पिक जब आप लाइन खोज रहे हैं और वर्तमान जुर्राब जिसे आप देख रहे हैं, वह पिछले के समान है, तो इन मोज़ों के लिए चरण 2 करें।

वैकल्पिक रूप से एक को चरणबद्ध करने के लिए, आप दो के बजाय उस पंक्ति से दो जुर्राब उठाते हैं, क्योंकि कैशिंग मेमोरी काफी बड़ी है हम जल्दी से पहचान सकते हैं कि क्या जुर्राब उस रेखा पर वर्तमान एक से मेल खाता है जिसे आप देख रहे हैं। यदि आप तीन हथियार रखने के लिए पर्याप्त भाग्यशाली हैं, तो आप संभवतः एक ही समय में तीन मोज़े पार्स कर सकते हैं, यह देखते हुए कि विषय की स्मृति काफी बड़ी है।

तब तक करें जब तक X और Y दोनों खाली न हों।

किया हुआ

हालाँकि, चूंकि इसमें चयन के रूप में सिमिलर जटिलता है, इसलिए लिया गया समय I / O (चलती मोजे) की गति और खोज (एक जुर्राब के लिए लाइन की खोज) के कारण बहुत कम है।


22

यहां ओमेगा (एन लॉग एन) तुलना आधारित मॉडल में कम बाध्य है। (एकमात्र वैध संचालन दो मोजे की तुलना कर रहा है।)

मान लीजिए कि आप जानते हैं कि आपके 2n मोज़े को इस तरह व्यवस्थित किया गया है:

पी 1 पी 2 पी 3 ... पी एन पी एफ (1) पी एफ (2) ... पी एफ (एन)

जहां f {1,2, ..., n} सेट का अज्ञात क्रम है। यह जानकर समस्या कठिन नहीं हो सकती। वहां नहीं! संभव आउटपुट (पहली और दूसरी छमाही के बीच मिलान), जिसका अर्थ है कि आपको लॉग (n!) = ओमेगा (एन लॉग एन) तुलना की आवश्यकता है। यह छँटाई के द्वारा प्राप्य है।

चूंकि आप तत्व विशिष्टता समस्या के कनेक्शन में रुचि रखते हैं: तत्व भिन्नता के लिए बाध्य ओमेगा (एन लॉग एन) को साबित करना कठिन है, क्योंकि आउटपुट बाइनरी हाँ / नहीं है। यहाँ, आउटपुट को एक मेल होना चाहिए और संभावित आउटपुट की संख्या एक सभ्य बाउंड प्राप्त करने के लिए पर्याप्त है। हालाँकि, तत्व भिन्नता से जुड़ा एक संस्करण है। मान लीजिए कि आपको 2n मोज़े दिए गए हैं और आश्चर्य है कि क्या उन्हें विशिष्ट रूप से जोड़ा जा सकता है। आप एक ( 1 , 2 , ..., n ) को ( 1 , 1 , 1 , 2 , a ) भेजकर ED से कटौती प्राप्त कर सकते हैं 2 , ..., एक n , एक एन )। (पैतृक रूप से, ED की कठोरता का प्रमाण टोपोलॉजी के माध्यम से बहुत दिलचस्प है।)

मुझे लगता है कि मूल समस्या के लिए बाध्य एक ओमेगा (एन 2 ) होना चाहिए यदि आप केवल समानता परीक्षण की अनुमति देते हैं। मेरा अंतर्ज्ञान है: एक ग्राफ पर विचार करें जहां आप एक परीक्षण के बाद एक किनारा जोड़ते हैं, और यह तर्क देते हैं कि यदि ग्राफ़ घने नहीं है, तो उत्पादन विशिष्ट रूप से निर्धारित नहीं है।


19

यह है कि मैं वास्तव में इसे कैसे करता हूं, पी के जोड़े के लिए ( एन = 2 पी व्यक्तिगत मोजे):

  • ढेर से यादृच्छिक पर एक जुर्राब ले लो।
  • पहले जुर्राब के लिए, या यदि पहले से चुने गए सभी मोज़े जोड़े जा चुके हैं, तो बस जुर्राब वाले मोज़े के "सरणी" के पहले "स्लॉट" में जुर्राब रखें।
  • यदि आपके पास एक या अधिक चयनित अनपेक्षित मोज़े हैं, तो सरणी में सभी अनपेक्षित मोज़े के खिलाफ अपने वर्तमान जुर्राब की जाँच करें।
    • अपने सरणी का निर्माण करते समय मोजे को सामान्य वर्गों या प्रकारों (सफेद / काला, टखने / चालक दल, एथलेटिक / ड्रेस) में अलग करना संभव है और "ड्रिल-डाउन" की तरह केवल समान के लिए तुलना करें।
    • यदि आप एक स्वीकार्य मैच पाते हैं, तो दोनों मोज़ों को एक साथ रखें और उन्हें सरणी से हटा दें।
    • यदि आप नहीं करते हैं, तो सरणी में पहले खुले स्लॉट में वर्तमान जुर्राब डालें।
  • हर सॉक के साथ दोहराएं।

इस योजना का सबसे खराब स्थिति यह है कि हर जोड़ी के मोज़े अलग-अलग होते हैं, जिनका मिलान बिलकुल सही होना चाहिए और यह कि आपके द्वारा चुने गए पहले n / 2 मोज़े बिल्कुल अलग हैं। यह आपका O (n 2 ) परिदृश्य है, और यह अत्यंत संभावना नहीं है। यदि sock t के अद्वितीय प्रकारों की संख्या, जोड़े p = n / 2 की संख्या से कम है , और प्रत्येक प्रकार के मोज़े पर्याप्त रूप से समान हैं (आमतौर पर पहनने से संबंधित शब्दों में) कि किसी भी प्रकार के जुर्राब को किसी के साथ जोड़ा जा सकता है अन्य, फिर जैसा कि मैंने ऊपर अनुमान लगाया है, आपके द्वारा तुलना किए जाने वाले मोज़े की अधिकतम संख्या टी होगी , जिसके बाद अगले एक पुल को आप खींच लेंगेएक बिना जुराबों के मैच करें। इस परिदृश्य बुरी से बुरी हालत की तुलना में औसत जुर्राब दराज में बहुत अधिक संभावना है, और बुरी से बुरी हालत जटिलता को कम कर देता है हे (एन * टी) जहां आमतौर पर टी << एन


1
यह शायद मेरी मानसिक प्रक्रिया के काफी करीब है। मेरे पास पूर्व-प्रकार अनुकूलन की एक अतिरिक्त परत है। मेरे एथलेटिक मोज़े गोरों से धोए जाते हैं और मेरी ड्रेस के मोज़े रंगों से धोए जाते हैं। इसका मतलब यह है कि जब तक मैं एक साथ कपड़े धोने के दो भार को डंप नहीं करता हूं, मेरे मोजे पहले से ही प्रकार से समूहीकृत हैं। सफेद लोड वास्तव में तेजी से (कई समान मोजे) जाता है, लेकिन पोशाक मोजे लंबे समय तक ले जाते हैं। अन्य प्रमुख टिप - सॉर्ट के लिए और अधिक उपलब्ध मेमोरी बनाएं (पहले सभी गैर-मोजे को हटा दें और उन्हें
जोड़ दें

17

वास्तविक दुनिया दृष्टिकोण:

जितनी जल्दी हो सके, एक बार में पाइल को अनसोल्ड पाइल से हटा दें और बवासीर को अपने सामने रखें। बवासीर को कुछ जगह-कुशलता से व्यवस्थित किया जाना चाहिए, जिसमें सभी मोज़े एक ही दिशा की ओर इशारा करते हैं; बवासीर की संख्या आप आसानी से पहुँच सकते हैं दूरी से सीमित है। एक ढेर का चयन जिस पर एक जुर्राब डालना चाहिए - जितनी जल्दी हो सके - जाहिरा तौर पर मोज़े के ढेर पर एक जुर्राब डालकर; कभी-कभी टाइप I (ढेर पर एक जुर्राब डालने से यह नहीं होता है) या टाइप II (अपने स्वयं के ढेर में एक जुर्राब डालते समय जब मोजे की तरह एक मौजूदा ढेर होता है) त्रुटि बर्दाश्त की जा सकती है - सबसे महत्वपूर्ण विचार गति है

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


15

आपके प्रश्न से यह स्पष्ट है कि आपके पास लॉन्ड्री के साथ वास्तविक अनुभव नहीं है :)। आपको एक एल्गोरिथ्म की आवश्यकता होती है जो कम संख्या में गैर-पहनने योग्य मोजे के साथ अच्छी तरह से काम करता है।

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


यह आमतौर पर है कि मैं इसे कैसे करता हूं। हर बार सभी शेष मोज़ों के माध्यम से पुनरावृत्ति करने से बेहतर काम करता है।
यौ_ओमिनाई

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

मुझे लगता है कि यह मूल रूप से अन्य उत्तर के समान है, जनवरी 20 से stackoverflow.com/a/14423956 , दोनों +1। मानव दृष्टि प्रणाली व्यापक रूप से समानांतर है।
विल नेस

15

पहले जुर्राब उठाओ और इसे एक मेज पर रखें। अब एक और जुर्राब उठाओ; यदि यह पहले चुने से मेल खाता है, तो इसे पहले के ऊपर रखें। यदि नहीं, तो इसे मेज पर पहले से थोड़ी दूरी पर रखें। तीसरा जुर्राब उठाओ; यदि यह पिछले दो में से किसी एक से मेल खाता है, तो इसे उनके ऊपर रखें या फिर इसे तीसरे से थोड़ी दूरी पर रखें। तब तक दोहराएं जब तक आप सभी मोज़े नहीं उठा लेते।


1
यह एकमात्र मान्य उत्तर है। अन्य सभी इस तथ्य की अवहेलना करते हैं कि अधिकांश समय समान मोजे के बीच अंतर करने में बिताया जाता है (इसलिए उन सभी को शारीरिक रूप से एक साथ जोड़कर इसे और भी बदतर बना दिया जाता है)।
एंटोनियो

मौज-मस्ती के लिए मैंने मोजे के इस तरीके को एक छोटे से अजगर कार्यक्रम gist.github.com/justinfay/53b574cf0a492f6795ef पर लिखा
जस्टिन फे

12

यह कहने के लिए कि ढेर से मोज़े बाँधना कितना कारगर है, हमें पहले मशीन को परिभाषित करना होगा, क्योंकि बाँधना न तो ट्यूरिंग के द्वारा किया जाता है और न ही रैंडम एक्सेस मशीन द्वारा, जिसे आम तौर पर आधार के रूप में उपयोग किया जाता है। एल्गोरिथम विश्लेषण।

यंत्र

मशीन एक वास्तविक दुनिया तत्व का एक अमूर्त हिस्सा है जिसे इंसान कहा जाता है। यह पर्यावरण से आंखों की एक जोड़ी के माध्यम से पढ़ने में सक्षम है। और हमारे मशीन मॉडल 2 हथियारों का उपयोग करके पर्यावरण में हेरफेर करने में सक्षम है। तार्किक और अंकगणितीय संचालन की गणना हमारे मस्तिष्क (उम्मीद ;-)) का उपयोग करके की जाती है।

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

हालाँकि यांत्रिक भौतिकी हमें कुछ अच्छाई भी देती है। हम एक हाथ से अधिकतम एक जुर्राब पर जाने के लिए सीमित नहीं हैं। हम एक बार में उनमें से एक पूरे जोड़े को स्थानांतरित कर सकते हैं।

इसलिए पिछले विश्लेषण के आधार पर निम्नलिखित कार्यों का उपयोग अवरोही क्रम में किया जाना चाहिए:

  • तार्किक और अंकगणित संचालन
  • पर्यावरण पढ़ता है
  • पर्यावरण संशोधन

हम इस तथ्य का भी उपयोग कर सकते हैं कि लोगों के पास बहुत सीमित मात्रा में मोज़े हैं। तो एक पर्यावरण संशोधन ढेर में सभी मोजे शामिल कर सकते हैं।

एल्गोरिथ्म

तो यहाँ मेरा सुझाव है:

  1. फर्श पर ढेर में सभी मोजे फैलाएं।
  2. फर्श पर मोजे को देखकर एक जोड़ी का पता लगाएं।
  3. 2 से दोहराएँ जब तक कोई जोड़ी नहीं बनाई जा सकती।
  4. 1 से दोहराएं जब तक कि फर्श पर कोई मोज़े न हों।

ऑपरेशन 4 आवश्यक है, क्योंकि जब फर्श पर मोज़े फैलते हैं तो कुछ मोजे दूसरों को छिपा सकते हैं। यहाँ एल्गोरिथ्म का विश्लेषण है:

विश्लेषण

एल्गोरिथ्म उच्च संभावना के साथ समाप्त होता है। यह इस तथ्य के कारण है कि कोई चरण 2 में मोजे के जोड़े को खोजने में असमर्थ है।

nमोजे के जोड़े के युग्मन के निम्नलिखित क्रम विश्लेषण के लिए , हम मानते हैं कि 2nचरण 1 के बाद कम से कम आधे मोज़े छिपे नहीं हैं। इसलिए औसत मामले में हम n/2जोड़े पा सकते हैं । इसका मतलब यह है कि लूप चरण 4 है निष्पादित O(log n)समय। चरण 2 को निष्पादित किया जाता O(n^2)है। तो हम निष्कर्ष निकाल सकते हैं:

  • एल्गोरिदम में O(ln n + n)पर्यावरणीय संशोधन (चरण 1) शामिल हैंO(ln n) मंजिल से जुर्राब के प्रत्येक जोड़े को उठाते हुए)
  • एल्गोरिथ्म में शामिल है O(n^2) चरण 2 से पर्यावरण रीड है
  • एल्गोरिथ्म O(n^2)में चरण 2 में एक जुर्राब की तुलना करने के लिए तार्किक और अंकगणितीय संचालन शामिल हैं

तो हमारे पास कुल रनटाइम जटिलता है O(r*n^2 + w*(ln n + n))जहां rऔर wउचित मात्रा में मोजे के लिए पर्यावरण पढ़ने और पर्यावरण लिखने के संचालन के लिए कारक हैं। तार्किक और अंकगणितीय संचालन की लागत को छोड़ दिया जाता है, क्योंकि हम मानते हैं कि यह तय करने के लिए तार्किक और अंकगणितीय संचालन की निरंतर मात्रा लेता है कि क्या 2 मोजे एक ही जोड़ी के हैं। यह हर परिदृश्य में संभव नहीं है।



@WillNess Yep, स्पष्टीकरण का थोड़ा और साथ
स्पेसटुकर

12
List<Sock> UnSearchedSocks = getAllSocks();
List<Sock> UnMatchedSocks = new list<Sock>();
List<PairOfSocks> PairedSocks = new list<PairOfSocks>();

foreach (Sock newSock in UnsearchedSocks)
{
  Sock MatchedSock = null;
  foreach(Sock UnmatchedSock in UnmatchedSocks)
  {
    if (UnmatchedSock.isPairOf(newSock))
    {
      MatchedSock = UnmatchedSock;
      break;
    }
  }
  if (MatchedSock != null)
  {
    UnmatchedSocks.remove(MatchedSock);
    PairedSocks.Add(new PairOfSocks(MatchedSock, NewSock));
  }
  else
  {
    UnmatchedSocks.Add(NewSock);
  }
}

12

मैं एक और समाधान के साथ आया, जो न तो कम संचालन का वादा करेगा, न ही कम समय की खपत, लेकिन यह देखने की कोशिश की जानी चाहिए कि क्या यह बहुत अच्छी श्रृंखला के लिए समय की खपत को कम करने के लिए एक अच्छा पर्याप्त अनुमान हो सकता है।

पूर्व शर्त: इसमें कोई गारंटी नहीं है कि एक ही मोजे हैं। यदि वे एक ही रंग के हैं तो इसका मतलब यह नहीं है कि उनका आकार या पैटर्न समान है। मोजे बेतरतीब ढंग से फेरबदल कर रहे हैं। मोजे की विषम संख्या हो सकती है (कुछ गायब हैं, हम नहीं जानते कि कितने)। एक चर "सूचकांक" को याद करने के लिए तैयार करें और इसे 0 पर सेट करें।

परिणाम में एक या दो ढेर होंगे: 1. "मिलान" और 2. "लापता"

अनुमानी:

  1. सबसे विशिष्ट जुर्राब खोजें।
  2. इसका मैच खोजें।
  3. यदि कोई मेल नहीं है, तो इसे "लापता" ढेर पर डालें।
  4. 1. से दोहराएं जब तक कोई सबसे अधिक विशिष्ट मोज़े न हों।
  5. यदि कम हैं, तो 6 मोज़े, 11 पर जाएं।
  6. अपने पड़ोसी को आँख बंद करके सभी मोजे दें (इसे पैक न करें)
  7. सभी मिलान जोड़े का पता लगाएं, इसे पैक करें और पैक्ड जोड़े को "मिलान" ढेर में स्थानांतरित करें; यदि कोई नया मैच नहीं था - वेतन वृद्धि "सूचकांक" 1 से
  8. यदि "इंडेक्स" अधिक है तो 2 (यह जुर्राब संख्या पर निर्भर हो सकता है क्योंकि अधिक से अधिक सॉक्स के साथ उन्हें आँख बंद करके बाँधने की संभावना कम होती है) 11 पर जाएं
  9. शेष को फेरबदल करें
  10. 1 पर जाएं
  11. "सूचकांक" को भूल जाओ
  12. एक जुर्राब उठाओ
  13. इसकी जोड़ी का पता लगाएं
  14. यदि जुर्राब के लिए कोई जोड़ी नहीं है, तो इसे "लापता" ढेर में स्थानांतरित करें
  15. यदि मैच पाया गया है, तो इसे पैक करें और इसे "मिलान" ढेर पर ले जाएं
  16. यदि अभी भी अधिक हैं तो एक मोज़े 12 पर जाते हैं
  17. अगर वहाँ सिर्फ एक है 14 जाने के लिए छोड़ दिया है
  18. मुस्कुरा के संतुष्ट हो गए :)

इसके अलावा, क्षतिग्रस्त मोज़े के लिए चेक भी जोड़ा जा सकता है, जैसे कि उन को हटाना। यह 2 और 3 के बीच, और 13 और 14 के बीच डाला जा सकता है।

मैं किसी भी अनुभव या सुधार के बारे में सुनने के लिए उत्सुक हूं।


यह लिखने के बाद, मैं हर बार इसका उपयोग करता हूं। इसने मुझे थोड़ा और कुशल बनने में मदद की और नौकरी अब कम उबाऊ है।
सास

11

जब मैं सॉक्स सॉर्ट करता हूं, तो मैं एक अनुमानित रेडिक्स सॉर्ट करता हूं , उसी कलर / पैटर्न टाइप के अन्य सॉक्स के पास सॉक्स ड्रॉप करता हूं । उस स्थिति को छोड़कर जब मैं उस स्थान पर / उसके पास एक सटीक मिलान देख सकता / सकती हूँ जो मैं उस बिंदु पर जोड़ी को निकालने के लिए कर रही हूँ।

लगभग सभी अन्य एल्गोरिदम ( usr द्वारा शीर्ष स्कोरिंग उत्तर सहित) ) सॉर्ट करें, फिर जोड़े निकालें। मुझे लगता है कि, एक इंसान के रूप में, एक बार में विचार किए जा रहे मोजे की संख्या को कम करना बेहतर है।

मैं इसके द्वारा करता हूं:

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

यह O (1) समय में फ़ज़ी-मैच के लिए मानव क्षमता का लाभ उठाता है, जो कंप्यूटिंग डिवाइस पर हैश-मैप की स्थापना के कुछ हद तक बराबर है।

पहले विशिष्ट मोजे खींचकर, आप उन विशेषताओं पर "ज़ूम" करने के लिए जगह छोड़ते हैं जो कम विशिष्ट हैं, जिनके साथ शुरू करना है।

फ़्लोरो रंग को समाप्त करने के बाद, धारियों के साथ मोज़े, और लंबे मोजे के तीन जोड़े, आप ज्यादातर सफेद मोजे के साथ समाप्त हो सकते हैं जो मोटे तौर पर कैसे पहने जाते हैं।

कुछ बिंदु पर, मोज़े के बीच का अंतर काफी छोटा है कि अन्य लोग अंतर को नोटिस नहीं करेंगे, और किसी भी अन्य मिलान के प्रयास की आवश्यकता नहीं है।


10

जब भी आप एक जुर्राब उठाएं, उसे एक जगह पर रख दें। फिर अगला जुर्राब, जिसे आप उठाते हैं, अगर यह पहली सॉक से मेल नहीं खाता है, तो इसे पहले वाले के बगल में सेट करें। यदि ऐसा होता है, तो एक जोड़ी है। इस तरह यह वास्तव में मायने नहीं रखता है कि कितने संयोजन हैं, और आपके द्वारा चुने गए प्रत्येक जुर्राब के लिए केवल दो संभावनाएं हैं - या तो इसका एक मैच है जो आपके मोज़े में पहले से ही है, या यह नहीं है, जिसका मतलब है कि आप इसे सरणी में एक स्थान पर जोड़ें।

इसका मतलब यह भी है कि आप सरणी में अपने सभी मोजे लगभग निश्चित रूप से कभी नहीं होंगे, क्योंकि वे मिलान के रूप में मोजे हटा दिए जाएंगे।


यह वही है जो मैं करता हूं ... ओ (एन)
पायलक

2
@ पाइकलर - यह सबसे अच्छा मामले में ओ (एन) और सबसे खराब स्थिति में ओ (एन * एन) है।
विल्क्स- २०'१३

2
यह मानकर कि आप पहले से ही देखे गए सभी मोज़ों के लिए अपने दिमाग में एक पूरी तरह से अद्वितीय हैश नहीं बना सकते हैं, जो मेरे लिए एक जुर्राब से मेल खाने के लिए एक ओ (1) है जिसे मैंने देखा है और पहले और मिलान हैश
पायलियर

10

आकार 'N' के हैश-टेबल पर विचार करें।

यदि हम सामान्य वितरण को मान लेते हैं, तो 'सम्मिलन' की अनुमानित संख्या में कम से कम एक बाल्टी में एक नकली मैप है, जो NlogN है (यानी, सभी बाल्टी भरी हुई हैं)

मैंने इसे एक और पहेली के हिस्से के रूप में लिया था, लेकिन मुझे गलत साबित होने में खुशी होगी। उसी पर मेरा ब्लॉग लेख है

चलो 'एन' अद्वितीय रंगों / मोजे के पैटर्न की संख्या की संख्या पर एक ऊपरी-सीमा के अनुरूप है जो आपके पास है।

एक बार जब आपकी टक्कर होती है (उर्फ: एक मैच) तो बस उस जोड़ी को हटा दें। NlogN मोजे के अगले बैच के साथ एक ही प्रयोग दोहराएं। इसका सौंदर्य यह है कि जिस तरह से मानव मन काम करता है, आप एनएलएलएन समानांतर तुलना (टक्कर-संकल्प) कर सकते हैं। :-)


10

मोजे, चाहे असली या कुछ अनुरूप डेटा संरचना, जोड़े में आपूर्ति की जाएगी।

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

यह किसी भी कम्प्यूटेशनल युग्मन समस्या को अमूर्त की एक परत के साथ हटाकर हल करता है।

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

दो भौतिक संभावनाएं हैं:

एक 'जोड़ी' ऑब्जेक्ट के लिए जो प्रत्येक जुर्राब के लिए एक संकेतक रखता है हमारे पास एक कपड़ा बैग हो सकता है जिसका उपयोग हम मोज़े को एक साथ रखने के लिए करते हैं। यह बड़े पैमाने पर उपरि की तरह लगता है।

लेकिन प्रत्येक जुर्राब के लिए दूसरे का संदर्भ रखने के लिए, एक साफ समाधान है: एक पॉपर (या 'स्नैप बटन' यदि आप अमेरिकी हैं), जैसे कि ये:

http://www.aliexpress.com/compare/compare-invisible-snap-buttons.html

फिर आप सभी अपने मोज़े को एक साथ स्नैप करके ठीक करने के बाद उन्हें अपने कपड़े धोने की टोकरी में डालते हैं, और फिर से आपने अपने मोज़े को 'जोड़ी' की अवधारणा के भौतिक अमूर्त के साथ जोड़ने की आवश्यकता की समस्या को दूर कर दिया है।


यह सवाल का जवाब नहीं देता है, क्योंकि पहले से ही युग्मित डेटा के साथ काम करना आसान है, सवाल यह है कि जब डेटा UNPAIRED हो और क्या आप इसे पेयर करना चाहते हैं।
अमित

8

यदि "चाल" ऑपरेशन काफी महंगा है, और "तुलना" ऑपरेशन सस्ता है, और आपको पूरे सेट को वैसे भी एक बफर में स्थानांतरित करने की आवश्यकता है, जहां खोज मूल भंडारण की तुलना में बहुत तेज है ... बस अनिवार्य में छंटाई को एकीकृत करें चलते हैं।

मैंने पाया कि इसे सुखाने के लिए लटकाने की प्रक्रिया को एकीकृत करके इसे एक हवा बना दिया गया है। मुझे वैसे भी प्रत्येक जुर्राब को लेने की जरूरत है, और इसे लटकाओ (आगे बढ़ाओ) और इसे तार पर एक विशिष्ट स्थान पर लटका देने के लिए मुझे कुछ भी खर्च नहीं करना है। अब बस पूरे बफर (स्ट्रिंग्स) की खोज को मजबूर करने के लिए नहीं हूं, मैं रंगों / छाया द्वारा मोज़े रखने का विकल्प चुनता हूं। गहरा बायां, चमकीला दायां, अधिक रंगीन मोर्चा आदि। अब प्रत्येक जुर्राब को लटकाने से पहले, मैं इसकी "दाईं ओर" देखता हूं, अगर एक मेल पहले से ही है - यह सीमा 2-3 अन्य मोजे के लिए "स्कैन" करता है - और यदि है , मैं इसके ठीक बगल में एक दूसरे को लटका देता हूं। फिर मैं उन्हें तारों में से रोल करता हूं, जब स्ट्रिंग्स से निकालते हैं, जब सूख जाता है।

अब यह सब नहीं लग सकता है कि शीर्ष उत्तरों द्वारा सुझाए गए "रंग द्वारा बवासीर बनाने" से अलग, लेकिन पहले, असतत बवासीर को उठाकर लेकिन पर्वतमाला, मुझे यह वर्गीकृत करने में कोई समस्या नहीं है कि क्या "बैंगनी" "लाल" या "नीला" ढेर जाता है; यह बस के बीच चला जाता है। और फिर दो ऑपरेशनों को एकीकृत करके (हैंग टू ड्राई और सॉर्ट) हैंगिंग करते समय सॉर्टिंग का ओवरहेड 10% की तरह है जो अलग-अलग सॉर्टिंग होगा।


इस दृष्टिकोण के दो अन्य फायदे हैं: लाइन-ड्रायिंग ड्रायर की तुलना में कई कम मोज़े आईएमई खो देता है, और बाकी कपड़े धोने के लिए सॉर्ट प्रक्रिया को बढ़ाया जा सकता है, इसलिए (जैसे) सभी तौलिए एक दूसरे के पास होते हैं जिन्हें बंद किया जाता है लाइन और बिनेड और सीधे उनके भंडारण में ले जाया गया। यह दो निम्न-प्रयास पास में भी काम करता है, कपड़े को ऊपर उठाता है और फिर से नीचे ले जाता है।
cphlewis

8

मैंने अभी अपने मोज़े बाँधना पूरा किया है, और मैंने पाया कि इसे करने का सबसे अच्छा तरीका निम्नलिखित है:

  • मोजे में से किसी एक को चुनें और इसे दूर रखें (उस जोड़ी के लिए एक 'बाल्टी' बनाएं)
  • यदि अगला एक पिछले एक की जोड़ी है, तो इसे मौजूदा बाल्टी में डाल दें, अन्यथा एक नया बनाएं।

सबसे खराब स्थिति में इसका मतलब है कि आपके पास n / 2 अलग बाल्टियाँ होंगी, और आपके पास n-2 निर्धारण इस बारे में होंगे कि किस बाल्टी में वर्तमान जुर्राब की जोड़ी है। जाहिर है, यह एल्गोरिथ्म अच्छी तरह से काम करता है यदि आपके पास बस कुछ जोड़े हैं; मैंने इसे 12 जोड़े के साथ किया।

यह इतना वैज्ञानिक नहीं है, लेकिन यह अच्छी तरह से काम करता है :)


यह तब भी एक O (n ^ 2) एल्गोरिदम है क्योंकि जब भी आप एक नया जुर्राब निकालते हैं तो आपको प्रत्येक बाल्टी पर पुनरावृत्त करना पड़ता है। लेकिन, इस तथ्य पर विचार करते हुए कि समान बैच के भीतर खरीदे गए मोजे में भी मामूली अंतर होता है जो उन्हें प्रभावी ढंग से जोड़ी-अद्वितीय (या एकल-अद्वितीय) भी प्रस्तुत करता है, वैसे भी कोई बेहतर तरीका नहीं है
सेमिनिक

सहमत हूं, लेकिन मेरा एल्गोरिथ्म मान रहा है कि मानव युग्मन कर रहा है। इसलिए, जब आप मिलान बाल्टी की खोज कर रहे हैं, तो आपके दिमाग में एक प्रकार का कैश होगा, इसलिए आपको वास्तव में वैसे भी बाल्टी पर पुनरावृति करने की आवश्यकता नहीं है। सुनिश्चित नहीं है कि युग्मन के दौरान मेरे कैशिंग तंत्र के लिए किस प्रकार की डेटा संरचना बनाई गई है।
मेस्ट्रो

8

मेरा समाधान आपकी आवश्यकताओं के अनुरूप नहीं है, क्योंकि औपचारिक रूप से इसकी आवश्यकता है O(n) "अतिरिक्त" स्थान की है। हालांकि, मेरी स्थितियों को देखते हुए यह मेरे व्यावहारिक अनुप्रयोग में बहुत कुशल है। इस प्रकार मुझे लगता है कि यह दिलचस्प होना चाहिए।

अन्य कार्य के साथ गठबंधन

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

Oracle मशीन बेहतर है; ;-)

यह स्पष्ट रूप से जांचने के लिए कुछ अतिरिक्त कार्य की आवश्यकता है कि क्या पहले से कहीं मेल खाने वाला जुर्राब है और यह एक कंप्यूटर के लिए O(n^2)गुणांक के साथ समाधान प्रस्तुत करेगा 1/2। लेकिन इस मामले में "मानव कारक" वास्तव में एक फायदा है - मैं आमतौर पर बहुत जल्दी (लगभग O(1)) मिलान जुर्राब की पहचान कर सकता हूं अगर यह पहले से ही लटका हुआ था (शायद कुछ अगोचर मस्तिष्क कैशिंग शामिल है) - इसे एक तरह का विचार करें Oracle मशीन के रूप में सीमित "ओरेकल" ;-) हम, कुछ मामलों में डिजिटल मशीनों पर मनुष्यों के ये फायदे हैं;;

यह लगभग है O(n) !

इस प्रकार से मोज़े बाँधने की समस्या को लटकते हुए कपड़े की समस्या से जोड़ने से मुझे O(n)मुफ्त में "अतिरिक्त जगह" मिलती है , और इसका एक हल है जो O(n)समय के बारे में है, इसके लिए साधारण लटकने वाले कपड़े की तुलना में बस थोड़ा अधिक काम करने की आवश्यकता होती है और तुरंत पूरी जोड़ी का उपयोग करने की अनुमति देता है बहुत बुरा सोमवार सुबह भी मोजे ... ;-)


8

मुझे उम्मीद है कि मैं इस समस्या में कुछ नया योगदान दे सकता हूं। मैंने देखा कि सभी उत्तर इस तथ्य की उपेक्षा करते हैं कि दो बिंदु हैं जहां आप प्रीप्रोसेसिंग कर सकते हैं अपने कपड़े धोने के प्रदर्शन को धीमा करने के बिना ।

इसके अलावा, हमें बड़े परिवारों के लिए भी बड़ी संख्या में मोजे पहनने की जरूरत नहीं है। मोजे को दराज से बाहर निकाला जाता है और पहना जाता है, और फिर उन्हें एक जगह (शायद एक बिन) फेंक दिया जाता है जहां वे लुटेरा होने से पहले रहते हैं। हालांकि मैं बिन लाईफो-स्टैक नहीं कहूंगा, मैं कहूंगा कि यह मान लेना सुरक्षित है

  1. लोग बिन के एक ही क्षेत्र में अपने दोनों मोज़े टॉस करते हैं,
  2. बिन किसी भी बिंदु पर यादृच्छिक नहीं है, और इसलिए
  3. इस बिन के शीर्ष से लिए गए किसी भी उपसमुच्चय में आम तौर पर एक जोड़ी के दोनों मोज़े होते हैं।

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

हमारे दो प्रीप्रोसेसिंग चरण "कपड़े पर मोज़े डाल रहे हैं" और "कपड़े से मोज़े लेना", जो हमें करना है, ताकि मोज़े न केवल साफ हों बल्कि सूखे भी हों। वाशिंग मशीन की तरह, कपड़े की परतें बारीक होती हैं, और मुझे लगता है कि हमारे पास उस लाइन का पूरा हिस्सा है जहां हम अपने मोज़े देखते हैं।

यहाँ put_socks_on_line () के लिए एल्गोरिथ्म है:

while (socks left in basket) {
 take_sock();
 if (cluster of similar socks is present) { 
   Add sock to cluster (if possible, next to the matching pair)
 } else {
  Hang it somewhere on the line, this is now a new cluster of similar-looking socks.      
  Leave enough space around this sock to add other socks later on 
 }
}

अपने समय को मोज़े इधर-उधर घुमाने या सबसे अच्छे मैच की तलाश में बर्बाद न करें, यह सब O (n) में किया जाना चाहिए, जिसे हमें बिना लाइन के बस डालने की भी आवश्यकता होगी। मोज़े अभी तक जोड़े नहीं गए हैं, हमारे पास केवल लाइन पर कई समानता वाले क्लस्टर हैं। यह मददगार है कि हमारे यहाँ मोजे का एक सीमित सेट है, क्योंकि इससे हमें "अच्छे" क्लस्टर बनाने में मदद मिलती है (उदाहरण के लिए, अगर मोज़े के सेट में केवल काले मोज़े हैं, तो रंगों द्वारा क्लस्टर करना रास्ता नहीं होगा)

यहां टेक_सूक्स_फ्रॉम_लाइन () के लिए एल्गोरिथ्म दिया गया है:

while(socks left on line) {
 take_next_sock();
 if (matching pair visible on line or in basket) {
   Take it as well, pair 'em and put 'em away
 } else {
   put the sock in the basket
 }

मुझे यह इंगित करना चाहिए कि शेष चरणों की गति में सुधार करने के लिए, यह बुद्धिमानी है कि बेतरतीब ढंग से अगला जुर्राब न उठाएं, लेकिन क्रमिक रूप से प्रत्येक क्लस्टर से जुर्राब के बाद जुर्राब लेना चाहिए। दोनों प्रीप्रोसेसिंग कदमों को केवल मोज़े को लाइन में या टोकरी में रखने से ज्यादा समय नहीं लगता है, जो कि हमें कोई फर्क नहीं पड़ता है, इसलिए इसे कपड़े धोने के प्रदर्शन में वृद्धि करनी चाहिए।

इसके बाद, हैश विभाजन एल्गोरिथ्म को करना आसान है। आमतौर पर, लगभग 75% मोज़े पहले से ही जोड़े जाते हैं, मुझे मोजे के बहुत छोटे उपसमूह के साथ छोड़ दिया जाता है, और यह सबसेट पहले से ही (कुछ हद तक) संकुलित है (मैं प्रीप्रोसेसिंग चरणों के बाद अपनी टोकरी में बहुत एंट्रॉपी का परिचय नहीं देता हूं)। एक और बात यह है कि बचे हुए गुच्छों को एक बार में संभाला जा सकता है, इसलिए टोकरी से पूरे गुच्छे को निकालना संभव है।

यहाँ Sort_remaining_clusters () के लिए एल्गोरिथ्म है:

while(clusters present in basket) {
  Take out the cluster and spread it
  Process it immediately
  Leave remaining socks where they are
}

उसके बाद, कुछ ही मोज़े बचे हैं। यह वह जगह है जहां मैं सिस्टम में पहले से अनपेक्षित मोज़े पेश करता हूं और किसी विशेष एल्गोरिथ्म के बिना शेष मोज़े को संसाधित करता हूं - शेष मोज़े बहुत कम हैं और नेत्रहीन बहुत तेजी से संसाधित किए जा सकते हैं।

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

मुझे पता है कि ये एल्गोरिदम बहुत सारी धारणाएँ लेते हैं: एक बिन जो लिफो स्टैक के कुछ प्रकार के रूप में कार्य करता है, एक सीमित, सामान्य कपड़े धोने की मशीन, और एक सीमित, सामान्य कपड़े - लेकिन यह अभी भी बहुत बड़ी संख्या में मोजे के साथ काम करता है।

समानता के बारे में: जब तक आप दोनों मोज़ों को एक ही बिन में टॉस नहीं करते, आप आसानी से उन सभी चरणों को समानांतर कर सकते हैं।


कुछ डेटाबेस में मनमानी वस्तुओं की जोड़ी के लिए मोजे केवल रूपक हैं।
अमित

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

1
इसके अलावा, आपको 2k अपवॉट्स नहीं मिले क्योंकि आपने डेटाबेस में मनमानी वस्तुओं को जोड़ने के बारे में एक सवाल पूछा था। आपने विशेष रूप से मोज़े की प्रकृति (जो आप डेटा के विपरीत नकल नहीं कर सकते हैं) के कारण प्रश्न को विवश किया है, आपने इस तथ्य का उपयोग करने के लिए भी प्रोत्साहित किया है कि आप आसानी से अपने पति या पत्नी के मोजे से अंतर कर सकते हैं। यदि आप मोज़े के बारे में एक सवाल पूछते हैं, तो डेटाबेस के बारे में जवाबों की उम्मीद न करें;;
फिलिप फ़्लेनकर

1
कुछ धारणाएँ हैं: एक सामान्य धुलाई माशीन, एक सामान्य कपड़े, और तथ्य यह है कि आप एक ही समय में बिन में दोनों मोजे टॉस करते हैं, जिसका अर्थ है कि ज्यादातर मामलों में दोनों मोजे एक ही मशीन में हैं, और संख्या बचे हुए मोजे को छांटना है इसलिए छोटा है। लेकिन जब से आप वास्तव में डेटाबेस में मनमानी वस्तुओं को संग्रहीत करने के बारे में एक उत्तर चाहते थे, क्या यह वास्तव में मेरे समाधान की चर्चा कर रहा है?
फिलिप फ्लेंकर

1
जैसा कि मैंने कहा, मुझे लगता है कि मैंने तत्व विशिष्टता समस्या को छोड़कर आपके द्वारा मांगी गई हर चीज को संबोधित किया, जिसका उत्तर अन्य लोगों ने दिया है। मैं यहां डौश होने की कोशिश नहीं कर रहा हूं, लेकिन मैंने थोड़ी देर पहले ही इस जवाब में बहुत प्रयास किया है, और मैं हल्के से निराश हूं कि अब आप कुछ उत्तरों से गुजरते हैं और दावा करते हैं कि उन्होंने मूल प्रश्न का उत्तर नहीं दिया । आप केवल पूरे धागे को अकेले क्यों नहीं छोड़ते हैं - यह अभी भी एक दिलचस्प पढ़ा है, 2 साल से अधिक समय बाद आपने इसे पूछा?
फिलिप फ्लेंकर

8

मैंने ओ (1) समय लेने की प्रक्रिया में अपने प्रयास को कम करने के लिए सरल कदम उठाए हैं।

दो प्रकार के मोजे (मनोरंजन के लिए सफेद मोज़े, काम के लिए काले मोज़े) में मेरे इनपुट को कम करके, मुझे केवल यह निर्धारित करने की आवश्यकता है कि मेरे पास कौन से दो मोज़े हैं। (तकनीकी रूप से, चूंकि वे कभी एक साथ नहीं धोए जाते हैं, मैंने प्रक्रिया को ओ (0) समय तक घटा दिया है।)

वांछनीय मोजे खोजने के लिए, और अपने मौजूदा मोजे की आवश्यकता को समाप्त करने के लिए पर्याप्त मात्रा में खरीद करने के लिए कुछ अग्रिम प्रयास की आवश्यकता होती है। जैसा कि मैंने काले मोजे की आवश्यकता से पहले ऐसा किया है, मेरा प्रयास न्यूनतम था, लेकिन लाभ भिन्न हो सकता है।

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


7

हैश के रूप में पैटर्न का उपयोग करते हुए, बेजोड़ मोजे के लिए उपयोग किया जाएगा जो एक हैश तालिका बनाएँ। एक-एक करके मोज़े के ऊपर डालें। अगर हैश तालिका में पैटर्न मैच है, तो मेज से जुर्राब लें और एक जोड़ी बनाएं। यदि जुर्राब का मिलान नहीं होता है, तो इसे तालिका में डालें।


यह कैसे नहीं किया जाना चाहिए, जैसा कि विशेष रूप से प्रश्न में वर्णित है?
अमित

7

आपके n जोड़े को सॉर्ट करने की समस्या O (n) है । इससे पहले कि आप उन्हें कपड़े धोने की टोकरी में फेंक दें , आप बाएं एक को दाईं ओर थ्रेड करते हैं। उन्हें बाहर निकालने पर, आप धागे को काटते हैं और प्रत्येक जोड़ी को अपने दराज में डालते हैं - एन जोड़े पर 2 ऑपरेशन, इसलिए ओ (एन)।

अब अगला सवाल बस यह है कि क्या आप अपनी लॉन्ड्री करते हैं और आपकी पत्नी उसे करती है। समस्याओं की एक पूरी तरह से अलग डोमेन में एक समस्या होने की संभावना है । :)


यह सवाल का जवाब नहीं देता है, जहां मोज़े केवल एक रूपक हैं।
अमित

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