एक सबसेट खोज एल्गोरिथ्म


9

मान लीजिए मेरे पास एक सूची है X के सबसेट {1,...,n}। यदि आवश्यक हो तो मैं इस सूची पर प्रीप्रोसेसिंग कर सकता हूं। इस प्रीप्रोसेसिंग के बाद, मुझे एक और सेट के साथ प्रस्तुत किया गया हैA{1,...,n}। मैं किसी भी सेट की पहचान करना चाहता हूंBX साथ में BA

स्पष्ट एल्गोरिथ्म (बिना किसी पूर्वप्रक्रम के) में समय लगता है O(n|X|) - आप बस परीक्षण करें A प्रत्येक के खिलाफ BXअलग से। क्या इससे बेहतर कुछ हो सकता है?

यदि यह मदद करता है, तो आप मान सकते हैं कि, किसी के लिए भी Aमैचों की कुल संख्या BX जैसे किसी चीज से बंधे हों O(1)

जवाबों:


3

यह कोई उत्तर नहीं है। यह एक सरल लेकिन लंबा अवलोकन है। मुझे उम्मीद है कि यह उपयोगी होगा।

आपकी समस्या का निर्णय संस्करण है: करता है X का सबसेट सम्‍मिलित करें A?

यह समस्या मोनोटोन बूलियन कार्यों के मूल्यांकन की समस्या से संबंधित है nचर। का एक उपसमूह{1,,n} के बराबर है n-स्ट्रीमिंग, इसलिए परिवार X एक बूलियन फ़ंक्शन के बराबर है f का nचर। एक फंक्शन दियाf, एक सबसे कम मोनोटोन फ़ंक्शन को परिभाषित कर सकता है जो इससे बड़ा नहीं है f, अर्थात् g(y)=(xy,f(x))। मूल समस्या तब मूल्यांकन के लिए कम हो जाती हैg(A)। इसके विपरीत, मोनोटोन बूलियन फ़ंक्शन के मूल्यांकन की समस्या को मूल समस्या को कम किया जा सकता है, या तो भोलेपन सेf=g या चुनकर f उससे बनता है X छोटे।

व्यवहार में बीडीडी अच्छी तरह से काम करते हैं। तो एक संभव दृष्टिकोण के लिए BDD का निर्माण करना हैf, इसके लिए बीडीडी से प्राप्त करें g, और फिर मूल्यांकन करें g। के लिए BDD का औसत आकारgहोना चाहिए , क्योंकि वहाँ कई एक लय बूलियन कार्य हैं । इसलिए, सिद्धांत रूप में यह एक बुरा समाधान है।Ω((nn/2))

लेकिन (1) एक बेहतर विश्लेषण संभव हो सकता है और (2) इस दृष्टिकोण के लिए ट्विक्स हो सकते हैं जो इसे बेहतर बनाते हैं। उदाहरण के लिए, मैंने किसी भी तरह से के आकार और के BDD के आकार के बीच संबंध का उपयोग नहीं किया । (सहसंबंध होना चाहिए, लेकिन मुझे नहीं पता कि यह सरल है या यहाँ प्रयोग करने योग्य है।)Xg

पूर्णता के लिए, के लिए BDD की गणना के लिए एक सरल एल्गोरिथ्म के लिए BDD से निम्नलिखित है। यहाँ BDDs पर मानक या प्रचालन है।gf

m(x?f1:f0)=x?(m(f0)m(f1)):m(f0)

2
क्या यह कमोबेश प्रत्येक उपसमुच्चय का उत्तर देने के समतुल्य नहीं है , आकार बाइनरी ट्री के सभी परिणामों को कैशिंग करता है , और फिर सही देख रहा है परिणाम (समय में ) जब आपको दिया जाता है ? {1,2,...,n}2nO(n)A
mjqxxxx

प्रीप्रोसेड डेटा को स्टोर करने के लिए घातीय स्थान का उपयोग करना मुझे धोखा देने जैसा लगता है, हालांकि यह प्रश्न में निषिद्ध नहीं है। लेकिन मैं सबसे खराब स्थिति की चर्च के पक्षपाती हो सकता हूं।
त्सुयोशी इतो

mjqxxxx और Tsuyoshi: मैं आप दोनों से सहमत हूँ। मैं पाठ को फिर से लिखता हूं ताकि मुझे आशा है, यह अधिक स्पष्ट है कि मैं सहमत हूं। :)
रादु GRIGore ५'१२

3

शायद आप एक "सूचना पुनर्प्राप्ति" तकनीक का उपयोग कर सकते हैं: प्रीप्रोसेसिंग चरण में, एक उल्टे सूचकांक का निर्माण करें (आपके मामले में एक सरल द्वि-आयामी सरणी पर्याप्त है) जो कि एक तत्व मैप करता है। के सेटों में जो इसे सम्‍मिलित करता है: ।n×|X|xi{1,...,n}Xinv(xi)={XjX|xiXj}

एक पूर्णांक सरणी सेट करें लंबाई की।occ|X|

फिर प्रत्येक पुनः प्राप्त करें , और प्रत्येक doyiAinv(yi)Xjinv(yi)occ[j]=occ[j]+1

अंत में आपको जो सेट चाहिए वो हैं जिनके लिए ।|Xj|=occ[j]

आप दो या दो से अधिक तत्वों को एक साथ अनुक्रमित करके प्रक्रिया (घातीय स्थान की लागत पर) में मनमाने ढंग से गति कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.