如何计算集合的排列,而不是集合

时间:2015-02-02 19:21:33

标签: java algorithm math

假设我们有以下整数集合:{1,1,2}。我们可以通过3种可能的方式安排此集合的顺序:

1,1,2-

1,2,1

2,1,1

我们如何计算一般可以安排整数集合的方式?假设集合的大小非常大(在最坏的情况下为10 ^ 5),但答案总是足够小以适应长。是否存在针对此问题的有效解决方案,如果存在,如何在Java中实现它?

2 个答案:

答案 0 :(得分:2)

假设您有n个由整数x_i的n_i副本组成的整数。

计算出数量的安排只需计算

t = n!

但是,由于您并不关心如何安排具有相同值的数字,因此对于i的每个值,减少总数:

t = t / n_i!

在你的情况下,你有3个整数,1个副本2个,2个副本1个。

你计算:

t = 3! = 6
t = t/1! = 6/1 = 6
t = t/2! = 6/2 = 3

所以答案是3。

答案 1 :(得分:0)

  

我们如何计算一般可以安排整数集合的方式?

遍历集合,计算每个数字在集合中出现的次数。

排列数的公式为size factorial / number of duplicate integers factorial。在您的示例1,1,2中,大小为3,重复整数的数量为2.

3! / 2! = 3 * 2 * 1/2 * 1 = 3;

另一种更加计算机友好的计算方式3! / 2!是先将2阶乘法分开,留下3。

如果集合没有重复的整数,那么排列的数量为size factorial