【STL】next_permutation的实现

剖析next_permutation的实现 我们今天可以讨论一下全排列的问题,因为我们STL库中实现了这个next_permutation,我们结合库里的这个函数说一下我们全排列的递归和非递归的实现。一、递归实现       我们通过递归解决一个问题的时候,往往要看问题是不是都是同样性质和解法的问题,并且问题的规模是不是在一步步减小,直到问题规模为常量,也就是有一个结束的条件。            对于我们的这个全排列问题,大家应该都知道... 阅读详情

一、使用字典序法

首先,从最尾端开始寻找两个相邻的元素,令第一个元素为*i, 第二个元素为*ii, 且满足 *i < *ii(其中pos[*i] < pos[*ii], pos代表下标)。找到这样一组相邻的元素之后,再从最尾端开始往前检验,找出第一个大于*i的元素,令为 *j, 将i, j,元素对调,再将ii之后的所有元素颠倒顺序,即可求出“下一个”排列组合。


以下解法为题目: leetcode next permutation

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int len = nums.size();
        
        // 只有只一个元素或为空
        if(len < 2) return;
        
        // 如果当前元素已经是最大排列时,下一个则是最小排列
        bool flag = false;
        for(int i = 0; i < len-1; ++ i) {
            if(nums[i] < nums[i+1]) {
                flag = true;
                break;
            } 
        }
        if(!flag) {
            reverse(nums.begin(), nums.end());
            return;
        }
        
        // 找到从最尾端开始的满足*i < *ii的相邻元素
        int posx = len-2, posy = len-1;
        for(int i = len-2; i >= 0; i --) {
            if(nums[i] < nums[i+1]) {
                posx = i;
                posy = i + 1;
                break;
            }
        }
        
        // 从最尾端开始找到第一个大于 *i 的元素,并与之对调
        for(int i = len - 1; i >= 0; -- i) {
            if(nums[i] > nums[posx]) {
                swap(nums[posx], nums[i]);
                break;
            }
        }
        
        // 反转ii之后的所有元素
        reverse(nums.begin() + posy, nums.end());
    }
};


二、康托逆展开

对于给定一个n和一个k,求由1-n组成的第k大排列

以下解法的题目来源:leetcode permutation sequence

class Solution {
public:
    int fac(int n) {
        int ans = 1;
        for(int i = 1; i <= n; ++ i) ans *= i;
        return ans;
    }
    
    string getPermutation(int n, int k) {
        
        // 获取当前(n-1)!
        int cnt = fac(n - 1);
        
        // 组成排列的所有元素
        vector<int> permutation;
        for(int i = 1; i <= n; ++ i) permutation.push_back(i);
        
        string ans = "";
        for(int i = n; i >= 1; i --) {
            // idx 为右边比当前i小的元素个数
            int idx = (k-1) / cnt;
            // 置当前元素
            ans += to_string(permutation[idx]);
            // 去除当前元素以避免产生重复数
            permutation.erase(permutation.begin() + idx);
            // 获取当前剩下的第k大排列
            k = k - idx * cnt;
            // 防止 n = 1 的情况,除0异常
            if(i > 1) cnt /= (i-1);
        }
        
        return ans;
    }
};
已知一个排列,可以用康托展开求其序数。假设排列为,这个排列对应的序数为 。其中 表示位于第i位右边比 小的元素的个数, .

上述过程即为康托展开的过程,而给出的代码为逆康托展开


参考:

侯捷,  STL源码剖析


STL next_permutation和prev_permutation 算法原理和自行实现 文章目录一、本文目标二、next_permutation算法和思想三、next_permutation具体实现四、prev_permutation算法和思想五、prev_permutation具体实现六、总结和分析 一、本文目标 在【其一 排列组合和子集生成】这篇文章中,我列举了多种实现排列和组合的方法。但是,那是以求出全部的结果为目标的函数。 如果,要求给出某个排列的前/下一个排列(字典序),那... 阅读详情

相关推荐

C++ STL中next_permutation的实现原理及编程示例

