php - 编写更快的组合算法

标签 php algorithm recursion combinatorics

我正在尝试编写一个组合算法,以在不重复的情况下从 n 中获取 k 的所有可能组合。

公式为:

n!/(k!(n-k)!)); 

结果以数组形式结束。我实际写的是这样的:

function Factorial($x)
{
    if ($x < 1)
    {
        echo "Factorial() Error: Number too small!";
    )

    $ans = 1;
    for ($xx = 2; $xx >= $x; $xx++)
    {
        $ans = $ans * $xx;
    }

    return($ans);
}

function Combination($selectcount,$availablecount)
{
    $ans = Factorial($availablecount) / (
        Factorial($availablecount - $selectcount) * Factorial($selectcount)
    );

    return ($ans);
}

这是完成此任务的最快方法吗?有没有办法加快速度?也许递归地写它?

最佳答案

我认为问题是计算 C(n,k) 可以在不计算阶乘的情况下完成,诀窍是首先注意

C(n,k) = (n*(n-1)...(n-k+1)) / (1*2*...*k) = (n/1)*(n-1/2)*...(n-k+1/k)

也为了效率

C(n,k) = C(n,n-k), therefore choose which ever is smaller k or n-k

如果有错误,请随意编辑,因为我是从 C 语言转换过来的,我不懂 php

function nCk($n, $k)
{
    if( $n-$k<$k )
        $k = $n-$k;
    $ans = 1;
    for( $i=1; $i<=$k; ++$i )
    {
        $ans = ($ans*($n-$i+1))/$i;
    }
    return $ans;
}

关于php - 编写更快的组合算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650327/

相关文章:

java - iterator.hasNext() 返回错误值

java - 递归搜索二叉树

php - 从数据库中选择项目与另一个表中的最新日期进行比较

php - Getimagesize() - 读取错误

php - 使用 htaccess 的 ssl 上的不安全内容图像和 js

algorithm - 打印从根到叶子的 n 叉树的所有路径

javascript - 为什么javascript中的递归这么慢?

php - "It is not safe to rely on the system' s 时区设置”

Google Distance Matrix API 中距离计算背后的算法

java 。如何使用 forEach 检查元素是否已成功添加到集合和跟踪索引中?