为1到16个序列创建排列列表(无替换)

时间:2015-07-20 00:43:57

标签: r bigdata permutation combinatorics

我需要遍历1到16序列的所有可能排列的列表。 我在permn(1:16)包中尝试了combinat,但向量太大了 - 我收到的错误是:

Error: cannot allocate vector of size 155886.9 Gb

有没有办法解决这个问题?我想过可能会以某种方式分裂排列代数......但是还没有找到合适的答案。

1 个答案:

答案 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的排列)。