全排列算法优化:使用引用传参、循环展开和位运算
#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; }
改进说明:
- 使用引用传参: 在原始代码中,
dfs函数传递的是数组的副本,每次递归都会复制数组,浪费时间和空间。使用引用传参可以避免这个问题,直接操作原数组,节省时间和空间开销。 - 使用循环展开: 递归调用本身有一定的开销,可以通过循环展开来减少递归调用次数,从而提高效率。
- 使用位运算: 原始代码使用一个数组来判断元素是否被使用,每次判断都需要遍历数组。使用位运算可以更有效地判断元素是否被使用。
优化后的代码:
#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 著作权归作者所有。请勿转载和采集!