language-agnostic - 您将如何迭代计算 0 到 N 的所有可能排列?

标签 language-agnostic math permutation

我需要迭代计算排列。方法签名如下所示:
int[][] permute(int n)
对于 n = 3例如,返回值将是:

[[0,1,2],
 [0,2,1],
 [1,0,2],
 [1,2,0],
 [2,0,1],
 [2,1,0]]

您将如何以最有效的方式迭代地执行此操作?我可以递归地执行此操作,但我有兴趣看到许多以迭代方式执行此操作的替代方法。

最佳答案

参见 QuickPerm 算法,它是迭代的:http://www.quickperm.org/

编辑:

为清楚起见,用 Ruby 重写:

def permute_map(n)
  results = []
  a, p = (0...n).to_a, [0] * n
  i, j = 0, 0
  i = 1
  results << yield(a)
  while i < n
    if p[i] < i
      j = i % 2 * p[i] # If i is odd, then j = p[i], else j = 0
      a[j], a[i] = a[i], a[j] # Swap
      results << yield(a)
      p[i] += 1
      i = 1
    else
      p[i] = 0
      i += 1
    end
  end
  return results
end

关于language-agnostic - 您将如何迭代计算 0 到 N 的所有可能排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390954/

相关文章:

c - 根据用户给定的长度生成给定字符(A、B、C)的所有可能排列,以在 C 中生成字符串

language-agnostic - 循环变量的理想变量命名约定是什么?

algorithm - 从数字列表中找到一对和的算法?

php - 这个 PHP 广告 yield 分享逻辑有效吗?

algorithm - 矩阵中可能存在的矩形数量

algorithm - 这种字符串排列是如何工作的

language-agnostic - (x == x + 1) 是否总是为整数 x 返回 false?

algorithm - 如何为多人游戏随机创建公平迷宫?

c# - 对数组中的所有值执行算术运算

在等距投影中将 3D 坐标转换为 2D