在给定N-1个约束的情况下,计算小于整数N的数字的可能排列数

Count the number of possible permutations of numbers less than integer N, given N-1 constraints

本文关键字:整数 数字 排列 小于 N-1 约束 情况下 计算      更新时间:2023-10-16

我们得到了一个整数N,我们需要计算小于N的数字的排列总数。我们还得到了N-1约束。例如:

如果N=4,则计数给定的0,1,2,3的排列:

0>1
0>2
0>3

我想做一个图,然后计算同一级别的数字排列的总数,并将其与其他级别的排列相乘。例如:

例如:

             0
           / |  
          /  |   
         1   2    3 ------> 3!=6 So total no of permutations are 6.

但是我在C++中实现它有困难。此外,这个问题是在Facebook黑客杯上被问到的,比赛现在结束了。我看过其他人的代码,发现他们使用DFS。有什么帮助吗?

实现这一点的最简单方法是使用标准排列生成器,并过滤掉每个违反条件的排列。这显然是非常低效的,并且对于较大的N值是不可计算的。这样做有点像这些比赛中的"愚蠢"选项,可以让不那么聪明的参赛者完成问题。

熟练的方法需要深入了解计算组合和排列的方法。为了说明这种方法,我将举一个例子。输入:

   N = 7  
   2 < 4  
   0 < 3  
   3 < 6  

我们首先通过将相关条件组合为一个条件来简化这一点,如下所示:

   2 < 4  
   0 < 3 < 6  

从最长的条件开始,确定差距的组合计数(这是关键的见解)。例如,一些组合如下:

   XXXX036  
   XXX0X36  
   XXX03X6  
   XXX036X  
   XX0XX36  
   etc.  

现在,你可以看到有4个缺口:?0?3.6.我们需要计算X在这四个间隙中的可能分区。这样的分区数量是(7选3)=35(你明白为什么了吗?)。现在,我们接下来乘以下一个条件的组合,即2<4在剩余的空白点(X)上。我们可以相乘,因为这个条件完全独立于0<3<6条件。此组合计数为(4选择2)=6。最终条件在2个点中有2个值=2!=2.因此,答案是35 x 6 x 2=420。

现在,让我们把它稍微复杂一点。添加条件:

   1 < 6

这样改变计算的方式是036之前必须按该顺序出现。但是,现在,我们有三种可能的安排:

   1036  
   0136  
   0316  

因此,总计数现在是(7选择4)x 3 x(3选择2)=35 x 3 x 3=315。

因此,概括一下,程序就是将问题隔离到独立的条件中。对于每个独立的条件,计算分区的组合,然后将它们相乘。

我已经手动浏览了这个示例,但您可以对相同的过程进行编程。