STL 中 next_permutation 的全排列思路

本文介绍了STL中的next_permutation与prev_permutation函数如何实现全排列,详细解析了next_permutation背后的数学原理,包括迭代过程及子问题的划分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL中,next_permutation 与 prev_permutation 可实现全排列。
使用 next_permutation 时,需要先将 vector 的元素顺序。
使用 prev_permutation 时,需要先将 vector 的元素逆序。

 

多说一句,如要求所有组合的问题,比如说 5 个数的所有可能的组合情况,则由 00000 到 11111 的变化过程,刚好遍历所有组合;相当于 ( 1 + 1 ) ^ n = 全组合加和的数学等式。

 

next_permutation 之数学原理

 

由全顺序到全逆序过程中的枚举,这一动态规划过程是由后向前进行的。

 

迭代过程
设序列 a = [ a<1>, a<2>, ..., a<n> ],在 i 处 (1 <= i < n),有 [ a<i+1>, ... a<n> ] 为递减序列,表示后半段已完成全逆序操作。从后半段中找出大于 a<i> 的最小值,并与 a<i> 互换,并对后半段全部翻转,使其顺序。如是完成一步迭代。

 

每步迭代均返回一种排列,每步迭代都需对 i 重新定位,要求 [ a<i+1>, ... a<n> ] 为全逆序列。

 

子问题的划分
设某迭代过程完成后,新的 [ a<i+1>, ... a<n> ] 序列成为子序列(子问题),对其再次由全顺序到全逆序完成全部操作。则此时将再次在 i 处操作迭代过程,相当于将 a<i> 处的值逐渐增大,直到最大值;此时,新的分界线成为了 a<i-1>,如是直到首元素。
子序列 [ a<i+1>, ... a<n> ] 枚举的过程不会影响到 [ a<1>, a<2>, ..., a<i> ],除非 [ a<i+1>, ... a<n> ] 全逆序操作完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值