计算紊乱

时间:2014-11-23 00:56:52

标签: algorithm recursion dynamic-programming combinatorics

来自wiki,计算紊乱的方法是,

  

假设有n个人编号为1,2,...,n。让我们来吧   帽子也编号为1,2,...,n。我们必须找到方法的数量   没有人得到与他/她的号码相同号码的帽子。让我们   假设第一个人拿帽子我。有n - 1种方式   第一个做出这样选择的人。现在有两种可能性,   取决于我是否以帽子1作为回报:

     

我不戴帽子1.这个案子相当于解决   n - 1人和n - 1个帽子的问题:剩下的每个人    - 其余1人中有1人被禁止选择    - 1个帽子(我禁止的选择是帽子1)。       我戴帽子的人1.现在问题减少到n - 2人和n - 2帽子。

     

由此得出以下关系:

!n = (n - 1) (!(n-1) + !(n-2))  

这里我不明白第二部分。我试着想出这样的问题,

NO.1:我是我,所以我不能戴帽子。所以我有n-1选项。这减少了n-1人的n-1帽子将成倍增加(n-1)次的问题。

但我无法理解递归调用的第二部分。 从文章中,“我带帽子的人1”怎么样......?难道不是真的“我禁止的帽子是1”?那我怎么拿帽子1.否则,如果“我禁止的帽子不是1”那么它不会减少到1号吗?

所以我或多或少地无法理解递归调用的这一部分,

!n = (n - 1) (!(n-1) + !(n-2))
                       *******

2 个答案:

答案 0 :(得分:4)

为了清楚起见,我们可以调用紊乱函数f。在f(n),有n个帽子和n个人。每个人都可以选择n-1个帽子。第1人从i选项中取出n-1个帽子。人i仍有n-1个帽子可供选择,其他人n-2必须选择(他们不能选择自己的帽子或i)。

现在我们需要两个i人的案例。把它想象成

  1. i采取帽子1
  2. i不接受帽子1,我们不知道他们将要采取什么行动
  3. 在案例2中,我们知道人i不接受帽子1,但仅此而已。以前我们知道那个人in-1个选择,现在他有n-2,就像其他人一样。这意味着我们可以为这种情况计算f(n-1)。在案例1中,不再禁止人i带帽子1.实质上,我们知道人i和人1已交换帽子而不再需要匹配,因此F(N-2)。

    这两种情况都是可能的,所以我们有一个复发,它将(n-1)个选择乘以发生的可能性f(n) = (n-1)(f(n-1) + f(n-2))

答案 1 :(得分:1)

有两个声明:

  1. 在N的紊乱之间存在双射,其中1-> i和i-> 1,以及N-2的紊乱。
  2. 在N的紊乱之间存在双射,其中1-> i和i-> j!= 1,并且N-1的紊乱。
  3. 第一个是显而易见的:一旦你从{1,...,n}的紊乱中删除了1-> i和i-> 1,你就会陌生化剩下的n-2项。相反,如果你有{2,3,...,i-1,i + 1,...,n}的紊乱,那么你可以把它变成{1,...的紊乱。 。,n}通过添加映射1-> i和i-> 1。

    第二个观察通过注意到如果你有{2,...,n}的紊乱,那么你可以通过添加地图1-&gt将它变成{1,...,n}的紊乱;我和改变任何地图到我映射到1而不是。相反,如果你有{1,...,n}的紊乱,其中1-> i和我没有映射到1,那么你可以创建{2,...,n的紊乱通过删除1-> i映射,并将任何映射更改为1以映射到i。

    这为您提供了一种计算紊乱的方法:

    D(n)= sum(i = 2..n)(D(n-1)+ D(n-2))=(n-1)(D(n-1)+ D(n- 2))