- 浏览: 53939 次
- 性别:
- 来自: 北京
文章分类
最新评论
有重复数的全排列和全排列的算法是一样的
只不过要去掉重复的序列
122的全排列
122
212
221
一共三种
三个数的全排列是6种,其中有3种重复了。
其实关键问题就是怎么从全排列中去掉重复的
理解全排序的过程,从begin到i-1的数据都与begin交换过,
如果第i的数据与前面begin到i-1中的数据有重复,那么不用交换了
设 a[i]=x 存在 a[j]=x , begin<=j<=i-1
根据 全排列的递归公式知道 Perm(Ri)=Perm(Rj)
所以 Perm(Ri)为重复的需要去掉
只不过要去掉重复的序列
122的全排列
122
212
221
一共三种
三个数的全排列是6种,其中有3种重复了。
其实关键问题就是怎么从全排列中去掉重复的
理解全排序的过程,从begin到i-1的数据都与begin交换过,
如果第i的数据与前面begin到i-1中的数据有重复,那么不用交换了
设 a[i]=x 存在 a[j]=x , begin<=j<=i-1
根据 全排列的递归公式知道 Perm(Ri)=Perm(Rj)
所以 Perm(Ri)为重复的需要去掉
package com.viking.divide; public class DuplicatePerm { public static void main(String[] args) { int[] a = { 1, 2, 2,3,3}; System.out.println(perm(a, 0)); } public static int perm(int[] a, int begin) { if (begin == a.length) { for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } System.out.println(); return 1; } int count = 0; for (int i = begin; i < a.length; i++) { if(isSwap(a,begin,i)){ swap(a, begin, i); count += perm(a, begin + 1); swap(a, begin, i); } } return count; } public static void swap(int[] a, int begin, int end) { int temp = a[begin]; a[begin] = a[end]; a[end] = temp; } public static boolean isSwap(int[] a,int begin,int end){ for(int i=end;i>begin;i--){ if(a[end]==a[i-1]){ return false; } } return true; } }
发表评论
-
查找任意两个节点的公共父节点
2011-11-04 00:42 3554基本思路是对需要查找的节点赋权值为1,其它节点权值为0.那么只 ... -
树中任意两个节点之间的距离
2011-11-04 00:28 9624树中任意两个节点之间的距离是指,从一个节点到另一个几点之间的一 ... -
用5,7,12加减运算,求最少步数得到任意数n
2011-11-03 23:59 1270package www.viking.com.algori ... -
线段重合问题
2011-11-01 13:21 2978问题:y=ax+b; 有很多线段{x0,y0,x1,y1}{ ... -
区间覆盖问题
2011-11-01 13:00 1651问题: 有很多区间,比如[1.1,3.4] [1,3] [-1 ... -
数组循环移位
2011-10-31 22:09 1442比如1 2 3 4 5 循环移位1位 ... -
最大子矩阵的和
2011-10-25 15:30 764package www.viking.com.algo ... -
最大字段和
2011-10-25 14:43 925package www.viking.com.algo ... -
有重复数的组合
2011-10-21 18:33 932package com.viking.divide; ... -
无重复数组合
2011-10-21 18:30 931无重复数的组合问题 就 ... -
m n 全排列
2011-10-21 08:54 851n个字符中长度为m的全排列 public class MN ... -
子集的全排列
2011-10-21 08:51 865比如 123 1 2 3 12 21 13 31 23 32 ... -
google笔试题 人民币问题
2011-10-20 23:57 774方法一:递归方法 对 charge[]={1,5,10,20, ... -
查找无向图中的环
2011-10-19 23:51 1922static int[][] M = { { 0 ... -
无重复数的全排列问题
2011-10-18 09:51 911采用分治思想,很多书都有。。。 这里只是引用一下,因为有很几 ... -
爬台阶问题
2011-10-18 07:57 946package com.viking.dynamic; ... -
查找中间数
2011-10-18 00:21 758package com.viking.divide; ... -
整数的因子分解
2011-10-17 23:21 955package com.viking.divide; ...
相关推荐
生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于100,其中包含重复的字符。 【输出形式】 向标准输出印...
算法分析课程作业,C语言编写,可能需要用input.txt输入,有重复数字的全排列代码
当输入元素中存在重复时,处理全排列问题会变得更为复杂。C#作为.NET框架下的主要编程语言,提供了丰富的数据结构和算法支持来解决这类问题。本篇文章将深入探讨如何使用C#解决全排列重复问题,并提供一种有效的实现...
3、输入n个数(有重复),求n个数字的全排列 如:n=3 全排列的数字为1 1 2 则输出 112 121 211 4、输入n和k(n》=k) 求n个数字的(n,k)排列 如:n=3 k=2 排列的数字为1 1 2 则输出 11 12 21
n个有重复元素全排列:无重复的全排列为序列头元素与所有元素进行交换共n种情况,每种情况的后n-1位元素构成新的序列。 重复以上过程。因为有重复元素,想要序列不重复:(1)需要保证序列头元素与其余元素一次交换...
这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。下面给出...
以下是C语言实现5个数全排列的基本步骤: 1. 定义一个数组,存储5个待排列的数。 2. 编写一个递归函数,接收当前已排列的子数组和未排列的子数组作为参数。 3. 在递归函数中,如果未排列的子数组为空,说明所有排列...
标题 "N个数全排列的非递归算法" 涉及的是计算机科学中的经典问题——全排列。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能组合。在这个场景中,非递归算法指的是不依赖递归...
根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的所有不重复排列(即n的全排列)。同时,还将提供一个Java实现的具体示例。 ### 回溯法简介 回溯法是一种通过尝试解决离散和组合问题的方法,...
123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来...
例如,对于数字1、2、3,其全排列有123、132、213、231、312、321这六种组合。 在易语言中,实现全排列通常会用到递归或回溯法。递归是一种函数调用自身的技术,而回溯法则是一种在搜索解空间树的过程中,通过不断...
去重全排列的递归实现 去掉重复数字的 全排列的 递归实现
各行上的全排列不重复。输出各行遵循“小数优先”原则, 在各全排列中,较小的数尽量靠前输出。如果将每行上的输出看成一个数字,则所有输出构成升序数列。具体格式见输出样例。 【样例输入1】1 【样例输出1】1 ...
总结,局部搜索在全排列问题中的应用主要体现在使用递归策略生成排列,但这种方法对于大规模问题效率低下,且处理重复元素时存在问题。对于矩阵最小值问题,全排列提供了所有可能的组合,但计算量随矩阵大小呈指数级...
在编程领域,全排列是一种常见的算法问题,它涉及到对一组数据进行所有可能的无重复、无顺序的排列。在这个特定的场景中,我们关注的是如何使用易语言来实现数字文本的全排列。易语言是中国本土开发的一种编程语言,...
全排列的数量可以通过排列数公式n!(n的阶乘)来计算。全排列算法广泛应用于程序设计中,尤其是在需要穷举所有可能性的场合,比如组合数学、游戏设计、密码学等领域。 在C或C++中实现全排列算法,主要的思想是递归...
全排列算法通常有多种实现方式,例如深度优先搜索(DFS)、回溯法、栈或者队列等。这种简易算法可能是通过递归或迭代的方式来完成的,它可能避免了复杂的递归结构,使得理解和实现更为简单。 描述中提到“尚有待...
回溯法的优点在于可以避免重复计算,只需要在每个分支上尝试所有可能的选择,直到找到解决方案或者确定无解。缺点是效率通常低于动态规划等其他算法,因为它可能涉及到大量的回溯操作。然而,对于小规模的问题,如本...
全排列的生成算法是指对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何 n 个字符集的排列都可以与 1~n 的 n 个数字的排列一一对应,因此在此就以 n 个数字的排列为例说明排列的生成...