C++:排列组合算法

转载请注明出处

1 介绍

排列(Permutation)和组合(Combination)是两个基础的数学概念。

计算排列与组合可以解决一些实际的工程问题,掌握排列组合计算的方法是十分重要的。

目前,网上已经有一些计算排列组合的算法,比如[1]。

这里我也给出一个组合计算方法。该计算方法采用了分治的思想,代码实现采用了递归的方式。


2 组合算法

2.1 设计思路

组合问题:在序列An={1,2,3,4,5,6,...,n}中选择m个数一共有C(n,m)种组合,求解所有的组合。

例如,C(3,2)=3. 所有的组合分别是{1,2},{1,3},{2,3}。

思路:

我的算法采用了分治的思想:将一个大的问题拆分成很多个子问题,先解决子问题,所有子问题的解共同组成了大问题的解。

接下来我以求组合C(5,3)为例进行说明:

假设C(5,3)的所有组合形成的集合是E。我们可以将组合结果E分成两类:A类是含有5的组合,B类是不含5的组合;

同理,我们可以将B类分成B1和B2两类:B1类是含有4的组合(且不含5的组合),B2类是不含4的组合(且不含5的组合);

同理,我们可以将B2类分成B21和B22两类:B21类是含有3的组合(且不含5、4的组合),B22类是不含3的组合(且不含5、4的组合)。注意,此时B22类是不成立的(应为不含3、4、5,只剩下1、2两个元素。而例子要求解C(5,3)至少需要3个元素)。

以上分类方法可以保证E=B21 U B1 U A

其中,

对于A类组合,我们只需要求解子问题C(4,2),之后再在子问题的结果中加入5即可得到A类组合;

对于B1类组合,我们只需要求解子问题C(3,2),之后再在子问题的结果中加入4即可得到B1类组合;

对于B21类组合,我们只需要求解子问题C(2,2),之后再在子问题的结果中加入3即可得到B21类组合;

A类组合、B1类组合、B21组合组成了C(5,3)的所有组合。

可以发现,问题C(5,3)已经降维成三个子问题:C(4,2),C(3,2) 和C(2,2)。利用递归的方法即可实现最终结果的求解。


2.2 算法复杂度

2.2.1 时间复杂度

所有的组合算法的时间复杂度都至少是C(n,m)=n!/[m!*(n-m!)]。本算法的时间复杂度也是阶乘量级的。

2.2.2 空间复杂度

由于采用了递归的实现方式,本算法的空间复杂度很高,很有可能造成内存溢出。建议采用非递归的方法实现组合计算。


2.3 源代码

下面是源代码:

/*****************************************************************************************************************************时间复杂度:空间复杂度:功能:求排列组合Cij输入参数:int i                :        总数int j                :          组合数vector<int>r:        用于存储临时结果的向量,大小必须等于num int num                :        组合数vector<vector<int> > & result        :        用于存储最终所有结果的二维向量 返回参数:void注意: 首先建立两个向量作为函数的输入参数                vector<int> r(num);                                //num为组合数 vector<vector<int> > result;        //存储最终结果 使用样例:vector<int> resulttemp(3);vector<vector<int> > result;Cij(6,3,resulttemp,3,result); 
*****************************************************************************************************************************/void Cij(int i, int j,vector<int> &r,int num,vector<vector<int> > & result)
{//排列组合公式Cij//cout << n << ' ' << i << ' ' << j << endl;if (j == 1){for (int k = 0; k < i; k++){vector<int> temp(num);r[num - 1] = k;for (int i = 0; i < num;i++){temp[i]=r[i];//cout << r[i] << ' ';}result.push_back(temp);//cout << endl;}}else if (j == 0){//do nothing!}else{for (int k = i; k >= j; k--){r[j-2] = k-1;Cij(k - 1, j - 1,r,num,result);}}
}

2.4 测试结果

下面是测试结果:


3 排列算法

排列算法可以采用STL中的next_permutation函数。


4 参考

[1]  http://www.cnblogs.com/shuaiwhu/archive/2012/04/27/2473788.html  

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

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

相关文章

排列组合公式及排列组合算法

排列组合公式 排列组合公式/排列组合计算公式 公式P是指排列&#xff0c;从N个元素取M个进行排列。 公式C是指组合&#xff0c;从N个元素取M个进行组合&#xff0c;不进行排列。 N-元素的总个数 M参与选择的元素个数 &#xff01;-阶乘&#xff0c;如 9&#xff01;&#xf…

排列组合公式/排列组合计算公式

排列组合公式/排列组合计算公式 公式P是指排列&#xff0c;从N个元素取M个进行排列。 公式C是指组合&#xff0c;从N个元素取M个进行组合&#xff0c;不进行排列。 N-元素的总个数 M参与选择的元素个数 &#xff01;-阶乘&#xff0c;如9&#xff01;&#xff1d;9*8*7*6*5…

详细总结组合排列的十余种算法实现

目录 •写在前面 •问题引入 •暴力枚举 循环枚举 递归枚举 回溯枚举 •深度优先搜索 前序遍历 中序遍历 后序遍历 •字典序 •二进制位运算 •带重复数字 •总结 •写在前面 排列组合的问题&#xff0c;如果没有合适的算法去解决&#xff0c;时间复杂度会相当的…

论坛的头像

做了个论坛的头像,相当的简单 也就只能看看啦 菜啊

论坛头像编辑 html,spu头像编辑.html

&#xfeff;SPU头像编辑 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.ht…

牛客网项目---1.7.账号设置(上传头像、修改密码)

7、账号设置/setting 上传头像将头像保存到本地/七牛云服务器&#xff0c;随机生成字符串作为图片的名称&#xff0c;表单提交再返回该界面。获取头像时&#xff0c;在本地获取&#xff0c;通过输入输出流&#xff0c;先读到缓冲区&#xff0c;再从缓冲区写出&#xff1b;在七…

