मैंने सोचा कि काम कर सकता हूँ एक विभाजित और जीत दृष्टिकोण।
सबसे पहले, प्रीप्रोसेसिंग में आपको एक सूची में अपने इनपुट आकार ( एन / 3) से आधे से कम सभी संख्याओं को सम्मिलित करने की आवश्यकता होती है ।
एक स्ट्रिंग दी: 0000010101000100(ध्यान दें कि यह विशेष उदाहरण मान्य है)
1 से (16/2) सभी सूची (1) से एक सूची में डालें: {1, 2, 3, 4, 5, 6, 7}
फिर इसे आधे में विभाजित करें:
100000101 01000100
ऐसा तब तक करते रहें जब तक आपको आकार के तार न मिलें 1. सभी आकार-एक के साथ एक तार के साथ उनमें से 1, स्ट्रिंग की अनुक्रमणिका को संभावनाओं की सूची में जोड़ें; अन्यथा, विफलता के लिए -1 लौटें।
आपको प्रत्येक संभावित अनुक्रमणिका के साथ संबद्ध रिक्त स्थान की सूची वापस करने की आवश्यकता होगी। (ऊपर दी गई सूची से शुरू करें और जाते ही नंबर हटा दें) यहाँ, एक खाली सूची का मतलब है कि आप केवल 1 से काम कर रहे हैं और इसलिए इस बिंदु पर कोई भी रिक्ति संभव है; अन्यथा सूची में ऐसे स्थान शामिल हैं जिन्हें खारिज किया जाना चाहिए।
तो ऊपर दिए गए उदाहरण के साथ जारी है:
1000 0101 0100 0100
10 00 01 01 01 00 01 00
1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0
पहले गठबंधन चरण में, हमारे पास अब दो के आठ सेट हैं। पहले में, हमारे पास एक सेट की संभावना है, लेकिन हम सीखते हैं कि 1 द्वारा रिक्ति असंभव है क्योंकि अन्य शून्य वहां है। इसलिए हम 0 (इंडेक्स के लिए) और {2,3,4,5,7} इस तथ्य के लिए लौटते हैं कि 1 से रिक्ति असंभव है। दूसरे में, हमारे पास कुछ भी नहीं है और इसलिए -1 वापसी करते हैं। तीसरे में हमारा कोई ऐसा मैच है जिसमें कोई भी स्पैकिंग 5 इंडेक्स में समाप्त नहीं हुई है, इसलिए 5, {1,2,3,4,5,7} वापस करें। चौथी जोड़ी में हम 7, {1,2,3,4,5,7} लौटते हैं। पांचवें में, 9 लौटें, {1,2,3,4,5,7}। छठे में, वापसी -1। सातवें में, वापसी 13, {1,2,3,4,5,7}। आठवें में, वापसी -1।
चार के चार सेटों में फिर से संयोजन, हमारे पास है:
1000: रिटर्न (0, {4,5,6,7})
0101: रिटर्न (5, {2,3,4,5,6,7})), (7, {1,2,3,4,5,6 , 7})
0100: रिटर्न (9, {3,4,5,6,7})
0100: रिटर्न (13, {3,4,5,6,7})
आठ के सेट में संयोजन:
10000101: रिटर्न (0, {5,7}), (5, {2,3,4,5,6,7}}), (7, {1,2,3,4,5,6,7})
01000100: वापसी (9, {4,7}), (13, {3,4,5,6,7})
सोलह के सेट में संयोजन:
10000101 01000100
जैसे-जैसे हम आगे बढ़ रहे हैं, हम अभी तक सभी संभावनाओं की जाँच करते रहते हैं। इस चरण तक हमने सामान छोड़ दिया है जो स्ट्रिंग के अंत से आगे निकल गया है, लेकिन अब हम सभी संभावनाओं की जांच कर सकते हैं।
मूल रूप से, हम पहले 1 को 5 और 7 की स्पेसिंग के साथ जांचते हैं, और पाते हैं कि वे 1 तक नहीं हैं। (ध्यान दें कि प्रत्येक चेक कंसिस्टेंट है, रैखिक समय नहीं है) फिर हम 2, 3, 4, 5, 6 और 7-- या की स्पैकिंग के साथ दूसरे एक (इंडेक्स 5) की जांच करते हैं, या हम करेंगे, लेकिन हम 2 पर रोक सकते हैं यह वास्तव में मेल खाता है।
ओह! यह एक लंबा एल्गोरिथ्म है।
मैं 100% नहीं जानता अगर यह अंतिम चरण के कारण ओ (एन लॉग एन) है , लेकिन जहां तक मैं बता सकता हूं वहां सब कुछ निश्चित रूप से ओ (एन लॉग एन) है । मैं इसे बाद में वापस लाऊंगा और अंतिम चरण को परिष्कृत करने का प्रयास करूंगा।
EDIT: वेलबॉग की टिप्पणी को प्रतिबिंबित करने के लिए मेरे जवाब को बदल दिया। त्रुटि के लिए क्षमा करें। मैं बाद में कुछ छद्मकोड लिखूँगा, जब मुझे फिर से लिखने के लिए थोड़ा और समय मिलेगा। ;-)