算法设计与分析——递归与分治策略——全排列Perm函数

news2025/7/18 17:40:24

删除线格式 @[toc]

问题描述

  • 现给出m个不同的数字,在n个位置上,对齐进行全排列。
  • 使用编程实现数学中全排列在这里插入图片描述
  • 输出最终计算结果并将所有的排列打印出来。

思路分析

  • 常规的递归方式进行解决即可,递归的终点是根据题目要求进行实现。
  • 共有两个参数,m和n。m是需要排列的位子,n是需要排列元素个数,递归的终点是n次。
  • 注意 这里是全排列,始终是全排列,和部分排列是有区别的。

实现代码

#include <iostream>
#include <numeric>
#include <vector>

using namespace std;

void fullPermutation(int n,vector<int> &vecSour,vector<int> &vecTar){

    if(n == 0){

        for (auto iter = vecTar.cbegin(); iter != vecTar.cend(); iter++) {
            cout<<(*iter)<<","<<endl;
        }

    }else{
        for (int i =0;i < vecSour.size();i ++) {

            vecTar.push_back(vecSour.at(i));
            vecSour.erase(vecSour.begin()+i);
            fullPermutation(n-1,vecSour,vecTar);
            vecTar.insert(vecSour.begin()+i,(*vecTar.end()));
            vecTar.pop_back();
        }
    }
}

int main() {

    cout << "please input the m and n to full permutation" << std::endl;
    int m,n;
    cin>>m>>n;
    vector<int> iVecSour(m);
    vector<int> iVecTar(n);
    iota(iVecSour.begin(),iVecSour.end(),1);
    fullPermutation(n,iVecSour,iVecTar);
    return 0;
}

在这里插入图片描述

  • 将近一年都没有怎么写过算法题,惭愧,弄了半天,弄出来个啥,真的惭愧,好好复习一下,忘得差不多了。真的。

书上代码

inline void Swap(int &a,int &b){
    int temp = a;
    a = b;
    b = temp;
}

void  Perm(vector<int> vecSour,int k,int m){
    /*
     * vecSour是保存了原来的数组
     * k是表示当前的已经排到了什么位置
     * m是需要排几个位置,最后也仅仅输出最终数组的前几个元素
     */

    if (k == m){
        for(int i = 0;i < m;i ++){
            cout<<vecSour.at(i)<<"  ";
        }
        cout<<endl;
    }else{
        for(int i =k; i <= m;i ++){
            Swap(*(vecSour.begin()+k),*(vecSour.begin()+i));
            Perm(vecSour,k+1,m);
            Swap(*(vecSour.begin()+i),*(vecSour.begin()+k));
        }
    }

}

思路分析

  • 注意,这里是全排列,这个代码也仅仅适用于全排列,像那种4选2,就不适合,书里面对于问题的拆解也是正确的。
  • Perm®是由r1Perm(R1) , r2Perm(R2) ,r3Perm(R3) 。。。。rnPerm(Rn)构成,比如说Perm(4)就是由 4 * Perm(3),依次进行递归就是4 * 3 * Perm(2),最后就是4 * 3 * 2 * Perm(1).确实是将问题不断进行拆解递归的很完整。

从书中代码获得的部分排列的代码

思路描述

  • 和书里面的代码相似,书里面就是用了一个list,通过改变位置来实现对于所有元素的排列,所以使用一个list,只需要添加一个游标来控制有序的位置和无序的位置即可

实现代码


inline void Swap(int &a,int &b){
    int temp = a;
    a = b;
    b = temp;
}

void  Perm(vector<int> vecSour,int n,int m,int k = 0){
    /*
     * vecSour是保存了原来的数组
     * k是区分是否有序和无序的游标
     * m是需要排列的位置
     */

    if (k == n){
        for(int i = 0;i < n;i ++){
            cout<<vecSour.at(i)<<" ";
        }
        cout<<endl;
    }else{
        for(int i =k; i < m;i ++){
            Swap(*(vecSour.begin() + k),*(vecSour.begin()+i));
            Perm(vecSour,n,m,k + 1);
            Swap(*(vecSour.begin()+i),*(vecSour.begin()+k));
        }
    }

}

知识补充和回顾

  • inline内联函数的作用:在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
    • 学习连接

分析与总结

