对于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]);}}
}

含重复元素序列的全排列相关推荐

  1. “九韶杯”河科院 D.数列重组(含重复元素的全排列+构造方法)

    对于含有重复元素序列的全排列,为了再次排列后得到的序列中各不重复,需要用到c++中的do{}while(next_permutation(a,a+n))函数 对于判断每次排序后的序列是否符合条件,用到 ...

  2. 全排列:不含重复元素和含重复元素的全排列

    1.不含重复元素 算法思路: 1.n个元素全排列 = (n-1)个元素的全排列+(另一个元素作为前缀) 2.出口:如果只有一个元素的全排列,则说明已经排完,输出数组: 3.不断将每个元素放在第一个元素 ...

  3. DFS 如何避免重复母题 Leetcode 077组合(人为规定选取顺序:本题为只能从前往后选,好马不吃回头草)(类似题:Leetcode047全排列(可能含重复元素)-回溯法加剪枝)

    类似题 Leetcode047全排列(可能含重复元素)-----------回溯法加剪枝 https://blog.csdn.net/qq_52934831/article/details/11957 ...

  4. leetcode 78.不含重复元素数组的子集

    题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 解题步骤: 方法一:采用广度优先遍历BFS,从空集开始比如: 代码: publ ...

  5. 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集

    package week_01;import java.util.ArrayList; import java.util.List;/* 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的 ...

  6. 每天一道LeetCode-----获取无重复项/有重复项序列的全排列

    原题链接Permutations 要求是输出给定序列的全排列,序列中不包含重复元素 STL中有next_permutation函数可以获取当前序列的下一个排列,使用起来也很简单,先对序列按递增顺序排序 ...

  7. 包含重复数字序列的全排列Python解法

    给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 列: 输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]] class S ...

  8. 全排列—不含重复元素

    文章目录 初识全排列 全排列相关的算法 1.交换法 2.抽取法 3.使用next_permutation方法获取全排列 总结 初识全排列 定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排 ...

  9. python中什么是一个无序的不重复元素序列_无序Python集的“顺序”

    您应该观看此视频(尽管它是CPython1特定的并且是关于字典的-但我认为它也适用于集合). 基本上,python对元素进行哈希处理并获取最后N位(其中N由集合的大小确定),然后使用这些位作为数组索引 ...

最新文章

  1. 开源性能监控工具APM之Skywalking和Pinpoint的实测对比
  2. Machine Learning课程 by Andrew Ng
  3. 可重入锁和不可重入锁
  4. 麒麟810处理器_华为nova5跑分公布,麒麟810到底是什么水平?
  5. 15.concurrent-control并发控制
  6. python进阶08并发之四map, apply, map_async, apply_async差异
  7. python绘制曲线y=2x+5_Python Matplotlib 简易教程
  8. 树莓派HDMI分辨率的设置
  9. 聚类分析matlab算例,应用Matlab聚类方法分析大坝监测资料
  10. 风云格式工厂隐私政策
  11. 记一次OpenStack排错Exceeded maximum number of re tries. Exhausted all hosts available for retrying build
  12. 艹,我竟然找到了克服「微信提示音」焦虑症的方法
  13. Jaspersoft Studio 创建简单报表
  14. Mongodb Mysql 小测试 (To Be Continued)
  15. 制作商品详情页面案例
  16. 车型识别API调用与批量分类车辆图片
  17. 华视身份证阅读器SDK使用手册
  18. 关于word2016中mathtype无法使用以及“由于宏安全设置,无法找到宏或宏已被禁用”的解决方案
  19. PTA 7-44 本题要求编写程序,输入一个三位数,输出其个位数字、十位数字和百位数字。
  20. k8s之pod和pod探针

热门文章

  1. 【波士顿动力中国版】拿到 1 亿美金融资后,ROOBO 用“达萌”和“X-DOG”定义宠物机器人...
  2. IntelliJ IDEA下载安装及配置
  3. 读书笔记<高速上手C11 14 17>
  4. 基于SSM框架的交通车辆违章处理违章查询网站的设计与实现
  5. 爬取百度学术文章及文本挖掘分析
  6. 关于刚开始接入微信支付分就踩得坑
  7. (二.Windows7操作系统基本概念 三.字处理软件Word 2010 四.电子表格系统Excel 2010 五. 演示文稿文件PowerPoint 2010)
  8. 【游戏建模全流程】在Maya中制作失落城市场景
  9. ROS学习——控制小车转向
  10. Android翻书翻页(支持硬翻软翻)