【问题标题】:How to find nPr (permutations) efficiently?如何有效地找到 nPr(排列)?
【发布时间】:2013-08-09 19:01:13
【问题描述】:

还有比使用基本公式 n!/(n-r)! 更好的方法吗?就像我们对 nCr(combinations) nCr = (n-l)Cr + (n-1)C(r-1) 所做的那样?

【问题讨论】:

  • 您需要更准确地定义“更好”。
  • 最初,“更好”的方法是编写最简单的代码,确定不够好之后再尝试改进。
  • 我已经实现了基础版。我的问题是,是否有任何其他递归公式来计算排列,就像我们对 nCr 的计算一样,我们不必乘以很多?
  • 如果我错了,请纠正我,但 nCr 的递归函数不会花费指数级的时间来运行吗?每个级别一直调用自己两次。如果您开始将级别组合在一起以避免这种情况,那么您最终会将内容相乘。仅添加的任何加速都会很快失去,因为您实际上必须为这个公式添加多少。

标签: math permutation


【解决方案1】:

这个怎么样:nPr = (n−1)Pr + (n−1)P(r−1) ⋅ r

基本原理:nPr 表示从 n 中选择 r 元素的方式的数量,同时注意它们的顺序而不是放回它们。在上面的递归中,我区分了两种情况。要么您不选择第 n 个元素,在这种情况下,您将从一组 (n−1)r 元素/em>。或者您也将选择第 n 个元素,在这种情况下,您将从一组 中选择其他 (r−1) 元素(n−1),并且在您选择第 n 个元素的顺序中,有 r 个可能性。

除此之外,还请注意,您可以通过仅对差值取乘积来避免这两个阶乘:

  n
─┬──┬─       n!
 │  │   i = ──── = (n−r+1)⋅(n−r+2)⋅…⋅(n−1)⋅n = nPr
 │  │        r!
i=n−r+1

这导致了另一个递归公式:nPr = (n−1)P(r−1) ⋅ n

【讨论】:

  • 您可能应该使用产品树来执行此操作 --- 在非平凡的情况下,nPr = nP((n+r)/2) * ((n+r)/2)Pr。以这种方式处理较小的数字。
  • 请分享 n 和 r 的范围。以固定格式与提到的范围共享公式会很有用。
猜你喜欢
  • 1970-01-01
  • 2014-03-28
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2016-06-28
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多