2009-09-18 13 views
5

यहाँ है समस्या है, यह सिडगविक उत्तम एल्गोरिदम से जावा में (क्यू 3,54)गणना संख्या कि परिपत्र हो सकता है

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

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

उत्तर

7

tortoise and hare algorithm आप दोनों चक्र लंबाई और नोड्स की संख्या दे सकते हैं इससे पहले कि चक्र शुरू हो जाता (λ और μ क्रमशः)। http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare

यह हे (एन) समय में चलता है, और स्मृति के केवल निरंतर राशि की आवश्यकता है:

+0

हाहा, मैं अपनी अंतर्दृष्टि के आधार पर एक विस्तृत उत्तर देने के बीच में था कि कछुआ और खरगोश के लिए जो कदम उठाएंगे, वह चक्र की लंबाई के बारे में जानकारी देता है, जब मुझे इसे अभी देखना चाहिए था। – Joren

+0

मुझे भी। :(Google मेरा मित्र है, Google मेरा मित्र है, Google मेरा मित्र है ... – TonyOssa

+0

+1। लेकिन आपके एल्गोरिदम की समय जटिलता क्या है? चक्र ओ (लैम्ब्डा + यू) खोजें, चक्र की लंबाई ओ (लैम्ब्डा) ढूंढें, गर्दन की लंबाई ओ (लैम्ब्डा * यू) ढूंढें। कुल मिलाकर यह अभी भी ओ (एन^2) एन = मिनट (लैम्ब्डा, यू) मान रहा है। क्या वर्गवार से बेहतर तरीका है? – Akusete

-4

बस याद रखें कि आप कहां गए हैं और यदि आप एक ही नोड पर आए हैं तो यह खत्म हो गया है।

द्विआधारी पेड़ में प्रविष्टियों को संग्रहीत करने का प्रयास करें और आप हे है (N * लॉग (एन)) समय और हे (एन) अंतरिक्ष comlexity

संपादित

यदि आप लॉग (एन) अंतरिक्ष comlexity उपयोग कर सकते हैं एक्सपोनेटियल ऑर्डर लिंक में सभी को स्टोर न करें। इसका मतलब है कि आप 1, 2, 4, 8 वां, 16 वें स्थान पर हैं और फिर यदि आप हिट करते हैं तो आपको उस बिंदु से जारी रखना होगा। इस एक के लिए समय comlexity है एन * लॉग (एन)^2

+0

लेकिन आप केवल स्थिर स्थान का उपयोग कर सकते हैं – Tom

+0

लॉग (एन) लगभग स्थिर स्थान है 100 प्रविष्टियां दुनिया में प्रत्येक डिस्क/रैम के लिए पर्याप्त होनी चाहिए: डी –

+3

@ralu: क्षमा करें, लेकिन 'ओ (लॉग एन)' बंद नहीं है 'ओ (1) 'अंतरिक्ष के लिए। एक लांग शॉट से नहीं। – jason

1

चेक बाहर इस: Puzzle: Loop in a Linked List

सूचक अंकन: व्यवहार में, जुड़ा हुआ सूचियों सी structs कम से कम एक सूचक के साथ का उपयोग करके लागू; सी में ऐसी संरचना 4-बाइट गठबंधन होगी। तो कम से कम महत्वपूर्ण दो बिट शून्य हैं। सूची को घुमाने के दौरान, आप 'पॉइंट' को द्वारा कम से कम महत्वपूर्ण बिट फ़्लिप करने के रूप में एक पॉइंटर कर सकते हैं। दूसरा ट्रैवर्सल इन बिट्स को साफ़ करने के लिए है।

+1

प्रश्न बताता है कि आपको "किसी नोड्स को संशोधित किए बिना अलग-अलग नोड्स की संख्या निर्धारित करना चाहिए।" यहां तक ​​कि यदि यह एक आवश्यकता नहीं थी, तो यह समाधान गंध करता है क्योंकि यह कार्यान्वयन के विस्तार पर बहुत अधिक निर्भर करता है और भाषा अज्ञेयवादी नहीं है। – jason

+0

@ जेसन: कौन परवाह करता है? मैं एक * तेज़ * एल्गोरिदम (जो मेरे पर्यावरण के अनुरूप है) को पसंद करता है जो कि अधिक भाषाओं में काम करता है। मैं यह नहीं कह रहा हूं कि यह उत्तर एक तेज़ एल्गोरिदम का वर्णन करता है, बस सामान्य रूप से, एल्गोरिदम का प्रदर्शन पोर्टेबिलिटी से अधिक महत्वपूर्ण है। – Artelius

+1

@ जेसन, हाँ यह अस्थायी नोड्स को संशोधित करता है। वैसे भी, मुझे पता है कि यह सबसे अच्छा समाधान नहीं है लेकिन मुझे लगता है कि यह एक दिलचस्प है। –

2

सबसे सुरुचिपूर्ण समाधान फ्लोयड के चक्र खोजने एल्गोरिथ्म है।

संबंधित मुद्दे