एक सेट के विभाजन का प्रतिनिधित्व करने के लिए एक कॉम्पैक्ट तरीका क्या है?


11

सेट विभाजन का प्रतिनिधित्व करने के लिए कुशल डेटा संरचनाएं मौजूद हैं । इन डेटा संरचनाओं में यूनियन और फाइंड जैसे संचालन के लिए अच्छी समय जटिलताएं हैं, लेकिन वे विशेष रूप से अंतरिक्ष-कुशल नहीं हैं।

एक सेट के विभाजन का प्रतिनिधित्व करने के लिए एक अंतरिक्ष-कुशल तरीका क्या है?

यहाँ एक संभव शुरुआती बिंदु है:

मुझे पता है कि विभाजन की संख्या के साथ एक सेट के तत्वों है , वें बेल संख्या । तो तत्वों के साथ एक सेट के विभाजन का प्रतिनिधित्व करने के लिए इष्टतम स्थान जटिलता बिट्स है। इस तरह के प्रतिनिधित्व को खोजने के लिए, हम ( तत्वों के एक सेट के विभाजन के सेट ) और ( से के पूर्णांक का सेट) के बीच एक-से-एक मैपिंग की तलाश कर सकते हैं ।बी एन एनNBNNलॉग 2 ( बी एन ) एन 1 बी एनNlog2(BN)N1BN

क्या ऐसी मैपिंग है जो गणना करने के लिए कुशल हो? "कुशल" से मेरा तात्पर्य यह है कि मैं इस कॉम्पैक्ट प्रतिनिधित्व को / से आसान हेरफेर प्रतिनिधित्व (जैसे सूचियों की सूची) से या में बहुपद में परिवर्तित करना चाहता हूं ।लॉग 2 ( बी एन )Nlog2(BN)


सोच रहा था, 2 ( B N ) कितनी दूर तक कर सकता है / सेट के प्रत्येक तत्व को अद्वितीय पूर्णांक असाइन करने का भोले / प्राकृतिक एन्कोडिंग से जहां पूर्णांक विभाजन का प्रतिनिधित्व करता है #? शायद यह "इतना अंतर नहीं है" ...log2(BN)
vzn

जवाबों:


7

आप अपनी एन्कोडिंग को खोजने के लिए नीचे दिए गए पुनरावृत्ति फॉर्मूला का उपयोग कर सकते हैं: यह तत्व वाले भाग में कितने अन्य तत्व हैं, इस पर विचार करके साबित किया जाता है । अगर इनमें से हैं , तो हमारे पास विकल्प हैं, और विकल्प बाकी के विभाजन के लिए हैं।

Bn+1=k=0n(nk)Bk.
n+1nk(nnk)=(nk)Bk

इसका उपयोग करते हुए, हम किसी भी विभाजन को श्रेणी में एक संख्या में बदलने के लिए एक पुनरावर्ती एल्गोरिदम दे सकते हैं । मुझे लगता है आप पहले से ही आकार के एक सबसेट परिवर्तित करने का एक तरीका है की रेंज में एक नंबर करने के (जैसे एक एल्गोरिथ्म पास्कल की पुनरावृत्ति ) का उपयोग करके उसी तरह तैयार किया जा सकता है ।n+10,,Bn+11k{1,,n}0,,(nk)1(nk)=(n1k)+(n1k1)

मान लीजिए कि वाले भाग में अन्य तत्व हैं। उनका कोड खोजें । उस सीमा के सभी शेष तत्वों को "संपीड़ित" करके विभाजन की गणना करें । पुन: अपने कोड गणना । नया कोडn+1kC1{1,,nk}C2

C=l=0nk1(nl)Bl+C1Bnk+C2.

दूसरी दिशा में, एक कोड दिया गया , इस तरह के अनूठे ढूंढें जैसे कि और चूंकि , यह रूप में लिखा जा सकता है , जहां । अब वाले हिस्से में तत्वों को कोड करता है , और कोड को विभाजन करता हैCk

l=0nk1(nl)BlC<l=0nk(nl)Bl,
C=Cl=0nk1(nl)Bl.
0C<(nk)BnkC1Bnk+C20C2<BnkC1n+1C2{1,,nk}n+1, जो पुनरावर्ती रूप से डिकोड किया जा सकता है। डिकोडिंग को पूरा करने के लिए, आपको बाद वाले विभाजन को "अनप्लग" करना होगा ताकि इसमें सभी तत्व शामिल न हों जो कि भाग में दिखाई देते हैं ।n+1


यहाँ कैसे उसी तकनीक का उपयोग करने के लिए एक उप-समूह एन्कोड करने के लिए है के आकार के , रिकर्सिवली। यदि तो कोड , इसलिए मान लीजिए । यदि तो को का एक कोड हो , आकार के का उपसमूह के रूप में ; का कोड । यदि तो जाने का एक कोड होना , आकार के एक सबसेट के रूप में की ; का कोडS{1,,n}kk=00k>0nSC1S{n}k1{1,,n1}SC1nSC1Sk{1,,n1}Sहै ।C1+(n1k1)

कोड को डिकोड करने के लिए , दो मामले हैं। अगर तो डिकोड एक सबसेट की आकार की जिसका कोड है , और उत्पादन । अन्यथा, डिकोड एक सबसेट की आकार की जिसका कोड है , और उत्पादन ।CC<(n1k1)S{1,,n1}k1CS{n}S{1,,n1}kC(n1k1)S


उत्कृष्ट जवाब; धन्यवाद। माइनर बग: शीर्ष पर पुनरावृत्ति फार्मूले के लिए प्रूफ स्केच में, मुझे लगता है कि आप का मतलब है "वहाँ हैं" के बजाय "उन में से हैं" - फिर शेष तत्वों को तरीकों से विभाजित किया जा सकता है । nkkkBk
cberzan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.