创建具有固定长度的可索引非重复组合

时间:2012-11-07 15:24:26

标签: php algorithm combinations

基于这个问题

Ordered Fixed Length Combination of a String

我创建了一个PHP算法,可以在固定长度上创建字符组合(基本上是对Java答案的重写)

private function getCombination($length, $input) {
    $result = array();

    if ($length == 0) {
        return $result;
    }

    $first = substr($input, 0, $length);
    $result[] = $first;

    if (strlen($input) == $length) {
        return $result;
    }

    $tails = $this->getCombination($length - 1, substr($input, 1));

    foreach ($tails as $tail) {
        $tmp = substr($input, 0, 1) . $tail;

        if (!in_array($tmp, $result)) {
            $result[] = $tmp;
        }
    }

    return array_merge($result, $this->getCombination($length, substr($input, 1)));
}

对于另一个问题,Create fixed length non-repeating permutation of larger set,我得到了一个(精彩的)算法,它可以使排列变得可转换,通过提供一个总是能产生完全相同排列的“密钥”来有效地使它们成为可压缩的。一组字符和相同的长度。

好吧,现在我基本上需要相同的但是对于组合,与我在其他问题中的排列形成鲜明对比。

上述算法可以用同样的方法修改吗?创建像

这样的函数的意义
public function getCombinationByIndex($length, $index);

这会在使用算法创建的一千个中返回一个组合而不事先创建

1 个答案:

答案 0 :(得分:1)

我在C#中编写了一个类来处理使用二项式系数的常用函数,这是您的问题似乎属于的问题类型 - 假设您使用组合而不是排列。它执行以下任务:

  1. 以任意N选择K到文件的格式输出所有K索引。 K-index可以用更具描述性的字符串或字母代替。

  2. 将K索引转换为已排序二项系数表中条目的正确索引。这种技术比依赖迭代的旧发布技术快得多。它通过使用Pascal三角形中固有的数学属性来实现这一点。

  3. 将已排序的二项系数表中的索引转换为相应的K索引。我相信它也比旧的迭代解决方案更快。

  4. 使用Mark Dominus方法计算二项式系数,这样就不太可能溢出并使用更大的数字。

  5. 该类是用.NET C#编写的,它提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用名为InitTable的bool值,当为true时,将创建一个通用列表来保存要管理的对象。如果此值为false,则不会创建表。为了使用上述4种方法,不需要创建该表。提供访问者方法来访问该表。

  6. 有一个关联的测试类,它显示了如何使用该类及其方法。它已经过2个案例的广泛测试,并且没有已知的错误。

  7. 要阅读此课程并下载代码,请参阅Tablizing The Binomial Coeffieicent

    将此类移植到php应该非常简单。您可能不必移植类的通用部分来实现您的目标。取决于您正在使用的组合数量,您可能需要使用比4字节整数更大的字大小。