【发布时间】:2012-08-24 00:41:22
【问题描述】:
假设我有 3 个绿色球、2 个橙色球和 8 个黄色球。我想订购它们,鉴于所有相同颜色的球都是相同的,我如何生成所有可能的序列。
在 R 中,使用gregmisc,我可以这样做
balls<-c('orange','orange', 'green', 'green','green','yellow'...'yellow')
然后就做吧
g <- permutations(length(balls),length(balls),v=balls,set=F)
g.reduced <- g[!duplicated(g),]
但这似乎非常不必要。
【问题讨论】:
-
如果您的颜色向量是 v,则只需执行
g <- unique(permutations(length(v),length(v),v,F))。单线。 -
绝对更具可读性,但是,这仍然没有摆脱计算重复项的额外计算工作。随着长度(v)变得更大,这可能是不可行的。
-
好吧,这个算法怎么样。为简单起见,我只假设一个重复的元素,但我认为概括它不会是一个问题。
unique首先是一切,然后计算排列。你得到一个矩阵,其中包含其他元素的排列和以前不唯一的元素之一。将每一行展开为长度为m + 1 + n - 1的向量,其中 n 是先前非唯一元素的数量,m 是其他元素的数量。从末尾开始 m + 1 个元素,将第一个元素放在原始行中并遍历所有可能的元素 -
原行中元素的间距,填充中间的
n - 1其他元素。这个想法是置换矩阵给出了一个排序,你用你的n - 1重复元素填充潜在的空白。我将尝试对其进行编码或伪编码并将其放在答案中。 -
这可能与这里的问题相同:Permute all unique enumerations of a vector in R: stackoverflow.com/q/5671149/210673
标签: r