C++ Primer笔记——排列算法(next_permutation、prev_permutation、is_permutation)

2023-05-16

目录

概述

①next_permutation

②prev_permutation

③is_permutation


概述

页数:P778 (A.2.7 排列算法) 

头文件:<algorithm>

函数名:next_permutation & prev_permutation & is_permutation

C++为我们提供了专门用于排列的算法。这些算法可以自动将内容按照字典序进行排列。

举个例子:现在有字符a、b、c,我们想要知道这三个字符有多少种组合方式,那么就可以用到排列算法。

①next_permutation

bool next_permutation(iterator first, iterator last);

bool next_permutation(iterator first, iterator last, compare comp);

前两个参数分别是待排列的数列头尾迭代器。第三个参数为自定义排列方式,默认是字典序。

每次排列都会改变数列的组合并返回true,既需要向前处理数列也需要向后处理,因此应该使用双向迭代器

当排列到最后一种形式后(字典序最大的序列),会将数列排列成最小形式,同时返回false。

有两点非常值得注意:

1.排列的方式是数列从左往右按照字典序从小到大,以abc为例:排列为abc、acb、bac、bca、cab、cba。

这是因为abc的第一个元素(最左边)小于任何其他排列的首元素,且第二个元素也小于任何其他元素,以此类推。

2.next_permutation并不是把所有序列排出来,而是根据数列起始情况,向后排列。比如输入的序列是bac,那么排列出来只能是bac、bca、cab、cba。

示例代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int> arr = { 1, 2, 3 };
	do
	{
		for (auto n : arr) cout << n << " ";
		cout << endl;
	} 
	while (next_permutation(arr.begin(), arr.end()));
	return 0;
}

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int> arr = { 2, 3, 1 };
	do
	{
		for (auto n : arr) cout << n << " ";
		cout << endl;
	} 
	while (next_permutation(arr.begin(), arr.end()));
	return 0;
}

②prev_permutation

使用方式与next_permutation类似,只是该函数反向排列,即从起始序列开始向前排列。同样以abc为例,假如输入的序列是bac,那么prev_permutation输出的就是bac、acb、abc。

图示如下:

代码示例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
	vector<int> arr = { 3, 2, 1};
	do
	{
		for (auto n : arr) cout << n << " ";
		cout << endl;
	} 
	while (prev_permutation(arr.begin(), arr.end()));
	return 0;
}

③is_permutation

该函数用于确定某特定排序是否属于该序列。

bool next_permutation(iterator first1, iterator last1, iterator first2);

 函数前两个参数是指定排序的头尾迭代器,第三个参数是某序列的起始迭代器。

如果序列中存在这种排序,返回true;不存在就返回false。

当然,这里有两点需要注意的:

1.指定排序的长度需要小于等于序列长度。

2.第三个参数不一定非要是头迭代器。举例说明:假如指定排序为bac,序列为f a b c,那么第三个参数可以是beign() + 1,即从a开始排列,只排字母a b c。当然排多少个字母取决于指定排序的长度,这里是3。这也就是为什么指定排序的长度可以小于序列的长度。

代码示例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
using namespace std;
int main()
{
	vector<int> arr = { 3, 2, 1 };
	vector<int> tmp = { 1, 2, 3 };
	if (is_permutation(arr.begin(), arr.end(), tmp.begin()))
	{
		cout << "right" << endl;
	}
	else cout << "false" << endl;
	return 0;
}

 特殊情况:

...
vector<int> arr = { 3, 2, 1 };
vector<int> tmp = { 4, 1, 2, 3 };
//没有从头迭代器开始排序, 待排序的序列元素为 1 2 3 
if (is_permutation(arr.begin(), arr.end(), tmp.begin() + 1))
    ...

...
vector<int> arr = { 3, 2, 1 };
vector<int> tmp = { 1, 2, 3, 4 };
//没有从头迭代器开始排序, 待排序的序列元素为 2 3 4
if (is_permutation(arr.begin(), arr.end(), tmp.begin() + 1))
    ...


