获取排序组合数的算法?

时间:2012-10-26 04:52:03

标签: algorithm combinations sorted

假设有“n”数字,我们从中选择“p”数字(p小于n),以便选择“ p“数字已排序。可以重复选定的号码。我们如何计算我们可以选择的数量组合?例如,如果我们有一组数字说{1,2,3,4,5,6}(n = 6),我们将从集合中选择3个数字(p = 3)进行排序。所以我们可以{1,2,3},{1,1,2},{2,3,6},{4,5,5},{5,5,5} .......由于所有这些组合都已排序,因此它们是有效的。我们怎样才能找到这样的已排序组合的数量


我从排序单词的意思是,当我们从 n 元素的数组中选择 p 元素时,选中 p 元素应该排序。

举一个小例子:

如果集合是{1,2,3,4}(所以n = 4)并且我们要选择3个元素(p = 3),那么我们可以选择p个元素(替换)的方式将是{{1} }。所以选择将有4*4*4=64。但在这些选择中,并非所有选择都已排序。在此示例中,{1,1,1},{1,1,2},{1,1,3}{1,1,4},{1,2,1}.....{3,1,1}...{4,4,4}{1,2,1}未排序。

我想获得排序选择的数量 谢谢。

3 个答案:

答案 0 :(得分:6)

我没有看到排序如何影响结果。对于每个可能的重复组合,都会有相应的排序排列。

因此,问题归结为一次采用p替换的n个元素的组合数。这是直截了当的公式,(n-1 + p)C(p)=阶乘(n-1 + p)/(阶乘(p)*阶乘(n-1))

enter image description here

以下是explanation of the formulaanother one from wolfram

答案 1 :(得分:2)

@ BiGYaN的答案here,是正确的,但缺乏获得此结果的旅程中的幽默(即使在提供的链接上),所以我决定添加这个 -

  1. 首先OP不应该采用集合的类比,因为根据定义,集合不考虑订单,而且包含唯一的项目。

  2. 如果我们采用相同的例子,其中n = 6或[1,2,3,4,5,6],现在我们得到长度为3的序列,这样 -

    pattern = d1< = d2< = d3(d代表数字)。

  3. 我们需要序列如:{[1,1,1],[1,1,2],....,[2,2,3],[2,2,4],... }。 现在,对于这样的序列,从左侧扫描模式并尝试推断我们是否要增加数字。

    对于ex:从d1的左边开始并且如果你想在这里增加d1的原因,如果你决定不这样做 - d1将是'1'并且现在向前移动在d2之前问同样的问题,如果你再次决定不起来,d2再次为'1'。

    如果您决定将其提高5次以获得[6,6,6],则可以随时选择向上5次,因为范围是[1-6]而d1应该至少为6。

    所以,问题就是选择适合5个人的地方

    [up up up up up d1 d2 d3]
    

    这可能是[向上d1向上向上d2 d3],产生[2,6,6],或 [d1向上向上d2向上d3],产生[1,4,5]或任何这样的组合。

    所以,实际答案是 - C(5 up + 3 d's,5 up)或者, 更一般地说

    C(n-1 up's + k digits, n-1 up's) or C(n-1+k, n-1)
    

    其中,k个事物要按照排序的顺序选择。

答案 2 :(得分:1)

您可以从一组k元素中选择替换n元素的方式数量与您可以选择k元素而无需替换元素的方式数相同n + k - 1元素。后一个值是二项式系数n+k-1 choose k,其值为(n+k-1)!/(k! (n-1)!)

非正式示范:

假设我有n个蓝框。我把它们排成一排(所以它们被分类),然后拿出k个红球。除了最后,我把红球放在我喜欢的任何地方,所以行必须以蓝色方框结束。现在,对于每个红色球,我选择以下蓝色框。如果两个或多个红球并排,则它们都对应于同一个蓝色框。

所以红球和蓝框的每一个排列都对应于一些选择,更换蓝框,每一个蓝框选择对应红球和蓝框的排列。

我可以用多少种方式安排红球和蓝盒子?我的行必须以蓝色框结束,所以我把那个拿走了,现在我可以用我选择的任何方式安排剩余的n-1个蓝色框和k个红色球。或者,换句话说,我可以选择k + n-1个位置的k,并将红球放在那些位置,用蓝色方框填充剩余的位置。