有重复元素的列问题.pptVIP

  • 3
  • 0
  • 约1.37千字
  • 约 7页
  • 2018-10-17 发布于江苏
  • 举报
有重复元素的列问题

有重复元素的排列问题 有重复元素的排列问题 ?问题描述: 设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)

1亿VIP精品文档

相关文档