对R中向量的所有唯一枚举进行置换
||
我正在尝试找到一个可以置换向量的所有唯一置换的函数,同时不计算同一元素类型的子集中的并置数。例如:
dat <- c(1,0,3,4,1,0,0,3,0,4)
已
factorial(10)
> 3628800
可能的排列,但只有10!/(2!*2!*4!*2!)
factorial(10)/(factorial(2)*factorial(2)*factorial(2)*factorial(4))
> 18900
忽略同一元素类型的子集中的并置时的唯一排列。
我可以通过combinat
包中的unique()
和permn()
函数获得此功能
unique( permn(dat) )
但这在计算上非常昂贵,因为它涉及枚举n!
,这可能比我需要的排列高出一个数量级。有没有一种方法,而无需先计算n!
?
没有找到相关结果
已邀请:
5 个回复
翰冒绢县
和代码:
它不会返回相同的顺序,但是排序之后,结果是相同的。
对于我的第一次尝试,请参阅编辑历史记录。
悲帽慑彤电
它确实计算
,但不像
函数那样先生成所有排列。 实际观看:
更新:我刚刚意识到问题是关于生成所有唯一排列的问题,而不仅仅是指定它们的数量-抱歉! 您可以通过为较少的一个元素指定唯一的排列,然后在其前面添加uniqe元素,来改进ѭ17部分。好吧,我的解释可能会失败,所以让消息人士说:
这样您可以提高速度。我懒于在您提供的向量上运行代码(花了很多时间),这是在较小的向量上进行的比较:
我认为您可以通过将此函数重写为递归来获得更多收益! 更新(再次):我试图用我有限的知识来构造一个递归函数:
这有很大的收获:
如果适合您,请举报!
徐百晴墓斜
包中的
函数。可以很容易地使用它来获取所有唯一的排列:
在基准测试中,我发现它在ѭ25上比OP和daroczig的解决方案要快,但比Aaron的解决方案要慢。
倾坞髓
按频率排序(上面已经是)。 从最频繁的值开始,该值占10个点中的4个。确定10个可用点内4个值的唯一组合。 (0,1,2,3),(0,1,2,4),(0,1,2,5),(0,1,2,6) ...(0,1,2,9),(0,1,3,4),(0,1,3,5) ...(6,7,8,9) 转到第二个最频繁的值,它占用6个可用点中的2个,并确定它是6个中的2个的唯一组合。 (0,1),(0,2),(0,3),(0,4),(0,5),(1,2),(1,3)...(4,6), (5,6) 然后是2之4: (0,1),(0,2),(0,3),(1,2),(1,3),(2,3) 剩下的值2之2: (0,1) 然后,您需要将它们组合成每种可能的组合。这是一些伪代码(我确信这是一种更有效的算法,但这应该不会太糟):
超可林
封装,我相信它是现有方法中最快的。更重要的是,结果按字典顺序排列(可能更可取)。
基准测试表明,
比此处描述的所有其他方法快得多