वार्मअप: यादृच्छिक बिटवेक्टर
वार्म-अप के रूप में, हम उस मामले से शुरू कर सकते हैं जहां प्रत्येक बिटवेक्टर को यादृच्छिक रूप से समान रूप से iid चुना जाता है। तब यह पता चलता है कि समस्या को समय में हल किया जा सकता है (अधिक सटीक रूप से, 1.6 को lg 3 से बदला जा सकता है )।O(n1.6min(k,lgn))1.6lg3
हम समस्या के निम्नलिखित दो-सेट प्रकारों पर विचार करेंगे:
यह देखते हुए सेट bitvectors की, निर्धारित जहां वहां मौजूद एक गैर-अतिव्यापी जोड़ी रों ∈ एस , टी ∈ टी ।S,T⊆{0,1}ks∈S,t∈T
इसे हल करने की मूल तकनीक फूट डालो-जीतो है। यहाँ एक टाइम अल्गोरिद्म है जो डिवाइड-एंड-कॉनकेयर का उपयोग करता है:O(n1.6k)
स्प्लिट और टी पहले बिट स्थिति पर आधारित है। दूसरे शब्दों में, प्रपत्र एस 0 = { रों ∈ एस : एस 0 = 0 } , एस 1 = { रों ∈ एस : एस 0 = 1 } , टी 0 = { टी ∈ टी : टी 0 = 0 } , टी 1 = { टी ∈ टी : टीSTS0={s∈S:s0=0}S1={s∈S:s0=1}T0={t∈T:t0=0} ।T1={t∈T:t0=1}
अब , एस 0 , टी 1 , और टी 1 , एस 0 से एक गैर-अतिव्यापी जोड़ी के लिए पुन: खोज करें । यदि कोई पुनरावर्ती कॉल एक गैर-अतिव्यापी जोड़ी पाता है, तो इसे आउटपुट करें, अन्यथा आउटपुट "कोई अतिव्यापी जोड़ी मौजूद नहीं है"।S0,T0S0,T1T1,S0
चूँकि सभी bitvectors यादृच्छिक पर चुने जाते हैं, हम उम्मीद कर सकते हैं और | टी बी | ≈ | टी | / २ । इस प्रकार, हमारे पास तीन पुनरावर्ती कॉल हैं, और हमने समस्या के आकार को दो के कारक से घटा दिया है (दोनों सेट दो के कारक से कम हो जाते हैं)। बाद एलजी मिनट ( | एस | , | टी | ) विभाजन, दो सेट में से एक नीचे आकार 1 करने के लिए है, और समस्या रैखिक समय में हल किया जा सकता। की तर्ज पर हमें एक पुनरावृत्ति संबंध मिलता है|Sb|≈|S|/2|Tb|≈|T|/2lgmin(|S|,|T|) , जिसका समाधान T ( n ) = O ( n 1.6 k ) है । दो सेट के मामले में अधिक सटीक समय चल रहा है के लिए लेखांकन, तो हम समय देखने है हे ( मिनट ( | एस | , | टी | ) 0.6 अधिकतम ( | एस | , | टीT(n)=3T(n/2)+O(nk)T(n)=O(n1.6k) ।O(min(|S|,|T|)0.6max(|S|,|T|)k)
इसे और बेहतर बनाया जा सकता है, यह देखते हुए कि यदि , तो गैर-अतिव्यापी जोड़ी मौजूद होने की संभावना बहुत कम है। विशेष रूप से, अगर एक्स , वाई दो यादृच्छिक वैक्टर, संभावना है कि वे गैर-अतिव्यापी है ( 3 / 4 ) कश्मीर । अगर | एस | = | टी | = N , देखते हैं n 2 ऐसे जोड़े, तो एक संघ बाध्य द्वारा, संभावना एक गैर-अतिव्यापी जोड़ी मौजूद है ज्यादा से ज्यादा है n 2 ( 3k≥2.5lgn+100x,y(3/4)k|S|=|T|=nn2 । जब कश्मीर ≥ 2.5 एलजी n + 100 , यह है ≤ 1 / 2 100 । इसलिए, एक पूर्व-प्रसंस्करण कदम के रूप में, यदि k g 2.5 lg n + 100 है , तो हम तुरंत "कोई गैर-अतिव्यापी जोड़ी मौजूद नहीं है" (संभावना है कि यह गलत है लापरवाही से छोटा है), अन्यथा हम उपरोक्त एल्गोरिथ्म चलाते हैं।n2(3/4)kk≥2.5lgn+100≤1/2100k≥2.5lgn+100
इस प्रकार हम के चल रहे समय को प्राप्त (या हे ( मिनट ( | एस | , | टी | ) 0.6 अधिकतम ( | एस | , | टी | ) मिनट ( कश्मीर , एलजी n ) ) दो-सेट संस्करण के लिए ऊपर प्रस्तावित), उस विशेष मामले के लिए जहां बिटवेक्टर को यादृच्छिक रूप से समान रूप से चुना जाता है।O(n1.6min(k,lgn))O(min(|S|,|T|)0.6max(|S|,|T|)min(k,lgn))
बेशक, यह सबसे खराब स्थिति का विश्लेषण नहीं है। रैंडम बिटवेक्टर सबसे खराब स्थिति की तुलना में काफी आसान होते हैं - लेकिन चलो इसे वार्मअप मानते हैं, कुछ विचार प्राप्त करने के लिए जो शायद हम सामान्य मामले पर लागू कर सकते हैं।
वार्मअप से सबक
हम वार्मअप से कुछ सबक सीख सकते हैं। सबसे पहले, फूट डालो और जीतो (थोड़ा स्थान पर विभाजित) मददगार लगता है। दूसरा, आप उस स्थिति में संभव के रूप में कई साथ एक बिट स्थिति पर विभाजित करना चाहते हैं; जितने अधिक 0 होते हैं, उतने ही कम उप-आकार के आकार में कमी होती है।10
तीसरा, इससे यह पता चलता है कि समस्या कठिन हो जाती है क्योंकि का घनत्व छोटा हो जाता है - अगर बिटवॉकरों में बहुत कम 1 है (वे ज्यादातर 0 हैं ), तो समस्या काफी कठिन दिखती है, क्योंकि प्रत्येक विभाजन कम हो जाता है उपप्रकारों का आकार थोड़ा छोटा है। तो, घनत्व को परिभाषित Δ बिट्स कि कर रहे हैं के अंश होने के लिए 1 (यानी, सब से बाहर n कश्मीर बिट्स), और बिट स्थिति का घनत्व मैं bitvectors के अंश होने के लिए कर रहे हैं 1 की स्थिति में मैं ।110Δ1nki1i
बहुत कम घनत्व को संभालना
अगले चरण के रूप में, हमें आश्चर्य हो सकता है कि यदि घनत्व बहुत छोटा है तो क्या होगा। ऐसा लगता है कि अगर हर बिट स्थिति में घनत्व से छोटा होता है , हम गारंटी देते हैं कि एक गैर-अतिव्यापी जोड़ी मौजूद है: एक (गैर-रचनात्मक) अस्तित्व तर्क है जो दिखा रहा है कि कुछ गैर-अतिव्यापी जोड़ी मौजूद होनी चाहिए। यह हमें इसे खोजने में मदद नहीं करता है, लेकिन कम से कम हमें पता है कि यह मौजूद है।1/k−−√
यह एक केस क्यों है? चलो का कहना है कि bitvectors की एक जोड़ी है कवर बिट स्थिति से मैं अगर एक्स मैं = y मैं = 1 । ध्यान दें कि ओवरलैपिंग बिटवेक्टरों की प्रत्येक जोड़ी को किसी न किसी स्थिति से कवर किया जाना चाहिए। अब, अगर हम एक विशेष बिट स्थिति को ठीक मैं , जोड़े कि कि बिट स्थिति से कवर किया जा सकता की संख्या अधिक से अधिक है ( एन Δ ( मैं ) ) 2 < n 2 / कश्मीर । सभी के बीच समरिंगx,yixi=yi=1i(nΔ(i))2<n2/kkबिट स्थिति के अनुसार, हम पाते हैं कि कुछ बिट स्थिति से आच्छादित जोड़े की कुल संख्या । इसका मतलब यह है कि कुछ ऐसी जोड़ी होनी चाहिए जो किसी भी बिट स्थिति से आच्छादित न हो, जिसका अर्थ है कि यह जोड़ी गैर-अतिव्यापी है। इसलिए यदि घनत्व प्रत्येक बिट स्थिति में पर्याप्त रूप से कम है, तो एक गैर-अतिव्यापी जोड़ी निश्चित रूप से मौजूद है।<n2
हालाँकि, मैं इस तरह के एक गैर-अतिव्यापी जोड़ी को खोजने के लिए एक तेज एल्गोरिदम की पहचान करने के लिए नुकसान में हूं, इन शासन में, भले ही किसी के अस्तित्व की गारंटी हो। मैं तुरंत ऐसी कोई तकनीक नहीं देखता, जो चल रहे समय की उपज हो, जिसमें पर एक उप-द्विघात निर्भरता हो । इसलिए, यदि आप इस समस्या के बारे में सोचने के लिए कुछ समय बिताना चाहते हैं, तो यह एक अच्छा विशेष मामला है।n
एक सामान्य-केस एल्गोरिथ्म की ओर
सामान्य स्थिति में, एक प्राकृतिक हेयुरिस्टिक लगता है: बिट स्थिति को सबसे अधिक 1 's (यानी उच्चतम घनत्व के साथ) के साथ उठाता हूं , और उस पर विभाजित होता हूं । दूसरे शब्दों में:i1
थोड़ा स्थिति का पता लगाएं कि अधिकतम Δ ( मैं ) ।iΔ(i)
स्प्लिट और टी बिट स्थिति पर आधारित है i । दूसरे शब्दों में, प्रपत्र एस 0 = { रों ∈ एस : एस मैं = 0 } , एस 1 = { रों ∈ एस : एस मैं = 1 } , टी 0 = { टी ∈ टी : टी मैं = 0 } , टी 1 = { टी ∈ टी :STiS0={s∈S:si=0}S1={s∈S:si=1}T0={t∈T:ti=0} ।T1={t∈T:ti=1}
अब , एस 0 , टी 1 , और टी 1 , एस 0 से एक गैर-अतिव्यापी जोड़ी के लिए पुन: खोज करें । यदि कोई पुनरावर्ती कॉल एक गैर-अतिव्यापी जोड़ी पाता है, तो इसे आउटपुट करें, अन्यथा आउटपुट "कोई अतिव्यापी जोड़ी मौजूद नहीं है"।S0,T0S0,T1T1,S0
चुनौती सबसे खराब स्थिति में अपने प्रदर्शन का विश्लेषण करना है।
मान लेते हैं कि पूर्व-प्रसंस्करण कदम के रूप में हम पहले हर बिट स्थिति के घनत्व की गणना करते हैं। इसके अलावा, अगर हर के लिएमैं, मान लेते हैं कि पूर्व प्रसंस्करण कदम आउटपुट "एक ओवरलैपिंग जोड़ी मौजूद है" (मुझे पता है कि यह एक ओवरलैपिंग जोड़ी का एक उदाहरण का प्रदर्शन नहीं करता है, लेकिन सेट है कि एक तरफ एक अलग चुनौती के रूप में करते हैं)। यह सबO(nk)समयमें किया जा सकता है। घनत्व सूचना को कुशलता से बनाए रखा जा सकता है क्योंकि हम पुनरावर्ती कॉल करते हैं; यह समय को चलाने में प्रमुख योगदानकर्ता नहीं होगा।Δ(i)<1/k−−√iO(nk)
इस प्रक्रिया का चलने का समय क्या होगा? मुझे यकीन नहीं है, लेकिन यहां कुछ अवलोकन हैं जो मदद कर सकते हैं। प्रत्यावर्तन के प्रत्येक स्तर पर के बारे में द्वारा समस्या आकार कम कर देता bitvectors (जैसे, सेnbitvectors लिएn-n/ √n/k−−√n बिटवेक्टर)। इसलिए, प्रत्यावर्तन ही के बारे में जा सकते हैं √n−n/k−−√ स्तर गहरा। हालांकि, मैं तुरंत यकीन है कि कैसे प्रत्यावर्तन पेड़ में पत्तियों की संख्या की गणना करने के लिए नहीं कर रहा हूँ (वहाँ एक बहुत की तुलना में कम कर रहे हैं3 √k−−√ पत्ते), तो मुझे यकीन नहीं है कि यह किस समय चलना चाहिए।3k√