Проблема раздела Matlab

Моя голова застряла в поисках алгоритма решения моей проблемы.

Предположим, у меня есть N числа (скажем, 4), и я хочу иметь ВСЕ X-разделы (X = N / 2)

Пример:

2-разделами {1,2,3,4} являются: (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) [Проще говоря: все комбинации ]

Я понятия не имею, как генерировать эти комбинации. Если у кого-то из вас есть идея в уме (мне все равно, на каком языке. Псевдокода вполне достаточно. Меня не волнует, повторяется он или явный).

С уважением, Bigbohne


person Bigbohne    schedule 07.09.2010    source источник


Ответы (3)


В Matlab есть функция для этого:

http://www.mathworks.com/help/techdoc/ref/nchoosek.html

>> x = [1,2,3,4]

x =

1     2     3     4

>> nchoosek(x, 2)

ans =

 1     2
 1     3
 1     4
 2     3
 2     4
 3     4

Конструкции цикла, такие как maxwellb, ужасно медленны в Matlab ...

person tauran    schedule 07.09.2010
comment
THX! Это то, что я искал! - person Bigbohne; 07.09.2010

Вот код Matlab,

myNums = [2,3,6,5];
for i = 1:size(myNums,2)
    combinationsSet{i} = nchoosek(myNums,i);
end
person blueskin    schedule 07.09.2010
comment
цикл предназначен для изменения количества выбираемых элементов, - person blueskin; 07.09.2010

foreach i in SET
    foreach j in SET
        if i < j, SAY "I have a partition ($i,$j)"
    NEXT j
NEXT i

это зависит от функции итерации для вашего набора и работает за N ^ 2 времени.

Для Matlab ознакомьтесь с функциями, предоставленными для вас, например гребешок

person maxwellb    schedule 07.09.2010
comment
fwiw, это, как вы говорите, комбинации, РАЗДЕЛ - это другое определение, когда речь идет о наборах: раздел НАБОР {1,2,3,4} - это отдельный способ помещения элементов НАБОР в разные контейнеры ( подмножества). Итак, {{1,2}, {3}, {4}} - это разбиение {1,2,3,4}. - person maxwellb; 07.09.2010
comment
это создаст дубликаты - person second; 07.09.2010
comment
Хорошо ... НО !!!! что, если "X" станет больше 2? ... допустим ... у меня есть {1,2,3,4,5,6,7,8}, и я хочу иметь все 4 комбинации? например: {1,2,3,4}, {1,2,3,5} ... - person Bigbohne; 07.09.2010
comment
@second: спасибо. @Bigbohne: тогда у вас будет больше уровней цикла. @tauran: действительно, медленно, но начало. использование функции nchoosek, предоставляемой Matlab, действительно является лучшим решением. - person maxwellb; 07.09.2010