फ्लोयड की साइकल डिटेक्शन एल्गोरिदम | चक्र के शुरुआती बिंदु का निर्धारण


32

मैं फ्लॉयड के चक्र का पता लगाने वाले एल्गोरिदम को समझने में मदद कर रहा हूं। मैं विकिपीडिया ( http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare ) पर स्पष्टीकरण से गुजरा हूँ

मैं देख सकता हूं कि एल्गोरिथ्म ओ (एन) समय में चक्र का पता कैसे लगाता है। हालांकि, मैं इस तथ्य की कल्पना नहीं कर पा रहा हूं कि एक बार कछुआ और खरगोश के संकेत पहली बार मिलते हैं, तो चक्र की शुरुआत कछुआ सूचक को वापस शुरू करने और फिर एक समय में एक कदम दोनों कछुआ और आगे बढ़ने से निर्धारित की जा सकती है। जिस बिंदु पर वे पहली बार मिलते हैं वह चक्र की शुरुआत है।

क्या कोई व्याख्या प्रदान करके मदद कर सकता है, उम्मीद है कि विकिपीडिया पर एक से अलग, जैसा कि मैं इसे समझने / कल्पना करने में असमर्थ हूं?


3
मुझे स्टैकओवरफ्लो पर जवाब मिला। धन्यवाद अगर कोई मेरे लिए यह देख रहा था। और जो लोग मुझे पसंद करते हैं वे स्पष्टीकरण चाहते थे, कृपया देखें: stackoverflow.com/questions/3952805/… प्रश्न का चुना हुआ उत्तर, इसे समझाता है!
अनुराग कपूर

हाय @ अनुराग। बस आपकी जानकारी के लिए, मैं "कछुआ और खरगोश" एल्गोरिथ्म पर एक ब्लॉग पोस्ट किया है यहाँ
केली

क्या आप जानते हैं कि fastचर, या "हरे" को केवल एक के बजाय कछुआ के रूप में दोगुनी गति से आगे बढ़ने की आवश्यकता है?
devdropper87 16

अच्छी तरह से कार्यक्रम के साथ समझाया: javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html
Jayesh

जवाबों:


47

आप " यहां से जुड़ी सूची में एक पाश की शुरुआत का पता लगाने" का उल्लेख कर सकते हैं , यहां एक अंश है:

यहां छवि विवरण दर्ज करें

slowPointerमिलने से पहले की गई दूरी =एक्स+y

fastPointer =(एक्स+y+z)+y

के बाद से fastPointerसाथ यात्रा डबल की गति slowPointer, और समय स्थिर है दोनों जब पहुंच बैठक बिंदु के लिए। इसलिए सरल गति, समय और दूरी के संबंध ( slowPointerआधी दूरी की यात्रा) का उपयोग करके :

2*जिले(slowPointer)=जिले(fastPointer)2(एक्स+y)=एक्स+2y+z2एक्स+2y=एक्स+2y+zएक्स=z

इसलिए ले जाकर slowPointerलिंक्ड सूची के शुरू करने के लिए, और दोनों बनाने slowPointerऔर fastPointerएक समय में एक नोड स्थानांतरित करने के लिए, वे दोनों कवर करने के लिए एक ही दूरी है

वे उस बिंदु पर पहुंच जाएंगे जहां लिंक की गई सूची में लूप शुरू होता है।


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

1
@JotWaraich छवि सभी मामलों की प्रतिनिधि नहीं है; तर्क हालांकि अभी भी रखता है
denis631

3
यह पूरे इंटरनेट में इस एल्गोरिथ्म के बारे में सबसे सीधे आगे का जवाब है
मार्शल एक्स

7

मैंने प्रमाण के रूप में स्वीकृत उत्तर को अन्यत्र भी देखा है। हालांकि, जबकि इसकी आसान ग्रॉक है, यह गलत है। यह साबित क्या है

एक्स=z

आप वास्तव में क्या साबित करना चाहते हैं (ऊपर दिए गए उत्तर में आरेख में वर्णित समान चर का उपयोग करके):

z=एक्स मीटर (y+z)

(y+z)एल

इसलिए, हम क्या साबित करना चाहते हैं:

z=एक्स मीटर एल

या वह z x (modulo L) के अनुरूप है

निम्नलिखित प्रमाण मेरे लिए अधिक मायने रखता है:

एम=एक्स+y

2(एक्स+y)=एम+कश्मीरएलकश्मीरएक्स+yएल

एक्स+y=कश्मीरएल

एक्स=कश्मीरएल-y

एक्सएलyएमएक्स+y


0

मुझे स्टैकओवरफ्लो पर जवाब मिला। धन्यवाद अगर कोई मेरे लिए यह देख रहा था। : और जो लोग मेरे जैसे एक स्पष्टीकरण चाहता था के लिए, कृपया https://stackoverflow.com/questions/3952805/proof-of-detecting-the-start-of-cycle-in-linked-list करने के लिए चुना जवाब सवाल, यह समझाता है!

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