#include<bits/stdc++.h> using namespace std; const int N = 10; int n, a[N], b; void dfs(int x) { if(x == n + 1) { for(int i = 1; i <= n; i++) { cout << a[i] << ' '; // 使用单引号 } cout << endl; return; } for(int i = 1; i <= n; i++) { if((b >> i & 1) == 0) { b |= (1 << i); a[x] = i; dfs(x + 1); b &= ~(1 << i); a[x] = 0; } } } int main() { cin >> n; dfs(1); return 0; }

改进说明:

  1. 使用引用传参: 在原始代码中,dfs 函数传递的是数组的副本,每次递归都会复制数组,浪费时间和空间。使用引用传参可以避免这个问题,直接操作原数组,节省时间和空间开销。
  2. 使用循环展开: 递归调用本身有一定的开销,可以通过循环展开来减少递归调用次数,从而提高效率。
  3. 使用位运算: 原始代码使用一个数组来判断元素是否被使用,每次判断都需要遍历数组。使用位运算可以更有效地判断元素是否被使用。

优化后的代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n, a[N], b;
void dfs(int x) {
    if(x == n + 1) {
        for(int i = 1; i <= n; i++) {
            cout << a[i] << ' '; // 使用单引号
        }
        cout << endl;
        return;
    }
    for(int i = 1; i <= n; i++) {
        if((b >> i & 1) == 0) {
            b |= (1 << i);
            a[x] = i;
            dfs(x + 1);
            b &= ~(1 << i);
            a[x] = 0;
        }
    }
}
int main() {
    cin >> n;
    dfs(1);
    return 0;
}

通过这些优化,全排列算法的效率得到了显著提高。

全排列算法优化:使用引用传参、循环展开和位运算

原文地址: https://www.cveoy.top/t/topic/nSbH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录