如有错误,敬请斧正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer笔记——排列算法(next_permutation、prev_permutation、is_permutation) 的相关文章

  • 在 Python 中将 unicode 字符串压缩在一起

    我有字符串 a b 我想创建字符串 即 将绳子分成两半 然后将两半拉链在一起 我尝试过天真的zip a b 但这没有用 我认为这是由于 unicode 的问题造成的 有谁知道我怎样才能得到我想要的结果 在 Python 2 x 中 字符串默
  • 具有任意初始状态的 Steinhaus–Johnson–Trotter 算法

    如果初始数组中的值未排序 则标准 Steinhaus Johnson Trotter 中必须更改哪些内容 例如 我的初始数组是 312 我想生成以下结果 312 321 231 213 123 132 我可以引入一个额外的数组来定义每个数字
  • 部分排列

    我有以下递归函数用于输出部分组合 void comb string sofar string rest int n string substring if n 0 cout lt lt sofar lt lt endl else for s
  • 重复排列:避免溢出

    背景 Given n球使得 a balls are of colour GREEN b balls are of colour BLUE c balls are of colour RED 当然a b c n 这些球可以排列的排列数量由下式
  • SQL Server:无循环的排列/组合

    我有两个数据集 第一个是产品配方表以及构成该配方的产品 第二个数据集包含按产品分类的单独定价 我可以为单个产品设置多个价格 我想要实现的是输出一个结果集 其中包含每个产品配方的独特排列 只有所有组件在第二个数据集中都有定价的配方才应出现在输
  • java中数组的所有可能的组合和子集

    给定一个可变维度的数组 例如 数组 1 2 4 5 我需要一种方法来概括数组的所有可能组合和子集 给定一个包含 n 个元素的数组 我需要拥有所有子集 1 个元素的所有子集 2 个元素的所有子集 n 个元素的所有子集 以及每个子集的所有可能排
  • 如何根据单元的理想邻里程度重新排序? (进行中)

    我需要帮助来实现一种允许生成建筑计划的算法 这是我最近在阅读 Kostas Terzidis 教授的最新出版物时偶然发现的 2014 CONTEXT 考虑一个被划分为网格系统 a 的站点 b 我们还考虑要在场地范围内放置的空间列表 c 和邻
  • 如何从 n 个元素中找到 k 排列的索引?

    我知道 对于一个k 排列p大小的k 从构建n元素 有 P n k n n k 可能的k 排列 例如 k 2 n 4 l 1 2 3 4 P n k 4 4 2 12 1 2 2 1 3 1 4 1 1 3 2 3 3 2 4 2 1 4 2
  • 查找具有重复字母的单词(排列)的排名

    尽管已经发布了很多关于这个问题的文章 但我还是发布了此内容 我不想发布答案 因为它不起作用 这篇文章的答案 查找给定字符串在所有可能的重复排列列表中的排名 https stackoverflow com questions 17620694
  • 如何在 PHP 中查找单词组合

    我有一个数组 new array array c a m t p 现在我想找到单词表中存在的单词组合 我曾尝试实现但没有成功 这是我的 php 代码 words array set powerSet new array 2 mysql ne
  • 排列未排序

    我知道一种算法 可以在网上找到 对排列进行排名 即给定一个排列 将整数索引返回到按字典顺序排序的排列列表中 但我不知道unrank执行相反操作的算法 给定索引 i 返回按字典顺序排列的第 i 个排列 由于我找不到任何内容 有人可以透露一些信
  • 如何在 MATLAB 中随机排列 3D 矩阵中的列

    我有 3D 矩阵 10000 x 60 x 20 我需要排列第二维和第三维以保持列完整 对于 2D 矩阵 我使用 RANDPERM pidx randperm size A 2 Aperm A pidx 我不能只应用 RANDPERM 两次
  • 列出具有重复字母的字符串的唯一排列的算法

    例如 字符串 AAABBB 将具有排列 阿巴巴 巴巴巴 阿巴巴 ETC 生成排列的好算法是什么 它的时间复杂度是多少 这不是完整的答案 只是一个想法 如果您的字符串的固定数量只有两个字母 我将使用二叉树和良好的递归函数 每个节点都是包含名称
  • 仅一个循环的排序和非排序排列

    我想按照给定长度的字典顺序对一个周期的排列进行排名和取消排名 具有一个循环的排列是您可以在此循环中访问每个元素的位置 p 2 3 1 是一个循环的排列 排名1 p 3 1 2 也有 1 个循环 但等级为 2 因为排列在字典顺序上比第一个大
  • 从具有重复元素的向量生成所有独特的组合

    这个问题之前曾被问过 但仅适用于具有非重复元素的向量 我无法找到一个简单的解决方案来从具有重复元素的向量中获取所有组合 为了说明这一点 我在下面列出了一个例子 x lt c red blue green red green red 向量 x
  • 不分配内存的重复排列

    我正在寻找一种算法来生成列表中重复 4 个元素 长度 2 1000 的所有排列 Java实现 http en literateprograms org Permutations with repetition 28Java 29 问题是上面
  • 使用正整数参数优化

    我需要解决一个需要比较具有相同列数的两个矩阵的问题 其中之一被操纵 直到获得最佳匹配 我对两个矩阵之间的差异进行评分的方式非常复杂 我仍然需要最终确定它 目前我真正感兴趣的是找到一种仅适用于正整数的搜索 优化算法 我创建了一个简单的示例 其
  • 如何使用 PHP 以任意顺序进行字符搜索(12 个字母,其中 6 个字母构成一个单词)?

    我整天都在想这个问题 似乎无法找出一种记忆有效且快速的方法 问题是 例如 我有这些信 e f j l n rr t t u w x 12 个字母 我正在找这个词 海龟 6 个字母 如何使用 php 找到完整范围 12 个单词 中所有可能的单
  • Java中的递归排列生成错误结果

    问题是生成字典排列 起初 我的代码是这样的 public class Problem24 public static void main String args permutation 123 public static void perm
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3

