यदि आपके पास बहुत कम चक्र हैं, तो यहां एक एल्गोरिथ्म है जो कम जगह का उपयोग करेगा, लेकिन समाप्त करने के लिए काफी अधिक समय लेता है।
[संपादित करें।] मेरे पिछले रन-टाइम विश्लेषण ने यह निर्धारित करने की महत्वपूर्ण लागत को याद किया कि क्या हम जिन नोड्स पर जाते हैं, वे पहले से नमूना हैं; इस उत्तर को सुधारने के लिए इसे कुछ हद तक संशोधित किया गया है।
हम फिर से एस के सभी तत्वों के माध्यम से पुनरावृति करते हैं । हम तत्वों की कक्षाओं का पता लगाने के रूप में रों ∈ एस , हम नोड्स है कि हम विज़िट कर चुके हैं नमूना है, ताकि अगर हम उन्हें भर में फिर से आना जांच करने के लिए सक्षम होने के लिए। हम 'घटकों' के नमूनों की एक सूची भी बनाए रखते हैं - कक्षाओं के संघ जो एक सामान्य चक्र में समाप्त होते हैं (और जो चक्र के लिए समान हैं) - जो पहले देखे गए हैं।
घटकों की एक खाली सूची को आरम्भ करें complist
। प्रत्येक घटक को उस घटक से नमूनों के संग्रह द्वारा दर्शाया जाता है; हम एक खोज ट्री भी बनाए रखते हैं samples
जो उन सभी तत्वों को संग्रहीत करता है जिन्हें कुछ घटक या अन्य के लिए नमूने के रूप में चुना गया है। आज्ञा देना जी अनुक्रम के पूर्णांक तक है n , जिसके लिए सदस्यता कुशलता से कुछ बूलियन विधेय कंप्यूटिंग द्वारा निर्धार्य है; उदाहरण के लिए, कुछ पूर्णांक p के लिए 2 या पूर्ण p वें शक्तियों की शक्तियाँ । प्रत्येक के लिए रों ∈ एस , निम्न कार्य करें:
- यदि s में है
samples
, तो # 5 चरण पर जाएं।
- एक खाली सूची
cursample
, एक पुनरावृत्त j s f ( s ), और एक काउंटर t । 1 को प्रारंभ करें ।
- जबकि जे में नहीं है
samples
:
- अगर टी ∈ जी , सम्मिलित जे दोनों में cursample
और samples
।
- बढ़ते क्रम में टी और सेट जे ← च (जे) ।
- यह देखने के लिए जांचें कि क्या j अंदर है
cursample
। यदि नहीं, तो हमें पहले से खोजे गए घटक का सामना करना पड़ा है: हम जाँचते हैं कि कौन सा घटक जे है, और इसे बढ़ाने cursample
के complist
लिए उपयुक्त तत्व के सभी तत्वों को सम्मिलित करें । अन्यथा, हमने वर्तमान कक्षा से एक तत्व का फिर से सामना किया है, जिसका अर्थ है कि हमने पहले से खोजे गए चक्रों के किसी भी प्रतिनिधि का सामना किए बिना कम से कम एक बार एक चक्र का पता लगाया है: हम cursample
एक नए पाए गए घटक से नमूनों के संग्रह के रूप में सम्मिलित करते हैं,complist
।
- अगले तत्व के लिए आगे बढ़ें रों ∈ एस ।
के लिए n = | S |, X (n) चक्रों की अपेक्षित संख्या ( उदाहरण X (n) = n 1/3 ) का वर्णन करने वाला एक मोनोटोन बढ़ाने वाला कार्य है , और Y (n) = y (n) लॉग ( n ) Ω ( एक्स (एन) लॉग ( एन )) एक लय बढ़ा हुआ कार्य स्मृति के उपयोग के लिए एक लक्ष्य (निर्धारित करने होना जैसे y (एन) = n 1/2 )। हमें y (n) ∈ Ω ( X (n) ) की आवश्यकता है क्योंकि प्रत्येक घटक से एक नमूने को संग्रहीत करने में कम से कम X (n) लॉग ( n ) स्थान लगेगा ।
एक कक्षा के जितने तत्व हम नमूना करते हैं, उतनी ही जल्दी हम कक्षा के अंत में चक्र में एक नमूने का चयन करते हैं, और इस तरह जल्दी से उस चक्र का पता लगा लेते हैं। एक स्पर्शोन्मुख दृष्टिकोण से, यह तब हमारी स्मृति सीमा के रूप में कई नमूने प्राप्त करने के लिए समझ में आता है: हम एक अपेक्षित y (n) तत्वों के लिए G सेट कर सकते हैं जो n से कम हैं । - यदि S की कक्षा में अधिकतम लंबाई L होने की उम्मीद है , तो हम G को L / y (n) का पूर्णांक गुणक मान सकते हैं । - अगर कोई अपेक्षित लंबाई नहीं है, तो हम हर बार एक बार n / प्रति नमूना ले सकते हैं।
y (n)तत्वों; यह किसी भी मामले में नमूनों के बीच अंतराल पर एक ऊपरी बाध्य है।
यदि, एक नए घटक की तलाश में, हम S के उन तत्वों को पीछे छोड़ना शुरू कर देते हैं, जिन्हें हमने पहले देखा है (या तो खोजे जा रहे नए घटक से या पुराने से जिसका टर्मिनल चक्र पहले ही मिल चुका है), यह अधिकांश n / y पर लगेगा ( एन) पूर्व नमूना तत्व का सामना करने के लिए पुनरावृत्तियों; यह तब की संख्या पर एक ऊपरी बाध्य होता है, एक नया घटक खोजने के प्रत्येक प्रयास के लिए, हम निरर्थक नोड्स का पता लगाते हैं। क्योंकि हम कर n ऐसे प्रयासों, हम तो प्रचुरता से के तत्वों का दौरा करेंगे एस ज्यादा से ज्यादा n 2 / y (एन) में कुल बार।
सदस्यता के लिए परीक्षण करने के लिए आवश्यक कार्य samples
हे ( y (n) लॉग y (n) ) है, जिसे हम हर मुलाक़ात में दोहराते हैं: इस जाँच की संचयी लागत O ( n 2 log y (n) ) है। नमूनों को उनके संबंधित संग्रहों में जोड़ने की लागत भी है, जो संचयी रूप से O ( y (n) log y (n) ) है। अंत में, हर बार जब हम पहले से खोजे गए घटक का पुन: सामना करते हैं, तो हमें यह पता लगाने के लिए एक्स (एन) लॉग * वाई (एन) समय तक खर्च करना चाहिए कि हमने किस घटक को फिर से खोजा; जैसा कि n बार तक हो सकता है , इसमें शामिल संचयी कार्य n x (n) लॉग द्वारा बाउंड किए गए हैं y (n) ।
इस प्रकार, संचयी कार्य यह जाँचने में किया जाता है कि क्या हम जिन नोड्स पर जाते हैं, वे रन-टाइम में नमूनों पर हावी हैं: यह लागत O ( n 2 log y (n) ) है। फिर हमें y (n) जितना संभव हो उतना छोटा करना चाहिए , जिसे O ( X (n) कहना है ) ।
इस प्रकार, कोई ओ ( एक्स (एन) लॉग ( एन ) स्पेस में ओ ( एन 2 लॉग एक्स (एन) ले ) चक्रों की संख्या (जो उन चक्रों में समाप्त होने वाले घटकों की संख्या के समान है ) को शामिल कर सकता है ऐसा करने का समय, जहां एक्स (एन) चक्रों की अपेक्षित संख्या है।