【问题标题】:Permutation for string in phpphp中字符串的排列
【发布时间】:2011-12-29 03:31:44
【问题描述】:

在查找长度大于 7 的字符串的字符串排列时,我的代码有问题。例如“abcdefgh”。我必须找到最多 12 个长度的单词的排列。请查看我的代码并建议是否可以进行任何优化。

function permute($str)
{
    if (strlen($str) < 2) 
    {
        return array($str);
    }

    $permutations = array();
    $tail = substr($str, 1);
    foreach (permute($tail) as $permutation) 
    {
        $length = strlen($permutation);

        for ($i = 0; $i <= $length; $i++) 
        {
            $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
        }
    }

    /* Return the result */
    return $permutations;
}

$arr = permute('abcdefghijkl');

【问题讨论】:

  • 你能估计出长度为n的字符串的排列个数,这个数字增长的速度有多快?
  • 这有什么问题?排列在 O(n!) 中运行,因此将 12 个长度的字符串作为 12 运行应该需要很长时间!是一个很大的数字。
  • 虽然有一个技巧可以在多项式时间内生成第 n 个排列,但是如果你想要所有排列,你需要计算所有 n!其中。
  • 我的实际问题是从数据库中为 Anagrammer 游戏获取此字符串的所有可能组合。我累了.. 找不到长度为 12 的字符串的正确解决方案和算法
  • 我认为您需要考虑一种不同的方法来做到这一点。您的数据库中似乎将有 10 亿条“in statements”?

标签: php optimization permutation


【解决方案1】:

似乎解决方案的核心应该在于不检查所有内容。例如,如果你给我单词“earthquakes”,那么应该立即可以看出字典中没有任何以“qk”开头的单词,因此检查q k _ _ _ _ _ _ _ _ _ 形式的所有排列是不必要的。这种类型的检查将为您节省大量的比较和查找操作。仅这个“qk”示例就可以排除 362,880(9!)个排列,否则您需要检查这些排列。

因此,与其计算所有排列,然后如果它与其中一个排列匹配则从字典中提取,我会确保您生成的每个排列实际上首先是一个可能的单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2011-06-24
    • 2022-09-27
    • 2018-11-04
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多