含重复元素序列的全排列
对于n个不同元素集合R的全排列问题,可以用一个简单递归的公式表达:
当n = 1时, P(R) = r, 否则
P(R) = ri + P(R - {ri}) (i = 1, 2, ..., n)
P(R) : 不含重复元素的R集合的全排列
+: 表示连接
根据上面的公式写出递归计算出无重复元素序列的全排列:
Perm(Type list[], int k, int m)
if k=m
then print( list )
else
for i=k to m do
Swap( list[k],list[i] );
Perm(list,k+1,m);
Swap(list[k],list[i]);
1. 对于含有重复元素的序列,我们不能再像上面那样简单的交换与来求解。因为,当ri 到rk 的序列中,如果存在元素 rj = rk 且 j != k 。这时,rj 必然是已经和 ri 交换过位置,并且计算了 rj + P(R{i...n} - {rj}) 。如果再将 rk 与 ri 与交换,则会得到 rk + P(R{i...n} - {rk}) 这个全排列,而rj = rk,所以,我们第二次计算多余了。
2. 再考虑当从ri 到rk 的序列中,如果不存在有元素 rj = rk , 那么,这时的情况是和普通计算时过程一样,交换ri 与rk 然后求解 就可以了,因为即使在后面存在与其他重复元素,我们也会在计算中按第1步剪掉重复计算。
所以,在求解时我们只要保证交换某一元素时,其未有在i...j之间出现过。否则交换后必会重复求解。
下面是求有重复元素的全排列的源码(我参考网上的写的):
int ok(char *origin, int x, int y)
{int i;if(y > x)for(i = x; i < y; i++)if(origin[i] == origin[y])return 0;return 1;
}
void permutation(char *origin, int curLen, int maxLen)
{int i;if(curLen >= maxLen - 1){puts(origin);fprintf(fpout, "%s\n", origin);} else{for(i = curLen; i < maxLen; i++)if(ok(origin, curLen, i)) {swap(&origin[i], &origin[curLen]);permutation(origin, curLen + 1, maxLen);swap(&origin[i], &origin[curLen]);}}
}
含重复元素序列的全排列相关推荐
- “九韶杯”河科院 D.数列重组(含重复元素的全排列+构造方法)
对于含有重复元素序列的全排列,为了再次排列后得到的序列中各不重复,需要用到c++中的do{}while(next_permutation(a,a+n))函数 对于判断每次排序后的序列是否符合条件,用到 ...
- 全排列:不含重复元素和含重复元素的全排列
1.不含重复元素 算法思路: 1.n个元素全排列 = (n-1)个元素的全排列+(另一个元素作为前缀) 2.出口:如果只有一个元素的全排列,则说明已经排完,输出数组: 3.不断将每个元素放在第一个元素 ...
- DFS 如何避免重复母题 Leetcode 077组合(人为规定选取顺序:本题为只能从前往后选,好马不吃回头草)(类似题:Leetcode047全排列(可能含重复元素)-回溯法加剪枝)
类似题 Leetcode047全排列(可能含重复元素)-----------回溯法加剪枝 https://blog.csdn.net/qq_52934831/article/details/11957 ...
- leetcode 78.不含重复元素数组的子集
题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 解题步骤: 方法一:采用广度优先遍历BFS,从空集开始比如: 代码: publ ...
- 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集
package week_01;import java.util.ArrayList; import java.util.List;/* 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的 ...
- 每天一道LeetCode-----获取无重复项/有重复项序列的全排列
原题链接Permutations 要求是输出给定序列的全排列,序列中不包含重复元素 STL中有next_permutation函数可以获取当前序列的下一个排列,使用起来也很简单,先对序列按递增顺序排序 ...
- 包含重复数字序列的全排列Python解法
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 列: 输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]] class S ...
- 全排列—不含重复元素
文章目录 初识全排列 全排列相关的算法 1.交换法 2.抽取法 3.使用next_permutation方法获取全排列 总结 初识全排列 定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排 ...
- python中什么是一个无序的不重复元素序列_无序Python集的“顺序”
您应该观看此视频(尽管它是CPython1特定的并且是关于字典的-但我认为它也适用于集合). 基本上,python对元素进行哈希处理并获取最后N位(其中N由集合的大小确定),然后使用这些位作为数组索引 ...
最新文章
- 开源性能监控工具APM之Skywalking和Pinpoint的实测对比
- Machine Learning课程 by Andrew Ng
- 可重入锁和不可重入锁
- 麒麟810处理器_华为nova5跑分公布,麒麟810到底是什么水平?
- 15.concurrent-control并发控制
- python进阶08并发之四map, apply, map_async, apply_async差异
- python绘制曲线y=2x+5_Python Matplotlib 简易教程
- 树莓派HDMI分辨率的设置
- 聚类分析matlab算例,应用Matlab聚类方法分析大坝监测资料
- 风云格式工厂隐私政策
- 记一次OpenStack排错Exceeded maximum number of re tries. Exhausted all hosts available for retrying build
- 艹,我竟然找到了克服「微信提示音」焦虑症的方法
- Jaspersoft Studio 创建简单报表
- Mongodb Mysql 小测试 (To Be Continued)
- 制作商品详情页面案例
- 车型识别API调用与批量分类车辆图片
- 华视身份证阅读器SDK使用手册
- 关于word2016中mathtype无法使用以及“由于宏安全设置,无法找到宏或宏已被禁用”的解决方案
- PTA 7-44 本题要求编写程序,输入一个三位数,输出其个位数字、十位数字和百位数字。
- k8s之pod和pod探针
热门文章
- 【波士顿动力中国版】拿到 1 亿美金融资后,ROOBO 用“达萌”和“X-DOG”定义宠物机器人...
- IntelliJ IDEA下载安装及配置
- 读书笔记<高速上手C11 14 17>
- 基于SSM框架的交通车辆违章处理违章查询网站的设计与实现
- 爬取百度学术文章及文本挖掘分析
- 关于刚开始接入微信支付分就踩得坑
- (二.Windows7操作系统基本概念 三.字处理软件Word 2010 四.电子表格系统Excel 2010 五. 演示文稿文件PowerPoint 2010)
- 【游戏建模全流程】在Maya中制作失落城市场景
- ROS学习——控制小车转向
- Android翻书翻页(支持硬翻软翻)