`
yiminghe
  • 浏览: 1460785 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

排列与组合问题

阅读更多

演示@google code

 

1-n 全排列问题

1.非递归解法

    思路 :利用数字下标从小增到最大,同一字符编同一数字
    12345->12354->12435->12453->.....
    find a[i]>a[i+1] , find j ,j>i && j<n && a[j]>a[i] && a[j+1]<a[i] ,swap a[i].a[j] ,reverse a[i ~ n]

 

function perm(str){
	var n=str.length;
	var perm_start=[];
	var start=1;
	var charIndex={};
	for(var i=0;i<n;i++){
		if(i==str.indexOf(str[i])){
			charIndex[str[i]]=start++;
		}
		perm_start.push(charIndex[str[i]]);
	}
	var perm_strs=[];
	var over=false;
	while(!over){
		var tmpstr=[];
		for(var i=0;i<perm_start.length;i++){
			tmpstr.push(str[perm_start[i]-1]);
		}
		perm_strs.push(tmpstr);
		over=true;
		var i=n-1;
		for(i=n-1;i>0;i--) {
			if(perm_start[i]>perm_start[i-1])  {
				over=false;
				break;
			}
		}
		if(!over){
			var minIndex=i;
			for(;minIndex<n;minIndex++) {
				if(perm_start[minIndex] < perm_start[i-1]){
					break;
				}
			}
			minIndex--;
			var t=perm_start[i-1];
			perm_start[i-1]=perm_start[minIndex];
			perm_start[minIndex]=t;
			var right=perm_start.splice(i);
			right.reverse();
			
			perm_start=perm_start.concat(right);
		}
	}
	return perm_strs;
}
 

2.递归解法

    思路:两两交换,穷尽所有可能

 

#include   <iostream>  
#include   <iomanip>  
#include   <functional>     
using   namespace   std;  
template   <typename   T>  
void   Perm(T*   List,   int   k,   int   m)  {  
  int   i;  
  if   (k   ==   m)  {  
  	for   (i   =   0;   i   <=   m;   i++)  {  
  		std::cout   <<   List[i];  
  	}  
  	std::cout   <<   std::endl;  
  }  
  else  {  
  	for   (i   =   k;   i   <=   m;   i++)  {  
  		std::swap(List[k],   List[i]);  
  		Perm(List,   k   +   1,   m);  
  		std::swap(List[k],   List[i]);  
  	}  
  }  
}
 

1-n 选出 m 个数组合问题

1.递归解法

    思路:递归对前n-m个数考虑选和不选

/*
	select m from n
*/
function combination(m,n){
	var result=[];
	if(m==n){
		for(var i=n;i>=1;i--){
			result.push(i);
		}
		return [result];
	}
	for(var i=n;i>=m;i--) {
		var sub=[i];
		if(m==1) {
			result.push(sub);
			continue;
		}
		/*
			select one already,then select m-1 from n-1
		*/
		var subs=combination(m-1,i-1);
		for(var j=0;j<subs.length;j++) {
			var tmp=sub.concat(subs[j]);
			result.push(tmp);
		}
	}
	
	return result;
}
 

 

 

分享到:
评论

相关推荐

    2015高中数学1.2排列与组合课后反思新人教A版选修2_3

    排列与组合的概念与解题方式有其独特性,不同于传统的数学问题,这使得初次接触的学生需要时间适应。以下是针对这个主题的深入讲解和教学策略。 1. **理解分类计数原理和分步计数原理**: 这两个原理是解决排列与...

    排列组合练习题与答案.doc

    在实际问题中,如人员选拔、活动安排等场景,排列组合常常被用来计算可能的方案总数。以下是对给定内容中涉及的排列组合知识点的详细解释: 1. **纯排列与组合问题**: - 排列是指有序的选择,考虑顺序;组合是...

    2022高中数学全程复习第十一章第二节排列与组合.pptx

    排列与组合是高中数学中的重要概念,主要涉及统计和概率论的基本原理,它们在解决实际问题,如安排任务、计算可能性等方面有着广泛的应用。在学习这部分内容时,我们需要理解以下几个核心知识点: 1. **排列与组合...

    数学排列与组合PPT课件.pptx

    思考三:组合与排列有联系吗?回答:是的,组合是选择的结果,排列是选择后再排序的结果。 判断下列问题是组合问题还是排列问题: 1. 设集合A={a,b,c,d,e},则集合A的含有3个元素的子集有多少个?(组合问题) 2. ...

    数论:排列组合(排列组合)

    数论:排列组合(排列组合) 数论:排列组合(排列组合) 数论:排列组合(排列组合) 数论:排列组合(排列组合) 数论:排列组合(排列组合) 数论:排列组合(排列组合) 数论:排列组合(排列组合) 数论:排列组合(排列组合) ...

    高中数学排列与组合PPT课件.pptx

    高中数学排列与组合知识点 ...3. 组合与排列有联系吗? 结论 排列和组合是高中数学中两个重要的概念,它们之间有着密切的联系,但又有着很大的不同。理解和掌握排列和组合的概念对数学学习非常重要。

    高中数学选修排列与组合排列与排列数PPT课件.pptx

    排列的定义中“一定顺序”就是说与位置有关,在实际问题中,要由具体问题的性质和条件来决定,这一点要特别注意,这也是与后面学习的组合的根本区别。 五、 排列问题的判断 判断是否为排列问题的关键是要明确排列...

    下载数学错题:排列组合一.pdf

    要解决这些问题,我们需要深入理解和熟练应用排列组合的基本概念,包括组合的C(n, k)和排列的A(n, k)公式,以及如何识别和处理排列与组合问题。对于分配和分组问题,使用捆绑法、隔板法或者先分类后分步等策略可以...

    算法 排列组合生成器 后端

    3. **数据访问层**:通过Spring Data JPA或JdbcTemplate与H2数据库交互,存储和检索排列组合数据。 4. **筛选功能**:根据用户输入的条件,对生成的排列组合进行筛选,这可能涉及到SQL查询优化。 5. **性能优化**:...

    qtc++排列组合实现

    在编程领域,排列组合是算法设计中的一个重要概念,它涉及到如何有效地生成所有可能的序列或组合作为问题的解决方案。本篇文章将详细讲解如何在Qt C++环境中实现排列组合的算法。 Qt是一个跨平台的C++图形用户界面...

    排列组合问题_C++_

    在计算机科学和编程领域,排列组合问题是一种常见的算法挑战,特别是在数据结构与算法的学习和面试中。本资源针对的是使用C++语言解决这类问题。C++作为一种强大的编程语言,其丰富的库函数和模板机制使得处理数学上...

    基于c语言排列组合算法

    排列组合问题的算法设计是指如何高效地生成所有可能的排列或组合。今天,我们将讨论基于C语言的排列组合算法实现。 一、全排列算法 全排列算法是指生成所有可能的排列的算法。常见的全排列算法有递归算法、分治...

    高中数学完整讲义——排列与组合7排列组合问题的常用方法总结1,推荐文档.pdf

    高中数学完整讲义——排列与组合7排列组合问题的常用方法总结1,推荐文档.pdf

    排列组合练习题及答案.doc

    - 选派2人参加文艺活动,1人下乡,1人在本地,这是一个组合与排列的混合问题,首先从9人中选2人参加文艺活动有C(9, 2)种方法,再从剩下的7人中选1人下乡有C(7, 1)种方法,最后剩下的6人中选1人在本地有C(6, 1)种...

    C#实现排列组合算法完整实例

    在C#编程中,排列组合算法是解决许多数学和计算机科学问题的基础,特别是在处理数据排序、统计计算以及算法设计时。本实例详细介绍了如何利用C#实现这两种基本的算法:排列(Permutation)和组合(Combination)。...

    排列组合练习数据

    排列组合是离散数学中的重要概念,主要研究的是在有限集合中进行无序或有序的选择问题。在本压缩包“排列组合练习数据”中,包含了相关的测试题目,旨在帮助学习者深入理解和掌握这一主题。排列关注的是元素的顺序,...

    【高考调研】2015高中数学 1-2 排列与组合4课后巩固 新人教A版选修2-3

    以下是对给定内容中涉及的排列组合知识的详细解释: 1. **组合计数**:在第一题中,从长度为1,2,3,4的四条线段中任取三条,这是组合问题。总取法数n=C(4, 3),即从4个不同元素中取3个的方法数,计算公式为n=4!/(3!...

    排列组合软件(任意字符、关键字全排,txt输出)

    排列组合软件是一种用于生成所有可能的字符或关键字排列组合的工具,主要应用于数据分析、文本处理以及在本例中提到的电子商务领域,如淘宝直通车的关键词优化。这种软件可以帮助用户快速生成大量的组合,以便进行...

    数学排列和组合练习题 加详细解释.rar

    通过反复练习和深入理解,可以提高处理排列组合问题的能力,这对于学习离散数学、算法设计以及数据分析等高级数学应用至关重要。在实践中,排列和组合的概念经常用于解决计算机科学中的搜索、排序和优化问题,因此...

    排列和组合概念和应用

    了解和掌握排列组合原理有助于解决各种复杂问题,提升编程效率。 排列指的是从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的方法数。排列问题是有序的,比如五个人排队,第一个人有5种选择,第二...

Global site tag (gtag.js) - Google Analytics