我需要遍历1到16序列的所有可能排列的列表。
我在permn(1:16)
包中尝试了combinat
,但向量太大了 - 我收到的错误是:
Error: cannot allocate vector of size 155886.9 Gb
有没有办法解决这个问题?我想过可能会以某种方式分裂排列代数......但是还没有找到合适的答案。
答案 0 :(得分:1)
您可以将操作分成两部分,抓取前k个元素的所有可能k元组的列表,然后迭代地抓取剩余16-k值的所有可能的排列。当k = 6时,你有:
%T
现在我们拥有了577万有效的6元组,可以启动你的组合,"所有"剩下的就是计算其余10个元素的所有可能的排列:
vals <- 1:16
k <- 6
start <- as.matrix(do.call(expand.grid, replicate(k, vals, simplify=F)))
reps <- apply(combn(k, 2), 2, function(x) start[,x[1]] == start[,x[2]])
start <- start[rowSums(reps) == 0,]
每次迭代大约需要一分钟,因此您将非常耐心(11年)完整循环运行,或者您需要非常积极地进行并行化。话虽如此,它可以运行,因为你的机器在每次循环迭代时都不应该耗尽内存(你一次只能生成大约400 MB的排列)。