फिशर-येट्स शफ़ल एल्गोरिदम की जटिलता


15

यह प्रश्न फिशर-येट्स एल्गोरिदम के संबंध में एक दिए गए सरणी के यादृच्छिक फेरबदल को लौटाने के लिए है। विकिपीडिया पृष्ठ का कहना है कि इसकी जटिलता हे (एन) है, लेकिन मुझे लगता है कि हे है कि (एन एन लॉग इन करें)।

प्रत्येक पुनरावृत्ति i में, 1 और i के बीच एक यादृच्छिक पूर्णांक चुना जाता है। बस मेमोरी में पूर्णांक लिखना हे (लॉग आई) है, और चूंकि एन पुनरावृत्तियों हैं, कुल है

O (लॉग 1) + O (लॉग 2) + ... + O (लॉग एन) = O (n लॉग एन)

जो भोली एल्गोरिथ्म बेहतर नहीं है। क्या मुझसे कोई चूक हो रही है?

नोट: भोली एल्गोरिथ्म प्रत्येक तत्व को अंतराल (0,1) में एक यादृच्छिक संख्या असाइन करना है, फिर असाइन किए गए संख्याओं के संबंध में सरणी को सॉर्ट करें।

जवाबों:


24

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


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

2
मुझे आपके द्वारा बताए जा रहे बुराहे की जानकारी नहीं है। इसका उल्लेख नहीं करने के लिए, आप निश्चित रूप से सही हैं। जेफ़ एरिकसन के पोस्ट को पढ़ने के बाद, मैंने अब इसे अपनी ज्यामिति कक्षा में पी = PSPACE को केवल किक्स के लिए साबित करने का एक बिंदु बना दिया :)
सुरेश वेंकट

1
जवाब के लिए धन्यवाद। मुझे कभी नहीं पता था कि यह इतनी बड़ी बात है। लिंक एक अच्छा पढ़ने प्रदान करता है।
तोमर वोमेन

1
निचला रेखा: हमेशा अपने मॉडल को स्पष्ट करें।
जुल्का सुमेला

2
हे(लॉगn)हे(लॉगn)

17

अभिकलन का मानक मॉडल मानता है कि O (लॉग एन) -बिट पूर्णांक पर अंकगणितीय संचालन को निरंतर समय में निष्पादित किया जा सकता है, क्योंकि वे संचालन आमतौर पर हार्डवेयर में सौंपे जाते हैं। तो फिशर-येट्स एल्गोरिथ्म में, "पूर्णांक i को मेमोरी में लिखना" केवल O (1) समय लेता है।

बेशक, बिट संचालन के संदर्भ में एल्गोरिदम का विश्लेषण करना पूरी तरह से सार्थक है, लेकिन बिट-कॉस्ट मॉडल वास्तविक व्यवहार का कम पूर्वानुमान है। यहां तक ​​कि साधारण लूप के for i = 1 to n: print(i)लिए ओ (एन लॉग एन) बिट संचालन की आवश्यकता होती है।


लूप के साथ अच्छा बिंदु। कभी गौर नहीं किया कि ...
तोमर वोमेन

8

यह "[फिशर-येट्स एल्गोरिथ्म] भोली एल्गोरिथ्म से बेहतर नहीं है" का जवाब है। क्या मैं यहां कुछ याद कर रहा हूं? " जो आपने प्रश्न में पूछा था।

आपके "भोले" एल्गोरिदम में जो वास्तविक संख्याओं का उपयोग करता है: आप सटीकता के कितने बिट्स का उपयोग करते हैं? यदि आप बिट जटिलता (जैसे आप फिशर-येट्स के लिए कर रहे हैं) की गिनती कर रहे हैं, और एल्गोरिथ्म वास्तविक संख्याओं के लिए k यादृच्छिक बिट्स का उपयोग करता है, तो इसका चलने का समय Ω (kn log n) होगा, क्योंकि दो k- की तुलना करें बिट वास्तविक संख्या में real (k) समय लगता है। लेकिन कश्मीर को कम से कम Ω (लॉग एन) होने की आवश्यकता है ताकि दो तत्वों को एक ही वास्तविक संख्या में मैप किया जा सके, जिसका अर्थ है कि एल्गोरिथ्म algorithm (एन लॉग 2 एन) समय लेता है , जो फिशर-येट्स फेरबदल की तुलना में धीमा है लॉग एन का कारक।