Discuz论坛无法上传头像/ 企业邮箱被归为垃圾邮件的问题

背景&#xff1a; 安装了Discuz论坛程序&#xff0c;更改个人头像的时候&#xff0c;点击上传按钮没有反应基于阿里云企业邮箱配置了论坛的邮件发送服务&#xff0c;但是邮箱被列入垃圾邮件拒收 解决方法&#xff1a; 上传头像失败&#xff1a;ucenter和全局域名要加https&a…

flask更改用户头像

目录结构图: 配置app 导包及配置 import os from flask import Flask, flash, request, redirect, url_for,Request,render_template from werkzeug.utils import secure_filenameUPLOAD_FOLDER 文件下载的绝对路径 # 允许的下载类型 ALLOWED_EXTENSIONS {txt, pdf, png, j…

discuz论坛用户--设置--修改头像不显示的解决方法

本文参考&#xff1a;https://www.2cto.com/kf/201601/478810.html 和https://jingyan.baidu.com/article/ceb9fb10ab73b68cad2ba092.html 先登陆discuz管理员后台admin.php&#xff0c;找到“站长”>>“UCenter设置”&#xff0c;其它的默认的地方就不要动了。关键要改…

关于Discuz 出现上传头像失败的问题

今天测试了论坛上传头像时出现 网上大部分的解决方案是配置UCenter Access denied for agent changed 头像无法更新 配置文件&#xff1a; config下config_global.php&#xff0c;config_ucenter.php uc_server\data下的config.inc.php 具体可参考此处&#xff1a;Discuz配…

内部论坛系统

开发环境/技术&#xff1a; Linux&#xff0c;MyEclipse&#xff0c;JDK1.7&#xff0c;MySql&#xff0c;JS&#xff0c;jQuery&#xff0c; ajax&#xff0c;Tomcat&#xff0c;CSS样式&#xff0c;Struts框架等 项目描述/功能&#xff1a; 项目主要实现了用户登陆注册&#…

Vue 彩色头像|一个有趣的头像生成器 附源码

前言 这是一款矢量风格的头像生成器&#xff0c;您可以搭配不同的素材组件&#xff0c;生成属于您自己的个性化头像。 介绍 您可能感兴趣的功能&#xff1a; 可视化组件配置栏随机生成头像重做/撤消国际化批量生成多个头像 在线体验 Vue 彩色头像https://www.shserve.cn/…

PHP 头像上传到mysql数据库

准备环境 window2008 phpStudy Mysql数据库 mysql数据库 第一步&#xff1a;用户登录成功 该用户已经存在数据库 进入个人中心&#xff0c;查找到数据库中的个人信息 进行图片上次 <?php include "../mysqlcon/dblink.php"; //导入数据库 ?><html> …

用php做论坛头像代码,详细介绍PHP针对多用户实现头像更换代码示例

一个网站&#xff0c;其实说白了就是某几个特定功能的组合&#xff0c;而更换用户头像就在这些功能之中。今天就来做个测试&#xff0c;针对不同的用户&#xff0c;实现头像上传功能。 成品图 思路针对不同的用户上传头像&#xff0c;我们要为每一个已登录的用户创建一个文件夹…

教你用go freetype根据用户昵称生成头像

最近需要为用户服务添加一些新功能&#xff0c;其中就包括在注册时根据用户昵称生成头像这一点。 由于用户服务是用golang写的&#xff0c;google来google去都只找到freetype一个比较简单好用的库&#xff0c;其他比如ImageMagicK之类api都过于低层不适合我们这样相对简单的图…

java ajax 更改头像_ajax+node实现头像更改

好久没有更新博客了&#xff0c;这几天在写文件上传的时候遇到了一个新的问题&#xff0c;就是关于ajax实现文件上传的问题 这几天在做一个小的demo&#xff0c;类似于论坛的一个东西&#xff0c;基于jqueryexpressmongo的一个小的案例&#xff0c;在做到关于设置个人头像的时候…

DISCUZ论坛插件h5手机电脑头像上传3.7.1带扩展插件【收集免费分享】

一个支持电脑和手机h5技术头像上传的插件。 说明&#xff1a;本插件h5电脑版和h5手机版为自主全新开发的触屏版头像上传&#xff0c;体验好&#xff0c;性能好&#xff0c;绿色。 主要特点&#xff1a;支持H5电脑版和H5手机版头像上传。 支持鼠标和触屏操作&#xff0c;支持图…

discuz 头像html5上传,discuz更新H5头像上传

越来越多的浏览器可以慢慢的不在支持flash,对应一些discuz论坛的老的版本来说就需要进行升级操作了,接下来吾爱编程为大家介绍一下discuz头像上传flash改为h5上传的方法,有需要的小伙伴可以参考一下: 1、准备工作: 根据自己的网站编码格式下载对应的最新的版本代码,然后解…

DISCUZ 如何为主题帖列表页添加头像,显示发帖者头像

只显示名字的代码 <em style" font-size:14px;"><!--{if $thread[authorid] && $thread[author]}--><a href"home.php?modspace&uid$thread[authorid]" c"1"{if $groupcolor[$thread[authorid]]} style"color…

Roop:单图离线版软件包及使用方法!

你们要的“单图换脸”离线一键运行版来了。Roop发布几十个小时后&#xff0c;马不停蹄地搞了Colab在线版。其实这东西都挺好的&#xff0c;又快又方便&#xff0c;几乎没有任何硬件要求&#xff0c;点一点就可以搞定了。但是它有一个问题&#xff0c;就是没有“魔法” 就没法使…