2015-07-20 67 views
0

我需要遍歷1到16個序列的所有可能排列的列表。 我試圖permn(1:16)combinat包,但矢量太大 - 我得到一個錯誤,指出:爲1到16個序列創建排列列表(無替代)

Error: cannot allocate vector of size 155886.9 Gb 

有沒有解決這個得到的一種方式?我想可能是以某種方式拆分排列世代......但還沒有拿出正確的答案。

+0

你的矢量有多大? –

+4

好吧,16! (如16階乘)是〜2.1e13,所以這就是你創建的排列次數。這是一個相當大的矢量,你是否確定*你需要每一個排列? –

+0

@ mathematical.coffee我想我會......我需要模擬按照每個可能的順序逐一繪製數字。 – mishakob

回答

1

您可以將操作拆分爲兩部分,獲取前k個元素的所有可能k元組列表,然後反覆獲取剩餘16-k值的所有可能排列。隨着K = 6,您有:

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,] 

現在我們有577萬有效6元組,可以開始您的組合,剩下的工作就是計算剩餘的10個元素的所有可能的排列「所有」:

library(combinat) 
apply(start, 1, function(x)) { 
    remaining <- permn(vals[!vals %in% x]) 
    tuples <- lapply(remaining, function(y) unname(c(x, y))) 
    # Process this subset of the tuples however you want 
} 

這對於每次迭代都需要大約一分鐘的時間,因此您需要非常耐心(11年)才能運行完整循環,否則您需要非常積極地進行並行處理。話雖如此,它可以運行,因爲你的機器不應該在每次循環迭代時耗盡內存(你一次只能產生約400MB的排列)。