【问题标题】:Generating all permutations of a given string quickly [closed]快速生成给定字符串的所有排列[关闭]
【发布时间】:2013-12-23 22:09:39
【问题描述】:

我想在 C++ 中生成给定字符串的所有可能排列。

我仅在 StackOverflow 上阅读了此讨论:How to generate all permutations of an array in sorted order?

答案很好,但是一旦我开始说一串 12-14 个字符的字符串,程序就会花费大量时间。

有没有更好的方法来解决这个问题,这样它不会花费超过几秒钟?

假设我有一串 10 个字符的字符串。

【问题讨论】:

  • 我认为如果 std::next_permutation 可以做得更快,他们就会这样做。
  • 嗯,是的。当然,这需要相当长的时间。这是O(n(n!)) 问题。而12! 则超过 4 亿。即使找到下一个排列神奇的是O(1),它仍然是O(n!) 的问题。
  • 是的。这是个大问题。
  • 所以答案只是“不”。速度不是非常快,也许如果对代码进行优化,您会获得一个常数 factor ,但是当您谈到阶乘复杂性时, factor 几乎可以忽略不计。
  • @SanskarKatiyar:确实;如此之大,以至于当前的硬件对此无能为力。如果你想生成n! 序列,那么你需要做一些n! 操作的倍数,并且它们可以并行化的数量是有限制的。量子处理器或自我复制的纳米机器可能会有所帮助,但必须首先发明它们。

标签: c++ string algorithm permutation


【解决方案1】:

我不认为你能比std::next_permutation做得更好

std::sort( myString.begin(), myString.end() );

do {
  std::cout << myString;
} while ( std::next_permutation( myString.begin(), myString.end() ) );

【讨论】:

  • 仅在链接中提到的代码中使用过。我需要它更快地处理。
  • @SanskarKatiyar:运气不好。
  • 一个 10 个字符的字符串有 360 万个排列。无论算法如何,这需要时间。如果没有别的,那就是内存分配和数据复制。
【解决方案2】:

如果您不需要按字典(排序)顺序排列,那么您只需交换数组中的两个相邻元素即可从给定的排列中获得下一个排列。基本上,用 std:next_permutation() 代替 O(n * n!),您可以遍历 O(n!) 中的所有排列。

这类算法称为Generation with minimal changes

由于您需要所有排列,因此您的输出和整个解决方案将至少为 O(n!)。所以,算法上你能得到的最好的结果是 O(n!),所以我建议研究一下你的实现的优化:利用并行计算、低级编程语言、编译器/架构优化等。

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多