如何枚举 R 中 k = 1 的 n 个二进制对象的所有顺序?
How to enumerate all orderings of n binary objects where k = 1 in R?
如果我有 n = 七个二进制对象,并且 k = 其中三个等于一个,我如何在 R 中枚举 7 选择 3 的所有 35 个排列?例如,1110000 就是这样一种排列(也是处理剩余 34 种排列的合理起点)。我可以通过执行类似以下操作(使用硬编码数字)嵌套三个循环来编写专门针对 7 选择 3 的非递归算法:
n2Ck <- function() {
output <- NULL
out <- as.numeric(c(rep(1,times=3),rep(0, times=4)))
for (i in 1:5) {
for (j in (i+1):6) {
for (k in (j+1):7) {
out <- out*0
out[c(i,j,k)] <- 1
output <- rbind(output,out)
}
}
}
return(output)
}
产生:
nC2k()
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
out 1 1 1 0 0 0 0
out 1 1 0 1 0 0 0
out 1 1 0 0 1 0 0
out 1 1 0 0 0 1 0
out 1 1 0 0 0 0 1
out 1 0 1 1 0 0 0
out 1 0 1 0 1 0 0
out 1 0 1 0 0 1 0
out 1 0 1 0 0 0 1
out 1 0 0 1 1 0 0
out 1 0 0 1 0 1 0
out 1 0 0 1 0 0 1
out 1 0 0 0 1 1 0
out 1 0 0 0 1 0 1
out 1 0 0 0 0 1 1
out 0 1 1 1 0 0 0
out 0 1 1 0 1 0 0
out 0 1 1 0 0 1 0
out 0 1 1 0 0 0 1
out 0 1 0 1 1 0 0
out 0 1 0 1 0 1 0
out 0 1 0 1 0 0 1
out 0 1 0 0 1 1 0
out 0 1 0 0 1 0 1
out 0 1 0 0 0 1 1
out 0 0 1 1 1 0 0
out 0 0 1 1 0 1 0
out 0 0 1 1 0 0 1
out 0 0 1 0 1 1 0
out 0 0 1 0 1 0 1
out 0 0 1 0 0 1 1
out 0 0 0 1 1 1 0
out 0 0 0 1 1 0 1
out 0 0 0 1 0 1 1
out 0 0 0 0 1 1 1
但我不知道如何为任意 n 和 k 生成函数。 (这里的输出格式相当随意,顺便说一句。)
我在其他语言中看到过一些针对此类问题的递归解决方案(例如,here, and here),但我的递归确实很差,并且无法理解它们以翻译这些算法到 R。我知道递归解决方案想将问题分解为两类之一:第一个元素为 1 的 (n-1,k-1),以及第一个元素为 0 的 (n -1,k),但我迷失了如何实施(我希望这个问题有一个 newb
标签......我会 高兴 来改进这个问题如果你有反馈给我)。
这里是用 R 解决问题的示例代码。selected
向量用于存储选定的对象索引。
# your code goes here
n <- 9
k <- 5
count <- 0
selected <- vector( 'numeric' , k )
rec <- function(x,y) {
if (y == 0){
print (selected)
}
else if( x <= n ){
for( i in x:(n-y+1) ){
selected[k-y+1] <<- i
rec( i+1, y-1 )
}
}
}
rec(1,k)
如果我有 n = 七个二进制对象,并且 k = 其中三个等于一个,我如何在 R 中枚举 7 选择 3 的所有 35 个排列?例如,1110000 就是这样一种排列(也是处理剩余 34 种排列的合理起点)。我可以通过执行类似以下操作(使用硬编码数字)嵌套三个循环来编写专门针对 7 选择 3 的非递归算法:
n2Ck <- function() {
output <- NULL
out <- as.numeric(c(rep(1,times=3),rep(0, times=4)))
for (i in 1:5) {
for (j in (i+1):6) {
for (k in (j+1):7) {
out <- out*0
out[c(i,j,k)] <- 1
output <- rbind(output,out)
}
}
}
return(output)
}
产生:
nC2k()
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
out 1 1 1 0 0 0 0
out 1 1 0 1 0 0 0
out 1 1 0 0 1 0 0
out 1 1 0 0 0 1 0
out 1 1 0 0 0 0 1
out 1 0 1 1 0 0 0
out 1 0 1 0 1 0 0
out 1 0 1 0 0 1 0
out 1 0 1 0 0 0 1
out 1 0 0 1 1 0 0
out 1 0 0 1 0 1 0
out 1 0 0 1 0 0 1
out 1 0 0 0 1 1 0
out 1 0 0 0 1 0 1
out 1 0 0 0 0 1 1
out 0 1 1 1 0 0 0
out 0 1 1 0 1 0 0
out 0 1 1 0 0 1 0
out 0 1 1 0 0 0 1
out 0 1 0 1 1 0 0
out 0 1 0 1 0 1 0
out 0 1 0 1 0 0 1
out 0 1 0 0 1 1 0
out 0 1 0 0 1 0 1
out 0 1 0 0 0 1 1
out 0 0 1 1 1 0 0
out 0 0 1 1 0 1 0
out 0 0 1 1 0 0 1
out 0 0 1 0 1 1 0
out 0 0 1 0 1 0 1
out 0 0 1 0 0 1 1
out 0 0 0 1 1 1 0
out 0 0 0 1 1 0 1
out 0 0 0 1 0 1 1
out 0 0 0 0 1 1 1
但我不知道如何为任意 n 和 k 生成函数。 (这里的输出格式相当随意,顺便说一句。)
我在其他语言中看到过一些针对此类问题的递归解决方案(例如,here, and here),但我的递归确实很差,并且无法理解它们以翻译这些算法到 R。我知道递归解决方案想将问题分解为两类之一:第一个元素为 1 的 (n-1,k-1),以及第一个元素为 0 的 (n -1,k),但我迷失了如何实施(我希望这个问题有一个 newb
标签......我会 高兴 来改进这个问题如果你有反馈给我)。
这里是用 R 解决问题的示例代码。selected
向量用于存储选定的对象索引。
# your code goes here
n <- 9
k <- 5
count <- 0
selected <- vector( 'numeric' , k )
rec <- function(x,y) {
if (y == 0){
print (selected)
}
else if( x <= n ){
for( i in x:(n-y+1) ){
selected[k-y+1] <<- i
rec( i+1, y-1 )
}
}
}
rec(1,k)