通过合理运用next_permutation函数,我们可以在编程中方便地生成序列的所有排列,为问题的解决提供便利。next_permutation是C++ STL中的一个函数,用于生成当前序列的下一个排列。接下来,在从右向左的顺序中找到第一个大于a[i]的元素a[k],并将a[i]与a[k]进行交换。首先,将序列按照从左到右的顺序进行遍历,找到第一个相邻的元素对(i, j),满足a[i] < a[j]。这一步是为了保证生成的排列是当前序列的下一个排列,且是最小的下一个排列。

PixelInk的博客 477

C++中next_permutation函数的使用方法、原理及手动实现

一、next_permutation的使用方法 1、头文件 naxt_permutation函数包含在algorithm库中 2、参数 和sort的参数一样,一般传两个参数,第一个是排列开始的地址,第二个是排列结束的下一个地址,如实现数组第1-3排列的下一个排列:next_permutation(a,a+3)。一般作用对象是数组。 3、作用 next_permutation是求当前排列的下一个排列(按字典序升序的下一个序列),如1234的next_permutation是1243。在全排列当中经常会用。 4

harry12138小白的博客 1万+

LangChain实战:用FAISS搭建本地文档问答系统(含Word文件处理避坑指南)

本文详细介绍了如何利用LangChain框架和FAISS向量数据库构建本地化智能文档问答系统,特别针对Word文档处理中的技术难点提供实用解决方案。通过模块化设计、本地化支持和多格式兼容,实现高效文档处理与精准问答,满足企业对数据隐私和安全的需求。

o4p5q6r7s的博客 408

C++中 next_permutation 函数的使用方法、原理及手动实现

C++中next_permutation函数的使用方法、原理及手动实现

m0_51913750的博客 2626

瑞芯微RK3506开发板DSM音频开发避坑指南:从硬件改接到内核配置全流程

本文详细解析了在瑞芯微RK3506开发板上进行DSM音频开发的完整流程与关键避坑点。内容涵盖从硬件改造(如电阻焊接)、内核驱动配置(DTS参数、补丁应用)到系统调试与波形分析的全过程,旨在帮助嵌入式开发者高效实现高信噪比、低成本的音频方案,避免常见错误。

weixin_29164091的博客 405

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

STL---next_permutation 实现

STL中提供了两个关于计算排列组合关系的算法,分别是next_permutation和 prev_permutation。 分析:给出一个排列P,求出下一个排列P1是什么? 比如 P = 1 2 3 4 5。显然P1: 1 2 35 4。 P2:1 2 4 3 5。 规律: P-&gt;P1 :直接对 4 5 逆序。 P1-&gt;P2 : 后两个...

sgh666666的博客 906

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

Time_1023的博客 1871

C++ STL next_permutation的实现原理

