0
我需要遍歷1到16個序列的所有可能排列的列表。 我試圖permn(1:16)
從combinat
包,但矢量太大 - 我得到一個錯誤,指出:爲1到16個序列創建排列列表(無替代)
Error: cannot allocate vector of size 155886.9 Gb
有沒有解決這個得到的一種方式?我想可能是以某種方式拆分排列世代......但還沒有拿出正確的答案。
我需要遍歷1到16個序列的所有可能排列的列表。 我試圖permn(1:16)
從combinat
包,但矢量太大 - 我得到一個錯誤,指出:爲1到16個序列創建排列列表(無替代)
Error: cannot allocate vector of size 155886.9 Gb
有沒有解決這個得到的一種方式?我想可能是以某種方式拆分排列世代......但還沒有拿出正確的答案。
您可以將操作拆分爲兩部分,獲取前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的排列)。
你的矢量有多大? –
好吧,16! (如16階乘)是〜2.1e13,所以這就是你創建的排列次數。這是一個相當大的矢量,你是否確定*你需要每一個排列? –
@ mathematical.coffee我想我會......我需要模擬按照每個可能的順序逐一繪製數字。 – mishakob