LINUX.ORG.RU

Генерация подмножеств заданной мощности


0

0

Простенькая задача

Дано {1,2,3}

Нужно получить, скажем {1,2}, {2,3}, {1,3}

При этом мне почему-то кажется, что генерировать все подмножества и фильтровать по длине очень неэффективно. Есть более красивые алгоритмы?

★★★★★

Это более чем стандартная задача. Вот тебе решение на чём-то, похожем на язык программирования:

void gen (set a, int depth) {
if (depth >maxdepth) {
print(a);
}
foreach j in elements {
if (not j in a) {
gen(a+{j},depth+1);
}
}
}

...
gen({},0);

gaa ★★
()

foo()
{
  if test $2 -eq 1; then
    seq 1 $1
  else
    seq $2 $1 \
      | while read i; do
          foo $(($i - 1)) $(($2 - 1)) | sed 's/$/ '$i'/'
        done
  fi
}



$ foo 6 3
1 2 3
1 2 4
1 3 4
2 3 4
1 2 5
1 3 5
2 3 5
1 4 5
2 4 5
3 4 5
1 2 6
1 3 6
2 3 6
1 4 6
2 4 6
3 4 6
1 5 6
2 5 6
3 5 6
4 5 6

dilmah ★★★★★
()

choose n xs = choose' n (length xs) xs where
    choose' 0 _ _ = [[]]
    choose' n l _ | n > l = []
    choose' n l (x:xs) = map (x:) (choose' (n-1) (l-1) xs) ++ choose' n (l-1) xs

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

*Choose> choose 3 [1..6]
[[1,2,3],[1,2,4],[1,2,5],[1,2,6],[1,3,4],[1,3,5],[1,3,6],[1,4,5],[1,4,6],[1,5,6
],[2,3,4],[2,3,5],[2,3,6],[2,4,5],[2,4,6],[2,5,6],[3,4,5],[3,4,6],[3,5,6],[4,5,6
]]

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.