如何计算最大基数为K的所有幂集?

时间:2018-11-26 23:51:38

标签: r

我用$ M $的基数设置了$ S $。我想创建最大基数为$ K $的$ S $的所有幂集,其中$ K \ le M $。 我使用$ R $来创建功率集,但是它没有提供将其约束到上述情况的选项。由于$ S $的大小确实很大(500),对于我的问题,我只需要计算基数最多为5的所有子集。 有人可以帮我在R中做到这一点吗?

1 个答案:

答案 0 :(得分:0)

带有| S | = 500 k不会很大。对于k = 0、1、2、3、4、5,这是有多少个子集的大小最大为k:

cumsum(sapply(0:5, choose, n = 500))
## [1]            1          501       125251     20833751   2593864876 257838552476

现在转到代码注释处,combn(x = S, m = i, simplify = FALSE)给出大小为i的所有子集,因此:

#  test data
S <- head(letters, 4)
k <- 2

subsets_k <- do.call("c", lapply(0:k, combn, x = S, simplify = FALSE))

给出0、1或k = 2个元素的所有子集:

> subsets_k
[[1]]
character(0)

[[2]]
[1] "a"

[[3]]
[1] "b"

[[4]]
[1] "c"

[[5]]
[1] "d"

[[6]]
[1] "a" "b"

[[7]]
[1] "a" "c"

[[8]]
[1] "a" "d"

[[9]]
[1] "b" "c"

[[10]]
[1] "b" "d"

[[11]]
[1] "c" "d"

或者我们可以将它们表示为以逗号分隔的元素的字符向量:

sapply(subsets_k, toString)
## [1] ""     "a"    "b"    "c"    "d"    "a, b" "a, c" "a, d" "b, c" "b, d" "c, d"

或直接:

unlist(sapply(0:k, function(i) combn(S, i, FUN = toString)))
## [1] ""     "a"    "b"    "c"    "d"    "a, b" "a, c" "a, d" "b, c" "b, d" "c, d"