next_permutation得到下一个排列,如对序列 a, b, c,每一个元素都比后面的小,它的下一个序列即为a, c, b next_permutation的函数原型如下: template bool next_permutation(       BidirectionalIterator _First,        BidirectionalIterator _

hongchangfirst 6034

华为OD机考双机位C卷 - 评委评分 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 评委评分 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1750

013 PID参数整定:Ziegler-Nichols法

几年前在调试一台伺服压机,客户要求位置精度±0.01mm,响应时间小于50ms。我按照教科书上的经验值设了P=1.5,I=0.02,D=0.01,结果电机一启动就开始尖叫,位置超调直接干到0.3mm,然后开始震荡,像极了喝醉的舞者。现场工程师看我的眼神,就像在看一个刚毕业的实习生。那次之后我明白了一个道理:PID参数不是靠猜的,也不是靠经验公式硬套的。你需要一个系统的方法,而Ziegler-Nichols法就是那个让你从“瞎调”走向“有章可循”的起点。

m0_50546716的博客 99

STL中next_permutation()和prev_permutation()函数实现

next_permutation()和permutation()是STL提供的用来计算下一个排列和上一个排列的算法;刷题中经常用到,比较有用。 next_permutation()实现: template <class iterator> bool next_permutation(iterator first,iterator last) { if(first==last)r...

you558的博客 304

STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可。 1、键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样这个8个引脚都是高电平,然后就进行列扫描。例如:假如按下3按钮,Y3 列扫描,把F4先拉低,然后读取F0-F3的状态,就会读出为1110,这就可 以知道是F3行拉低了,同时这时候是程序控制F4拉低的,这样就可以知道是F4列导致它转态变化了的,这样就可以定位出是F4列F3行的按键按下了;其他的列也是这样子扫描

lhh_qrsly的博客 7058

STL next_permutation 算法原理和自行实现

目标 STL中的next_permutation 函数和 prev_permutation 两个函数提供了对于一个特定排列P,求出其后一个排列P+1和前一个排列P-1的功能。 这里我们以next_permutation 为例分析STL中实现的原理,prev_permutation 的原理与之类似,我们在最后给出它们实现上差异的比较 问题: 给定一个排列P,求出其后一个排列P+1是什么...

weixin_30776863的博客 95

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

STL中next_permutation和sort()的底层实现

1. 我们都知道STL中next_permutation(iterator_first,iterator_end)和prev_permutation(iterator_first,iterator_end)分别是对一个序列的升序全排列和降序全排列(其中相同元素是同一种情况),废话不多说,我们更关心它的底层实现,代码如下: 代码源自:https://www.cnblogs.com/luruiyua...

夏洛克福尔摩斯 368

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ STL之next_permutation小证明与Java实现

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

Beyyes 1919

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

STL next_permutation 算法原理和实现

转载自:https://www.cnblogs.com/luruiyuan/p/5914909.html 目标 STL中的next_permutation 函数和 prev_permutation 两个函数提供了对于一个特定排列P,求出其后一个排列P+1和前一个排列P-1的功能。 这里我们以next_permutation 为例分析STL中实现的原理,prev_permutation 的原理...

weixin_30512785的博客 188

如何实现STL中的next_permutation函数?

问题,实现 STL 中的 next_permutation() .回答来自stackoverflow:先让我们来看一些排列:1 2 3 4 1 2 4 3 1 3 2 4 1 3 4 2 1 4 2 3 1 4 3 2 2 1 3 4 ...我们如何从一个排列转移到下一个排列呢?首先,让我们用另外一个角度来看待这个问题.如果将排列中每个元素视作一个数字(当然这里就是数字,但是元素是’a’, ‘b’的

李树花开,风中摇曳 1139

python next permutation_C++ STL next_permutation的实现原理

next_permutation得到下一个排列,如对序列 a, b, c,每一个元素都比后面的小,它的下一个序列即为a, c, bnext_permutation的函数原型如下:templatebool next_permutation(BidirectionalIterator _First,BidirectionalIterator _Last);templatebool next_permu...

weixin_39551554的博客 317

用STL的next_permutation算法实现全排列

1、next_permutation实现原理 在《STL源码解析》中找到了这个函数,在此也简单叙述一下原理:   在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数。前者是求出下一个排列组合,而后者是求出上一个排列组合。所谓“下一个”和“上一个”,书中举了一个简单的例子:对序列 {a, b, c},每一

身是菩提树、心是明镜台、时时勤拂拭、莫使惹尘埃 1582

【STL】next_permutation实现全排列

对于n个数的全排列,我们选择最简单的方法,用C++的STL模板库中next_permutation函数,生成这n个数组成的全排列,代码如下: //输入n个不同的数全排列 #include<bits/stdc++.h> #define N 10 using namespace std; int main(){ int t,n,i,a[N]; while(scanf("%d",&a...

我的技术栈碎碎念空间 358

C++ STL next_permutation()函数算法实现

@[TOC](C++ STL next_permutation()函数算法实现) 1. next_permutation()函数 next_permutation函数原型为: template bool next_permutation (BidirectionalIterator first, BidirectionalIterator last); template <class Bi...

weixin_45845093的博客 750

STL实现全排列 next_permutation

在#include的头文件中 next_permutation(a,a+len); 返回的是一个bool类型的值;直到找不到全排列为止,返回false。 并且对全排列重复出现的情况可以过滤,即最后得出的全排列的结果中,不会有相同的出现。 并且貌似只能从小到大的产生排列,也就是说,如果a中的字符串为刚好从大到小,那么就一组都产生不了。   Orders Time Lim

yumao19921006的专栏 405
上一篇: 【C++】深度探索C++对象模型之Function语意学
下一篇: 【leetcode】90. Subsets II
小do在努力
博客等级 码龄16年 58粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值