यह आप क्या कर रहे हैं की तरह लगता है एक सेट/सरणी के partitions के लिए खोज रहे हैं।
ऐसा करने का एक तरीका यह रिकर्सिवली है:
- एक 1 तत्व सरणी [x] ठीक एक विभाजन
- अगर एक्स के रूप एक्स = [सिर] पूंछ, एक सरणी है तो है एक्स के विभाजन पूंछ के प्रत्येक विभाजन को ले कर और प्रत्येक संभव में सिर जोड़कर उत्पन्न होते हैं। उदाहरण के लिए यदि हम [3,2,1] के विभाजन [2 [1]] [विभाजन] [2,1]] से विभाजन उत्पन्न कर रहे थे [हम] या तो [3] से [2,1] या एक अलग तत्व के रूप में जोड़ सकते हैं , जो हमें 5 विभाजन [[3,2,1] या [[2,1], [3]] देता है [1,2,3]
एक रूबी कार्यान्वयन थोड़ा दिखता है जैसे
def partitions(x)
if x.length == 1
[[x]]
else
head, tail = x[0], x[1, x.length-1]
partitions(tail).inject([]) do |result, tail_partition|
result + partitions_by_adding_element(tail_partition, head)
end
end
end
def partitions_by_adding_element(partition, element)
(0..partition.length).collect do |index_to_add_at|
new_partition = partition.dup
new_partition[index_to_add_at] = (new_partition[index_to_add_at] || []) + [element]
new_partition
end
end
स्रोत
2011-12-27 11:31:28
बढ़िया काम करता है! लेकिन मैंने पाया कि यह 10 वस्तुओं के बराबर या उससे ऊपर के लिए लटकता है। कोई विचार क्यों? चल रहे विभाजन ([1,2,3,4,5,6,7,8,9,10]) ruby hangs – mbdev
संग्रह शामिल बहुत तेजी से मिलता है - 10 आइटम सरणी के 115975 विभाजन हैं, फिर भी यह केवल लिया गया मेरी मशीन पर कुछ सेकंड। यदि आप इसे irb में चला रहे हैं, तो यह परिणाम को आज़माकर प्रदर्शित करेगा - अच्छा विचार नहीं! –
यह वास्तव में रेलों में लटका हुआ है और रूबीमाइन से आरएसपीईसी के तहत चल रहा है। मैं मैक पर शेर चला रहा हूँ। मेरी समस्या वास्तव में इससे अधिक विशिष्ट है, इसलिए मैंने इसे यहां पोस्ट किया: http://stackoverflow.com/questions/9732944/get-all-possible-subsets-preserving-order – mbdev