【问题标题】:Is recursion or stack necessary for factorial time complexity algorithms?阶乘时间复杂度算法是否需要递归或堆栈?
【发布时间】:2014-12-31 13:49:30
【问题描述】:

我有一组元素。我需要生成这些元素的所有排列。

我使用的算法的时间复杂度是 O(n!),它是基于递归的。自然地,每个递归算法都可以使用无限循环和堆栈转换为非递归算法。

是否可以在不使用递归或堆栈+循环等价的情况下生成所有排列?

【问题讨论】:

  • 对于“因子时间复杂度算法是否需要递归或堆栈”的答案通常是。以一个简单地遍历从 1 到 n! 的所有数字的代码为例。至于“是否可以在不使用递归或堆栈+循环等价的情况下生成所有排列?”你可以找到答案here
  • @Rufflewind 这可能是一个答案,而不是评论:)
  • @AdamStelmaszczyk:我是,但我觉得这个问题可能与我已经链接的问题重复。
  • @Rufflewind 发布此类问题的答案仍然可以。在这种情况下,我认为这不是重复的,这里的问题与“如何有效地生成链表的所有可能排列?”不一样。

标签: algorithm recursion big-o time-complexity


【解决方案1】:

答案

阶乘时间复杂度算法是否需要递归或堆栈

一般是no,微不足道。以一个简单地遍历从 1 到 n 的所有数字的代码为例!:

for i from 1 to factorial(n):
    play("ni.mp3")

至于

是否可以在不使用递归或堆栈+循环等价的情况下生成所有排列?

答案是,你可以找到答案here。根据您希望生成它们的顺序,有几种不同的变化可用。这是第一个答案的示例:

您从最右边的数字开始,向左移动一个位置,直到看到一个小于其邻居的数字。然后将下一个值的数字放在那里,并在其后按升序排列所有剩余的数字。这样做,直到没有更多事情可做。稍微考虑一下,您就可以根据它们的数量在线性时间内对这些数字进行排序。

【讨论】:

    【解决方案2】:

    如前所述:
    不,阶乘时间复杂度算法不需要递归和堆栈。

    但是当我阅读您的帖子时,您似乎想问一下

    是否有可能比 O(n!) 更快地生成 n 个元素的所有排列?

    答案也是:

    因为有 n! n 个元素的不同排列,每个保存或显示或对 all n 执行任何操作的算法!排列,至少需要 O(n!) 时间。这包括生成排列。

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多