随机推荐

  • Debian技能大赛笔记(二)service 、systemctl等命令消失不见解决办法

    二 service systemctl等命令消失不见解决办法 1 使用命令进入root模式 wt 64 Rserver su root Password root 64 Rserver home wt 2 使用vim 使用vi或者nano都
  • debian技能大赛笔记(八)创建DISK RAID5 自动挂载

    一 问题 1 在虚拟机上添加四个1g的硬盘 2 创建raid5 其中一个作为热备盘 设备名为 md0 3 将md0设置为LVM 设备名为md0 4 格式化为ext4 文件系统 5 开机自动挂载到 data目录 添加硬盘 添加完几个硬盘虚拟机
  • Debian大赛笔记(十)修改系统语言

    1 在root用户下输入 dpkg reconfigure locales 选择ZH CN xff08 简体中文 xff09 按空格键选择 xff0c 选择成功后重启系统语言便会修改成功
  • Debian技能大赛笔记(11)欢迎信息内容配置 删除欢迎信息

    技能大赛里都有一个差不多的题就是做一个欢迎信息 大致就像下图 那怎么配置呢 1 进入配置文件 vim etc update motd d 10 uname 在配置文件里加入 uname snrvm printf n printf 2s Ch
  • 上班摸鱼看小说的最佳软件

    这个软件几乎满足了我对上班摸鱼的所有担忧 xff0c 比如上班的时候打开网页看下说 xff0c 那太明显了 xff0c 不说摄像头 xff0c 后台看一下浏览器历史记录就暴露的特别明显 xff0c 这合适吗 xff1f 老板来到你身后远远的
  • iOS-UI-导航控制器-导航栏

    文章目录 导航控制器导航控制器的基本创建方法导航控制器的基本框架如下图所示添加单个按钮 x1f518 添加多个按钮 x1f518 创建按钮数组导航控制器效果 导航控制器的切换VcRoot界面切换事件函数 导航控制器 导航控制器 xff1a
  • 【iOS开发】-UIViewController加载过程和生命周期

    文章目录 前言ViewController执行过程的探讨ViewControllerOne 函数介绍顺序引入ViewControllerSecond引入 ViewControllerOne点击执行到ViewControllerSecond的
  • 【C语言】魔方阵的实现(最全)

    魔方阵的实现 xff08 最全 xff09 一 什么是魔方阵 xff1f 魔方矩阵 xff0c 又称幻方 xff0c 是具有相同的行数和列数 xff0c 并在每行每列 对角线上的和都相等的矩阵 N阶幻方 xff0c 即将自然数1到排成N行N
  • 四种求最大公约数的算法 C / C++

    文章目录 前言一 辗转相除法1 算法简介2 算法描述3 代码及复杂度 二 穷举法 xff08 枚举法 xff09 1 算法简介2 算法描述3 代码及复杂度 三 更相减损法1 算法简介2 算法描述3 代码及复杂度 四 Stein算法 xff0
  • 安装使用supervisor来启动服务

    supervisor 使用方法 supervisor 官网 是一个unix的系统进程管理软件 xff0c 可以用它来管理apache nginx等服务 xff0c 若服务挂了可以让它们自动重启 当然也可以用来实现golang的守护进程 学完
  • 超详细讲解实现拓扑排序、关键路径

    今天 xff0c 小编带着大家来学习图中非常重要的一环 xff0c 拓扑排序和关键路径 xff01 目录 一 绪论 实际应用 二 拓扑排序 xff08 一 xff09 含义 xff08 二 xff09 实现原理 xff08 三 xff09
  • getline函数介绍

    今天 xff0c 小编将为大家讲解有关getline函数的相关知识 目录 一 cin getline char s streamsize n char delim 二 getline istream amp is string amp st
  • C++语法——详解运算符重载

    运算符重载是C 43 43 的一个重要特性 有了运算符重载 xff0c 在代码编写时能更好的实现封装 目录 一 运算符重载介绍 二 运算符重载形式 xff08 一 xff09 参数 xff08 二 xff09 返回值 xff08 三 xff
  • linux—常用gdb调试命令汇总

    目录 一 准备工作 二 调试命令 xff08 一 xff09 查看代码内容 xff08 l xff08 二 xff09 开始调试 xff08 r xff09 xff08 三 xff09 查看当前调试位置 xff08 where xff09
  • Linux——详细模拟实现shell(进程控制综合运用)

    在运行linux时 xff0c 我们总免不了需要输入各种指令让shell进行解析 xff0c 从而与系统进行交互 那么我们有没有可能自己自制一个简易的shell呢 xff1f 答案是当然没问题 目录 一 大体思路 二 具体实现 xff08
  • C++语法——详解虚继承

    目录 一 什么是虚继承 二 虚继承原理 三 虚继承使用注意事项 一 什么是虚继承 所谓虚继承 xff08 virtual xff09 就是子类中只有一份间接父类的数据 该技术用于解决多继承中的父类为非虚基类时出现的数据冗余问题 xff0c
  • Qt——基本介绍、详解对象树

    目录 一 基本介绍 二 对象树 一 基本介绍 创建qt项目是 xff0c 如果选择空窗口QWidget xff0c 那么mian函数中会有如下代码 xff1a include 34 myWindow h 34 include lt QApp
  • 项目:手把手实现高并发内存池

    一 前言 xff08 一 xff09 项目简介 高并发内存池 xff08 ConCurrentMemoryPool xff09 xff0c 其原型是google的开源项目tcmalloc 全称是t hread c ache malloc x
  • Linux——TCP协议与相关套接字编程

    一 TCP协议概念 与UDP协议相同 xff0c TCP协议也是应用在传输层 的协议 虽然都是应用在传输层 xff0c 但是使用方式和应用场景上大不一样 TCP协议具有 xff1a 有连接 xff08 可靠 xff09 面向字节流的特点 x
  • C++ Primer笔记——排列算法(next_permutation、prev_permutation、is_permutation)

    目录 概述 next permutation prev permutation is permutation 概述 页数 xff1a P778 xff08 A 2 7 排列算法 xff09 头文件 xff1a lt algorithm gt