在这里插入图片描述

  • 我改了书上的方法,将之应用于部分排列,然后通过交换,仅仅使用一个数组进行排列的效率会更好,时间复杂度都会更低,因为使用一个数组是每一步都是常数的,确定的步骤不变的。但是使用两个数组,有很多操作是线性的,数据越多,耗费的时间越多
    • 使用两个数组的,完全模拟实际情况的时间复杂度是O(n)
    • 使用一个数组的,通过游标区分有序和无序的时间复杂度是O(1)
  • 很久没写代码了,弄了半天就弄出来这个东西,真的惭愧。第一天五十五分钟,弄出来的都是问题,还是要多实践。剩下的部分,明天再写吧。
  • 花了好几天才写完这些,后续继续加油!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一次运行vue遇到的问题

1.vue无法识别https://blog.csdn.net/weixin_61634408/article/details/1265897982.yarn serve问题https://blog.csdn.net/fangxuan1509/article/details/104711690/3.关闭控制台报错检查&#xff08;每次vue-rounter必须用&#xff09;vue.config,js,的module.exports 中添加l…

【Linux】sudo指令

在本期博客正式开始之前&#xff0c;我们先来解决一个历史遗留问题&#xff1a;sodu指令怎么用不了&#xff1f;sudo指令&#x1f4cc;sudo是linux下常用的允许普通用户使用超级用户权限的工具&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令&#x1f4cb;但是…

【预告】ORACLE Unifier v22.12 虚拟机发布

引言 离ORACLE Primavera Unifier 最新系统 v22.12已过去了3个多月&#xff0c;应盆友需要&#xff0c;也为方便大家体验&#xff0c;我近日将构建最新的Unifier的虚拟环境&#xff0c;届时将分享给大家&#xff0c;最终可通过VMWare vsphere (esxi) / workstation 或Oracle …

【Spring6】| Bean的四种获取方式(实例化)

目录 一&#xff1a;Bean的实例化方式 1. 通过构造方法实例化 2. 通过简单工厂模式实例化 3. 通过factory-bean实例化 4. 通过FactoryBean接口实例化 5. BeanFactory和FactoryBean的区别&#xff08;面试题&#xff09; 6. 使用FactoryBean注入自定义Date 一&#xff1a…

Radiant:AR/VR显示系统测试比2D屏难在哪?

我们知道&#xff0c;光学一直是AR/VR的核心技术&#xff0c;为了实现理想的光学显示效果&#xff0c;AR/VR厂商和科研人员不断在解决各种各样的问题。除了光学方案外&#xff0c;光学器件的质量对于AR/VR显示效果也很重要。在DSCC举办的一场AR/VR显示论坛上&#xff0c;光学检…

HashMap底层的实现原理(JDK8)

目录一、知识点回顾二、HashMap 的 put() 和 get() 的实现2.1 map.put(k, v) 实现原理2.2 map.get(k) 实现原理三、HashMap 的常见面试题3.1 为何随机增删、查询效率都很高&#xff1f;3.2 为什么放在 HashMap 集合 key 部分的元素需要重写 equals 方法?3.3 HashMap 的 key 为…

HTML DOM 元素

创建新的 HTML 元素在文档对象模型 (DOM) 中&#xff0c;每个节点都是一个对象。DOM 节点有三个重要的属性&#xff0c;分别是&#xff1a;nodeName : 节点的名称nodeValue &#xff1a;节点的值nodeType &#xff1a;节点的类型创建新的 HTML 元素如需向 HTML DOM 添加新元素&…

一款OutLook信息收集工具

OutLook 这是一款burp插件&#xff0c;用于Outlook用户信息收集&#xff0c;在已登录Outlook账号后&#xff0c;可以使用该 插件自动爬取所有联系人的信息 安装 在burp扩展面板加载jar即可 功能介绍 All Users 加载插件后&#xff0c;进入Outlook联系人面板&#xff0c;…

unity开发知识点小结03

物理关节 铰链关节 按照固定的轴进行旋转 弹簧关节 两物体之间加装弹簧 固定关节 两个物体相关联 射线检测 通过射线检测&#xff0c;我们可以实现用鼠标来移动物体&#xff0c;当我们用鼠标点击场景中的某一位置&#xff0c;摄像机就发出一条射线&#xff0c;并且通过…

zookeeper从安装到入门

