अतः,संभव सरणी संयोजन
समस्या
एसक्यूएल से मैं तार के साथ एक सरणी (फ्लैट सरणी) हो रही है जाओ - यह
$rgData = ['foo', 'bar', 'baz', 'bee', 'feo'];
हो अब, मैं चाहते हैं जोड़े के संभावित संयोजन और इस सरणी के तीन गुना (और, सामान्य मामले में, 4 तत्वों ई टीसी के संयोजन) प्राप्त करने के लिए। अधिक विशिष्ट होना करने के लिए: मैं
कि ऊपर सरणी के लिए है, ताकि के लिए गणित की समझ (डुप्लिकेट) के बिना है, यानी उन है, जो गिनती बराबर है में combinations मतलब दोनों जोड़े और तीनो के लिए 10 हो जाएगा।
मेरे दृष्टिकोण
मैं संभव सरणी चयनित आइटम में के लिए मानचित्रण संभावित मान से शुरू कर दिया है। मेरा वर्तमान समाधान यह इंगित करना है कि कोई तत्व "1" और "0" के रूप में चुना गया है या नहीं। कि ऊपर नमूना हो जाएगा के लिए:
foo bar baz bee feo 0 0 1 1 1 -> [baz, bee, feo] 0 1 0 1 1 -> [bar, bee, feo] 0 1 1 0 1 -> [bar, baz, feo] 0 1 1 1 0 -> [bar, baz, bee] 1 0 0 1 1 -> [foo, bee, feo] 1 0 1 0 1 -> [foo, baz, feo] 1 0 1 1 0 -> [foo, baz, bee] 1 1 0 0 1 -> [foo, baz, feo] 1 1 0 1 0 -> [foo, bar, bee] 1 1 1 0 0 -> [foo, bar, baz]
और यह सब मैं क्या करने की जरूरत किसी भी तरह वांछित बिट सेट उत्पादन कर रहा है। यहाँ PHP में मेरी कोड है:
function nextAssoc($sAssoc)
{
if(false !== ($iPos = strrpos($sAssoc, '01')))
{
$sAssoc[$iPos] = '1';
$sAssoc[$iPos+1] = '0';
return substr($sAssoc, 0, $iPos+2).
str_repeat('0', substr_count(substr($sAssoc, $iPos+2), '0')).
str_repeat('1', substr_count(substr($sAssoc, $iPos+2), '1'));
}
return false;
}
function getAssoc(array $rgData, $iCount=2)
{
if(count($rgData)<$iCount)
{
return null;
}
$sAssoc = str_repeat('0', count($rgData)-$iCount).str_repeat('1', $iCount);
$rgResult = [];
do
{
$rgResult[]=array_intersect_key($rgData, array_filter(str_split($sAssoc)));
}
while($sAssoc=nextAssoc($sAssoc));
return $rgResult;
}
-I've एक सामान्य स्ट्रिंग के रूप में मेरी बिट्स स्टोर करने के लिए चुना है। अगली एसोसिएशन के उत्पादन के लिए मेरा एल्गोरिदम है:
- "01" ढूंढने का प्रयास करें। यदि नहीं मिला, तो यह 11..100..0 मामला है (इसलिए यह अधिकतम है, और नहीं पाया जा सकता है)। यदि पाया जाता है, तो दूसरे चरण
- पर जाएं स्ट्रिंग में "01" की सबसे सही स्थिति पर जाएं। इसे "10" पर स्विच करें और उसके बाद बाईं ओर स्थित सभी शून्यों को "01" स्थिति से अधिक सवारी करें। उदाहरण के लिए,
01110
: "01" की सबसे सही स्थिति 0 है, इसलिए सबसे पहले हम इसे "01" से "10" पर स्विच करते हैं। स्ट्रिंग अब10110
होगा। अब, सही भाग पर जाएं (यह10
भाग के बिना है, इसलिए यह 0 + 2 = 2-nd प्रतीक से शुरू होता है), और सभी शून्यों को बाईं ओर ले जाएं, यानी110
011
होगा। नतीजतन, हमारे पास10
+011
=10111
01110
के लिए अगली एसोसिएशन के रूप में है।
मुझे इसी तरह की समस्या मिली है here - लेकिन वहां ओपी डुप्लिकेट के साथ संयोजन चाहता है, जबकि मैं उन्हें डुप्लिकेट किए बिना चाहता हूं।
सवाल
मेरा प्रश्न के बारे में दो अंक है:
- मेरे समाधान के लिए, वहाँ एक और तरीका है अगले थोड़ा और अधिक कुशल सेट का उत्पादन करने के लिए हो सकता है?
- क्या इसके लिए और अधिक सरल समाधान हो सकते हैं? यह मानक समस्या प्रतीत होता है।
के संभावित डुप्लिकेट [एल्गोरिथ्म n से कश्मीर तत्वों के सभी संयोजनों वापस जाने के लिए] (इसमें नहीं है http : //stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n) – ElKamina
वाह, यह दिलचस्प लग रहा है, धन्यवाद @ElKamina –
मैंने सोचा था कि मेरा उत्तर के साथ ठीक था, स्वच्छ PHP कोड और गति के बीच एक अच्छा संतुलन। क्या आपने इसे आसानी से नजरअंदाज कर दिया? –