全排列算法思路解析

全排列算法思路解析1 全排列的定义和公式 从 n 个数中选取 m m lt n 个数按照一定的顺序进行排成一个列 叫作从 n 个元素中取 m 个元素的一个排列 由排列的定义 显然不同的顺序是一个不同的排列 从 n 个元素中取 m 个元素的所有排列的个数 称为排列数 从 n 个元素取出 n 个元素的一个排列 称为一个全排列 全排列的排列数公式为 n 通过乘法原理可以得到 2 时间复杂度 n 个数 字符 对象 的全排列一共有 n 种 所以全排列算法至

1.全排列的定义和公式:

从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为n!,通过乘法原理可以得到。

2.时间复杂度:

n个数(字符、对象)的全排列一共有n!种,所以全排列算法至少时间O(n!)O(n!)的。如果要对全排列进行输出,那么输出的时间要O(nn!)O(n∗n!),因为每一个排列都有n个数据。所以实际上,全排列算法对大型的数据是无法处理的,而一般情况下也不会要求我们去遍历一个大型数据的全排列。

3.列出全排列的初始思想:

1,5,3,9 1,5,9,3 1,9,3,5 1,9,5,3

这样,我们就得到了1开头的所有排列,这是我们一般的排列数生成的过程。再接着是以3、5、9打头,得到全排列。

T=T=【x1,x1,x2,x3,x4,x5,........xn1,xnx2,x3,x4,x5,……..xn−1,xn】

我们获得了在第一个位置上的所有情况之后(注:是所有的情况),对每一种情况,抽去序列TT中的第一个位置,那么对于剩下的序列可以看成是一个全新的序列

T1=x2,x3,x4,x5,........xn1,xnT1=【x2,x3,x4,x5,……..xn−1,xn】

序列T1T1可以认为是与之前的序列毫无关联了。同样的,我们可以对这个T1T1进行与TT相同的操作,直到TT中只一个元素为止。这样我们就获得了所有的可能性。所以很显然,这是一个递归算法。

第一位的所有情况:无非是将x1x1与后面的所有数x2,x3,.......xnx2,x3,…….xn依次都交换一次

示意图如下:

这里写图片描述


这里写图片描述


4.全排列的非去重递归算法

算法思路:全排列可以看做固定前i位,对第i+1位之后的再进行全排列,比如固定第一位,后面跟着n-1位的全排列。那么解决n-1位元素的全排列就能解决n位元素的全排列了,这样的设计很容易就能用递归实现。

【附代码段:】

#include 
      using namespace std; int arr[5]={ 
    0,1,2,3,4}; void swap(int x,int y)//用于交换数组的两个数 { int temp=arr[x]; arr[x]=arr[y]; arr[y]=temp; } int resove(int n)//递归函数 { if(n==5)//当尝试对不存在的数组元素进行递归时,标明所有数已经排列完成,输出。 { for(int i=0;i<5;i++) cout< 
    
      cout< 
     
       return 
      0; } 
      for( 
      int i=n;i< 
      5;i++) 
      //循环实现交换和之后的全排列  { 
       
      //i是从n开始 i=n;swap(n,i)相当于固定当前位置,在进行下一位的排列。 swap(n,i); resove(n+ 
      1); swap(n,i); } } 
      int main() { resove( 
      0); } 
      
    
  • 排列模板
void permutation1(char* str,int sbegin,int send) //全排列的非去重递归算法  { if( sbegin == send) //当 sbegin = send时输出  { for(int i = 0;i < send; i++) //输出一个排列  cout << str[i]; cout << endl; } else { for(int i = sbegin; i < send; i++) //循环实现交换和sbegin + 1之后的全排列  { swap(str[i],str[sbegin]); //把第i个和第sbegin进行交换  permutation1(str,sbegin + 1,send); swap(str[i],str[sbegin]); //【注1】交换回来  } } } 
  • 【注1】swap(str[i],str[sbegin])//交换回来 我们来仔细推敲一下循环体里的代码,当我们对序列进行交换之后,就将交换后的序列除去第一个元素放入到下一次递归中去了,递归完成了再进行下一次循环。这是某一次循环程序所做的工作,这里有一个问题,那就是在进入到下一次循环时,序列是被改变了。可是,如果我们要假定第一位的所有可能性的话,那么,就必须是在建立在这些序列的初始状态一致的情况下,所以每次交换后,要还原,确保初始状态一致。 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213124.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:30
下一篇 2026年3月18日 下午6:30


相关推荐

  • 升级公告:由社区推动的cBridge 2.0功能迭代升级即将到来

    升级公告:由社区推动的cBridge 2.0功能迭代升级即将到来我们将在北京时间2021年12月3日上午10点推出cBridge2.0的一次功能迭代升级,以满足我们用户和开发者社区提出的一些关键功能需求。此次升级旨在让cBridge2.0更好地为通用的多链dApps和原生资产跨链桥接提供支持。升级期间,cBridge跨链转账服务会暂停约3小时。作为此次升级的一部分,所有LP需要迁移已提供的全部流动性。我们将为LP提供足够的gastoken以支付cBridge2.0目前已支持的链上的全部迁移成本,大家不必担心手续费的问题。迁移可以在升级前…

    2022年5月4日
    61
  • QPM 之简介

    QPM 之简介QPM QualityPerfo 是一个质量性能监控组件 可以很方便的查看当前 App 的性能和常用数据 目前主要运行在 Android 平台上 通过集成 QPM 组件 可以在 App 中通过悬浮窗可视化相关实时数据 意在帮助广大开发者和测试同学快速了解 App 中存在的性能问题 并展示了很多常用的数据 减少重重复杂的操作 经过了好几个月的方案调研 不断的优化

    2026年3月26日
    2
  • efishell无法开机shell_开机出现efi shell卡住不动了解决方法全集「建议收藏」

    efishell无法开机shell_开机出现efi shell卡住不动了解决方法全集「建议收藏」[文章导读]最近有很多网友问我,为什么我的电脑开机后出现efishell提示进不了系统,开机出现efishell提示时,一般是由于第一启动项设置的是efishell启动的,有的网友告诉我,我第一启动项明明设置的是硬盘启动,当然还有一种情况就是前面的启动项都无法加载,然后按启动顺序启动,然后就启动到efishell了,出现这种情况一般就是系统引导破坏或是找不到引导项了。那么怎么找到原并解决…

    2022年7月24日
    10
  • rest接口测试工具_常用的自动化测试框架

    rest接口测试工具_常用的自动化测试框架REST API 自动化测试 利器Rest Assured(API接口自动化测试框架体系)

    2022年4月20日
    58
  • pycharm汉化版安装[通俗易懂]

    pycharm汉化版安装[通俗易懂]pycharm汉化版安装想要学好一门语言一款好用的编辑软件非常的重要,最近公司要做一款智能机器人的客服聊天系统,用到python刚开始使用eclipse编辑,发现效果不太理想,毕竟不是专业化软件。好了废话少说开启pycharm的安装之旅吧!一、首先呢当然是下载,不过呢我已经准备好了!赶快通过百度云下载吧,链接:百度云链接密码:32g6二、下载完成解压到自己想保存

    2022年5月25日
    51
  • 最经典的黑客技术入门知识

    最经典的黑客技术入门知识最经典的黑客技术入门知识 整理:Ackarlix 第一节、什么是黑客以我的理解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客所从事的事情违背了《黑客守则》,所以他们真正的名字叫“骇客”(Cracker

    2022年6月9日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号