文章目录什么是zookeeperzookeeper的安装启动zookeeper并检查是否安装完成zookeeper的一些操作指令zookeeper的JavaAPI建立连接创建节点查询节点修改节点删除节点事件监听分布式锁集群leader选举规则集群角色什么是zookeeper ZooKeeper是一个分布式的&#xff0c;开放源码的分…

Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell

文章目录前言一、环境搭建二、漏洞复现准备三、漏洞复现四、不成功的原因&#xff08;排查&#xff09;&#xff1a;总结前言 网上文章千篇一律&#xff0c;导致很多人都只会一种方法&#xff0c;只要有一种办法就所有人跟着这个办法去做了&#xff0c;新建java文件&#xff0…

Azure Function App Deploy Issue

问题&#xff1a;之前一直用vs code 的 Azure Function extension 工具部署&#xff0c;没有什么问题。直到3月份发现 vs code显示部署成功&#xff0c;但是通过 https://<function_name>.scm.azurewebsites.net/DebugConsole 查看上传后的 dll 文件&#xff0c;dll文件根…

每日学术速递3.8

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Unleashing Text-to-Image Diffusion Models for Visual Perception 标题&#xff1a;释放用于视觉感知的文本到图像扩散模型 作者&#xff1a;Wenliang Zhao, Yongming Rao, Zuya…

【maven 学习记录】

maven 学习记录一、maven基础1. maven是什么2. maven的作用3. maven的下载安装4. maven仓库5. maven坐标6. 第一个maven项目 手工实现7. maven插件8. 依赖管理9. 生命周期二、maven进阶一、maven基础 1. maven是什么 maven的本质是一个项目管理工具&#xff0c;将项目开发和管…

mac电脑解决Error: command failed: npm install --loglevel error --legacy-peer-deps

使用vue create xxx创建vue3项目的时候报错。 解决步骤&#xff1a; 1.sudo npm cache clean --force 2.再次创建就可以成功 补充&#xff1a;网上搜到很多方法&#xff0c;都尝试失败&#xff0c;因为遇到需要打开.vuerc,.npmrc的情况&#xff0c;记录一下怎样找到文件 1. 尝…

xshell的复制ssh渠道和复制会话是什么意思

xshell的复制ssh渠道和复制会话是什么意思1、复制ssh渠道1.1、只打开一个标签页时1.2、复制ssh渠道后1.3、复制第2个ssh渠道后2、复制会话3、两个ssh进程分别复制ssh渠道4、总结1、复制ssh渠道 1.1、只打开一个标签页时 ssh进程有1个&#xff0c;pid是98959。用户是root、终端…

工业级64 位AM6231ASGGGAALW/AM6232ATCGGAALW【处理器】AM6234ATCGGAALW

工业级64 位AM6231ASGGGAALW/AM6232ATCGGAALW【处理器】AM6234ATCGGAALW说明&#xff1a;低成本的AM62x Sitara MPU系列应用处理器专为Linux 应用开发而设计。凭借可扩展的ArmCortex -A53性能和嵌入式功能&#xff0c;例如:双显示支持和3D图形加速&#xff0c;以及广泛的外围设…

Flutter-自定义图标

虽然Flutter有许多内置的icon图标&#xff0c;但是有些特殊功能的话&#xff0c;需要自定义图标或者需要在iconfont 阿里巴巴的图标库里找对应合适的图标。 第一步&#xff1a;在iconfont 阿里巴巴里搜索想要的图标并加入到购物车&#xff0c;点击下载代码后&#xff0c;会生成…

2023增加收入的最佳销售聊天机器人

哈佛大学的研究表明&#xff0c;快乐的客户花费更多。聊天机器人可以很大程度提高客人体验感&#xff0c;可以增加您的销售额。现在&#xff0c;快来get市场上最好的销售聊天机器人并增加您的收入&#xff01; 一、什么是销售聊天机器人&#xff1f; 销售聊天机器人是一种自动…

使用 Wall 教你搭建 照片墙 和 视频墙

下载 Github:https://github.com/super-tongyao/wall 国内仓库&#xff08;不推荐&#xff0c;只做加速访问&#xff0c;无编译包和发行版&#xff0c;以github仓库为准&#xff09;&#xff1a;https://gitee.com/Super_TongYao/wall 推荐github仓库&#xff0c;下载最新版…