2012-01-20 10 views
6

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

मैंने ट्री में इनपुट स्ट्रिंग को संग्रहीत करने के बारे में सोचा था, लेकिन फिर यह निर्धारित करने का प्रयास करते समय कि स्ट्रिंग की कुछ चक्रीय स्ट्रिंग अब मुझे ट्री के लिए डाली गई थी। सभी संभावित चक्रीय तारों के लिए ट्री में खोज।

क्या यह अधिक कुशलतापूर्वक करने का कोई तरीका है जबकि जगह जटिलता ट्री में होगी?

नोट: जब मैं एक स्ट्रिंग मेरा मतलब है की चक्रीय तार कि उदाहरण के लिए सभी 1011 की चक्रीय तार कर रहे हैं कहते हैं: 0111, 1110, 1101, 1011

+0

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

+0

@ सीवेनहुइस: नहीं, मैं केवल बाइनरी तारों के साथ काम कर रहा हूं। – user550413

+0

क्या आप सभी सम्मिलन ऊपर-सामने करते हैं? या आप सम्मिलन और लुकअप intermix करते हैं? – templatetypedef

उत्तर

5

आप निम्नलिखित के आधार पर चक्रीय तार के लिए एक canonicalizing समारोह के साथ आ सकता है:

  1. शून्य का सबसे बड़ा भाग खोजें।
  2. स्ट्रिंग घुमाएं ताकि ज़ीरो का वह भाग सामने हो।
  3. बराबर आकार के शून्य के प्रत्येक भाग के लिए, देखें कि सामने के घूर्णन को लेक्सिकोग्राफिक रूप से कम स्ट्रिंग का उत्पादन होता है और यदि ऐसा है तो इसका उपयोग करें।

यह कोषगत कम से कम मूल्य के लिए तुल्यता वर्ग में सब कुछ (1011, 1101, 1110, 0111) canonicalize होगा: 0111.

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

फिर आप कैनोनिकल रूप के आधार पर हैश का उपयोग कर सकते हैं या एक त्रिभुज का उपयोग कर सकते हैं जिसमें केवल खाली स्ट्रिंग और तार शामिल होंगे जो 0 से शुरू होते हैं और एक तिहाई रन आपके प्रश्न का उत्तर देगा।

संपादित करें:

अगर मैं लंबाई के एक स्ट्रिंग है | | s कम से कम शब्दावली मूल्य खोजने में काफी समय लग सकता है .. वास्तव में यह कितना समय लगेगा?

यही कारण है कि मैंने कहाएक मूल्य है जिसके लिए यह बुरी तरह से प्रदर्शन करता है। आइए मान लें कि स्ट्रिंग लंबाई एन है और 1 का लंबा सबसे लंबा भाग आर है। यदि बिट्स को यादृच्छिक रूप से वितरित किया जाता है, तो सबसे लंबे समय तक चलने की लंबाई ओ (लॉग एन) "Distribution of longest run" के अनुसार होती है।

सबसे लंबा रन खोजने का समय ओ (एन) है। आप एक बफर प्रतिलिपि के बजाय ऑफसेट का उपयोग करके स्थानांतरण को कार्यान्वित कर सकते हैं, जो ओ (1) होना चाहिए। रनों की संख्या सबसे खराब स्थिति ओ (एन/एम) है।

फिर, समय चरण 3 करने के लिए किया जाना चाहिए

  1. अन्य लंबी रन खोजें: एक हे (एन) हे (लॉग एन) भंडारण औसत मामले से गुजरती हैं, हे (एन) सबसे ज्यादा मामले
  2. प्रत्येक रन के लिए: ओ (लॉग एन) औसत मामला, ओ (एन) सबसे खराब मामला
  3.   शिफ्ट और लेक्सिकोग्राफिक रूप से तुलना करें: ओ (लॉग एन) औसत केस, क्योंकि यादृच्छिक रूप से चुने हुए स्ट्रिंग की अधिकांश तुलना जल्दी विफल हो जाती है, ओ (एन) सबसे खराब मामला ।

यह ओ (एन²) का सबसे खराब मामला है, लेकिन ओ (एन + लॉग² एन) ≅ ओ (एन) का औसत मामला है।

+0

मुझे समझ में नहीं आता है। मान लीजिए 1100010 संग्रहित किया जाना है और 1001 खोजा जाना है। आपका एल्गोरिदम कैसे आगे बढ़ता है? क्या यह सबस्ट्रिंग 1100 पा सकता है? –

+0

नहीं, यह चक्रीय स्ट्रिंग के सबस्ट्रिंग को हल नहीं करेगा, लेकिन मुझे ओपी में सबस्ट्रिंग्स के बारे में कुछ भी दिखाई नहीं देता है। –

+0

हम्म, मेरी व्याख्या "जांच करें कि कुछ चक्रीय है * * * मेरी संरचना में * अलग है। शायद उपयोगकर्ता 550413 स्पष्ट करेगा। –

0

आपके पास n तार s1..sn और एक स्ट्रिंग दी टी आप को पता है टी के एक चक्रीय परिवर्तन किसी भी s1..sn की सबस्ट्रिंग है कि क्या करना चाहते हैं। और आप तारों को यथासंभव कुशलता से स्टोर करना चाहते हैं। क्या मैंने आपका प्रश्न सही ढंग से समझा?

यदि ऐसा है, तो यहां एक समाधान है, लेकिन एक बड़े रन-टाइम के साथ: दिए गए इनपुट टी के लिए, टी '= कॉन्सट (टी, टी), टी को जांचें' एस में सभी एस के साथ देखें ... यदि टी 'और एसएम का सबसे लंबा अनुक्रम कम से कम है | टी | अगर | सी | = के, | टी | = एल यह ओ (एन.के.एल) समय में चलता है। और आप किसी भी डेटा संरचना में s1..sn स्टोर कर सकते हैं। क्या यह काफी अच्छा है या आप?