next_permutation 解释
next_permutation 是一个用于生成序列下一个排列的算法,通常用于排列组合问题中。它存在于C++标准库的 <algorithm> 头文件中。
基本概念
- 排列(Permutation): 一组元素的所有可能顺序组合
- 字典序(Lexicographical order): 类似字典中的排序方式,逐元素比较
函数原型
template <class BidirectionalIterator>
bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
功能
- 将范围
[first, last)中的元素重新排列为下一个字典序更大的排列 - 如果当前排列已经是最大排列(降序排列),则将其重置为最小排列(升序排列)并返回 false
- 否则返回 true
工作原理
- 从序列末尾向前查找,找到第一个不满足降序的元素(称为"枢轴")
- 在枢轴之后的元素中找到比枢轴大的最小元素
- 交换这两个元素
- 将枢轴之后的所有元素反转(变为升序)
示例
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
do {
for (int i : v) std::cout << i << " ";
std::cout << "\n";
} while (std::next_permutation(v.begin(), v.end()));
}
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
时间复杂度
O(n),其中n是序列长度,因为最多需要扫描整个序列两次(查找枢轴和交换元素)和反转部分序列一次。
使用场景
- 需要生成所有可能的排列时
- 解决组合优化问题
- 密码学中的排列组合
- 游戏开发中的关卡或物品排列
注意事项
- 序列必须是可以比较的(定义了
<操作符) - 要生成所有排列,初始序列应该是最小排列(通常为升序)
- 有对应的
prev_permutation函数用于生成前一个排列
1482

被折叠的 条评论
为什么被折叠?



