- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
有重复元素及排列问题
有重复元素的排列问题 有重复元素的排列问题 ?问题描述: 设R={r1,r2,…,rn}是要进行排列的n个元素,其中r1,r2,…,rn可能相同。试设计一个算法,列出R的所有不同排列。 ?编程任务: 给定以及待排列的个元素。计算出这个元素的所有不同排列。 有重复元素的排列问题 ?R全排列归纳定义: 当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素; 当n1是,Perm(R)由(r1)Perm(R1),(r2)Perm(R2) ,…,(rn)Perm(Rn)有构成。其中Ri=R-{ri},(ri) Perm(Ri) 表示在全排列Ri的每一个排列前加上前缀ri得到的排列。 ?R全排列递归算法: 定义过程:void perm(char a[],int k,int m)。在过程中将a[k:m]中的每个元素分别与a[k]中的元素交换,然后递归调用a[k+1:m]的全排列,并将计算结果做a[0:k]为的后缀。 ?重复元素的解决方法: 由于a[k:m]中各元素可能相同,因此在与a[k]中的元素交换之前要先判断该元素是否已经使用过。本算法采用链表来存储各位元素的使用情况。 有重复元素的排列问题 有重复元素的排列问题 ?算例: 输入:5 aabcc k=0,i=0 链表used=∧ a[i]=a,不在表used中,将该元素添加到used中,并调用调用a[k+1:m]的全排列 k=0,i=1 链表used=a∧ a[i]=a, 在表used中找到,说明以a[i]为前缀的排列已经输出。 有重复元素的排列问题 k=0,i=2 链表used=a∧ a[i]=b,不在表used中,将该元素添加到used中,并调用调用a[k+1:m]的全排列 k=0,i=3 链表used=ab∧ a[i]=c, 不在表used中,将该元素添加到used中,并调用调用a[k+1:m]的全排列 k=0,i=4 链表used=abc∧ a[i]=c, 在表used中找到,说明以a[i]为前缀的排列已经输出。 算法实现 #include list void perm(char a[],int k,int m) { if (k==m){ //排列完成,输出排列 } else{ listchar used; for (int i=k;i=m;i++){ bool found=false; listchar::iterator pos=find(used.begin(),used.end(),a[i]); if (pos!=used.end()) found=true; if (!found){ used.push_back(a[i]); swap(a[k],a[i]); perm(a,k+1,m); swap(a[k],a[i]);} } }
文档评论(0)