【发布时间】:2016-10-28 02:57:42
【问题描述】:
我试图找出一种有效的方法来获得向量中的元素(向量始终是 1:n 之间的序列)中的元素可以分成两个相等大小的组的所有唯一组合。向量中的每个元素必须表示一次(在两组之一中)。例如,当 n = 6 时,向量将为 [1,2,3,4,5,6]。这可以分成十种独特的方式来形成两个大小相等的组:
123 | 456
124 | 356
125 | 346
126 | 345
134 | 256
135 | 246
136 | 245
145 | 236
146 | 235
156 | 234
请注意,在组中的值的顺序无关紧要,因此:
156 | 234
等同于:
651 | 342
还要注意对称解也不重要,所以:
156 | 234
等同于:
234 | 156
当 n = 4 时,有 3 个解。当 n = 6 时,有 10 个解。当 n = 8 时,有 35 个解。我相信我想出了一种在 R 中获得这些解决方案的方法。但是,一旦 n 变大,它就会有点慢。在大多数情况下,我对我所拥有的感到满意,但想问是否有人对提高其速度或代码质量等的方法有建议。特别是,我从一个有很多重复的解决方案开始,然后我删除重复。我认为这使得算法相当慢。
library(combinat)
# Number of elements in array
n = 6
# Array
dat <- 1:n
# All possible permutations for array
ans <- permn(dat)
lengthAns <- length(ans)
ansDF <- data.frame()
# Place first permutation in final answer data frame
ansDF <- rbind(ansDF, ans[[1]])
# Look at the rest of the possible permutations. Determine for each one if it is truly unique from all the previously-listed possible permutations. If it is unique from them, then add it to the final answer data frame
for (i in 2:lengthAns){
j = i
k = TRUE
while (k && j > 1){
j = j-1
if(setequal(ans[[i]][1:(n/2)], ans[[j]][1:(n/2)]))
k = FALSE
if(setequal(ans[[i]][1:(n/2)], ans[[j]][(n/2+1):(n)]))
k = FALSE
}
if (k){
ansDF <- rbind(ansDF, ans[[i]])
}
}
# At this point, ansDF contains all unique possible ways to split the array into two-equally sized groups.
【问题讨论】:
标签: r algorithm combinations permutation