यदि आप केवल अंकगणित और तुलना संचालन की संख्या की गिनती कर रहे हैं और उनकी बिट जटिलता को अनदेखा कर रहे हैं, तो फिशर-येट्स and (n) है और आपका एल्गोरिथ्म Θ (n लॉग एन) है, फिर भी लॉग एन के अलावा एक कारक है।


मुझे संदेह था कि "भोले" एल्गोरिथ्म का वह निहितार्थ था ...
तोमर वोमेन

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

@ जेफ: धन्यवाद! यह बहुत साफ है, और फिशर-येट्स के रूप में एक ही जटिलता है। इसे पोस्ट करने के बाद, मैं वास्तव में महसूस कर रहा था कि "भोले" एल्गोरिथ्म को बदतर नहीं होना चाहिए ... मैंने इस तथ्य को याद किया कि एन के-बिट संख्याओं को ओ (एनके) में सॉर्ट किया जा सकता है, न कि ओ (nklog n) की आवश्यकता है। लेकिन मुझे लगता है कि नार्थ-फिशर-येट्स अभी भी स्थिरांक में बेहतर है: इसके लिए वास्तव में आवश्यकता होती है (लॉग एन!) यादृच्छिक बिट्स - 1 से n तक एक यादृच्छिक पूर्णांक, फिर 1 से n-1, आदि - जो इष्टतम है (बजाय इसके 3 एन लॉग एन), और यह केवल निरंतर अतिरिक्त मेमोरी के साथ इन-प्लेस किया जा सकता है।
श्रीवत्सआर

6

इस समस्या के लिए पूर्णांकों के बारे में कुछ खास नहीं है।

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

रैंडमवॉकर द्वारा संदर्भित ब्रूहा एक POPL 2008 पेपर ( http://portal.acm.org/citation.cfm?doid=1328438.1328460 ) के बारे में था , यहां चर्चा की गई: http://blog.computationalxxity.org/2009/05/shaving-shaving- लॉग-साथ-यूनिट-cost.html

उस पोस्ट में लांस फोर्टवे का वर्णन है कि कैसे एक छात्र के रूप में उन्होंने शिकायत की कि वास्तव में छांटने के लिए n लॉग की आवश्यकता होती है ^ 2 n समय अगर हमें उनकी तुलना करने के लिए दो तत्वों के सभी लॉग n बिट्स पढ़ने चाहिए, जो एक उचित आपत्ति है।


मुझे ब्लॉग पोस्ट के लेखक नहीं मिलते हैं। वह शिकायत करता है कि छँटाई वास्तव में O (n log ^ 2 n) है, लेकिन फिर कहता है कि कागज ठोस है?
तोमर वोमेन

कागज ठोस है (यानी, गलत नहीं) इसमें एक मॉडल है जिसमें अंकगणितीय संचालन में इकाई समय लगता है, और उस मॉडल में कागज का एल्गोरिथ्म ओ (एन ^ 3) संचालन को प्राप्त करने वाला पहला है।
डेव डॉट

मुझे O (n log ^ 2 n) आपत्ति नहीं है क्योंकि बिट के संदर्भ में, इनपुट स्वयं आकार O (n लॉग एन) का है। Btw, एक साइड नोट के रूप में, जटिलता ब्लॉग पर टिप्पणियों की गुणवत्ता का स्तर इतना अधिक था ....
arnab

4

विकिपीडिया पृष्ठ कहता है कि इसकी जटिलता O (n) है, लेकिन मुझे लगता है कि यह O (n log n) है।

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

1-εहे(ε)


3

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

संक्षेप में: आप टीएम के संदर्भ में सोचते हैं, आरएम के संदर्भ में लेख लेखक हैं। तुम दोनों सही हो।

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