我正在寻找一种在R中高效创建一个错排(以及相反的特定排列)的方法,与此相关的基础函数似乎没有,这方面在SO上也没有太多信息。
一个明显的开始是使用
这是我的第一种方法:
同样的问题也适用于反过来,即产生具有给定数量固定点
一个明显的开始是使用
sample
来创建向量的排列。但我需要这个排列没有固定点,因此是向量的一个错排。关于这个话题的一个不错的解释,请参考这篇Cross Validated文章。这是我的第一种方法:
derangr <- function(x){
while(TRUE){
xp <- sample(x)
if(sum(xp == x) == 0) break
}
return(xp)
}
在一个while
循环中,我正在检查向量x
和称为xp
的x
的给定排列之间是否存在不动点。如果没有,则我会打破循环并返回该向量。
结果表明,它运行良好:
> derangr(1:10)
[1] 4 5 6 10 7 2 1 9 3 8
> derangr(LETTERS)
[1] "C" "O" "L" "J" "A" "I" "Y" "M" "G" "T" "S" "R" "Z" "V" "N" "K" "D" "Q" "B" "H" "F" "E" "X" "W" "U" "P"
我在思考是否有更好的方法来做这件事,可能是通过某种向量化方式替换while
。同时,我也想关注可伸缩性。
以下是两个示例的microbenchmark
:
library(microbenchmark)
> microbenchmark(derangr(1:10),times = 10000)
Unit: microseconds
expr min lq mean median uq max neval
derangr(1:10) 8.359 15.492 40.1807 28.3195 49.4435 6866.453 10000
> microbenchmark(derangr(LETTERS),times = 10000)
Unit: microseconds
expr min lq mean median uq max neval
derangr(LETTERS) 24.385 31.123 34.75819 32.4475 34.3225 10200.17 10000
同样的问题也适用于反过来,即产生具有给定数量固定点
n
的排列。arrangr <- function(x,n){
while(TRUE){
xp <- sample(x)
if(sum(xp == x) == n) break
}
return(xp)
}
rep(LETTERS, 2)
中那样?如果是这样的话,如果第一个“A”与第二个“A”等互换,是否会有影响? - lokin
)元素保留在它们之前的位置,就不会有影响。 - Val