我在任何地方都找不到答案,所以这是我的解决方案。
问题是:如何计算 R 中的幂集?
可以使用库“sets”执行此操作,使用命令2^as.set(c(1,2,3,4))
产生输出{{}, {1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2,
4}, {3, 4}, {1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4}, {1,
2, 3, 4}}
。但是,这使用了递归算法,速度相当慢。
这是我想出的算法。
它是非递归的,因此它比其他一些解决方案快得多(在我的机器上比“sets”包中的算法快约 100 倍)。速度仍然是 O(2^n)。
该算法的概念基础如下:
for each element in the set:
for each subset constructed so far:
new subset = (subset + element)
这是R代码:
编辑:这是同一概念的更快版本;我的原始算法在这篇文章的第三条评论中。对于一组长度为 19 的机器,这个在我的机器上快 30%。
powerset = function(s){
len = length(s)
l = vector(mode="list",length=2^len) ; l[[1]]=numeric()
counter = 1L
for(x in 1L:length(s)){
for(subset in 1L:counter){
counter=counter+1L
l[[counter]] = c(l[[subset]],s[x])
}
}
return(l)
}
此版本通过在开始时使用其最终长度初始化向量并跟踪保存新子集的位置的“计数器”变量来节省时间。也可以通过分析计算位置,但速度稍慢。