【问题标题】:Create indexable non-repeating combinations with fixed length创建具有固定长度的可转位非重复组合
【发布时间】:2012-11-07 15:24:26
【问题描述】:

基于这个问题

Ordered Fixed Length Combination of a String

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

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);

这将返回一个使用算法创建的一千个可能的组合而不事先创建它们

【问题讨论】:

    标签: php algorithm combinations


    【解决方案1】:

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

    1. 以适合任何 N 选择 K 的格式将所有 K 索引输出到文件。 K-indexes 可以替换为更具描述性的字符串或字母。

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

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

    4. 使用Mark Dominus 方法计算二项式系数,该方法不太可能溢出并且适用于较大的数字。

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

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

    要了解该课程并下载代码,请参阅Tablizing The Binomial Coeffieicent

    将这个类移植到 php 应该很简单。您可能不必移植类的通用部分来实现您的目标。考虑到您正在使用的组合数量,您可能需要使用比 4 字节整数更大的字长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多