组合排列遍历算法浅析(一)

   最近一段时间,稍微空闲了些,于是准备把去年面试某公司时遇到的题写出来。

   回味那次面试,真是有点尴尬,大学毕业后,一直忙于这样技术、那样技术,此控件、彼控件的,对于基础的东西忘得差不多了。

于是乎,在面试官一道问题下,顿显尴尬。不过这个面试官的面试方法我觉得挺变态的……

   通过了第一轮电面,第二轮笔试,开始了第三轮面试的时候,面试官开始问一些工作经历上的事情。问得差不多的时候,突然来一句,

这里有一道比较简单的算法题,你来解一下喃:

   有n个数,打印出取其中m个数的所有组合。

   我当时脑中只记得了C(n,m)这么个符号了,于时我开始努力回忆相关知识……然后面试官就坐我对面,看着我。他越看我越紧张……15分钟后,

我当时先给出了一种算法出来,也不知道对不对,完全没有把握,因为相关知识始终没有回忆起来。然后面试官居看了后,也没有说对或错。只是又来一句,

那我们换另外个简单问题:

   有n个数,打印出取其中m个数的所有排列。

   这次真尴尬了,过了25分钟了,我还没有给出算法,面试官就一直在那儿看着我。后来无奈下放弃了。

 

   回家后,我心里相当不舒服。开始重新推敲相关的公式。首先,我勉强能记着:

           组合公式C(n,m)=n!/((n-m)!m!),

           然后是排列公式A(n,m)=n!/(n-m)!

         这下没有人一直看着我,我的脑袋终于开始灵光了。在算法设计上,我准备采用递归的思路,然后很快想出解决思路:

   1)对于组合,首先我想推敲出C(n,m)与C(n-1,m-1)之间的关系。通过举例的方法,我判断出大概有C(n,m)=C(n-1,m-1)+C(n-1,m)的关系。

然后我开始通过数学来验证:C(n-1,m-1)+C(n-1,m)=(n-1)! / ( (n-m)!(m-1)!) + (n-1)! / ((n-m+1)!m!) 

 通分过后=m(n-1)! / ( (n-m)!m!)    +   (n-m)(n-1)! / ((n-m)!m!)=n! / ( (n-m)! m!)=C(n,m)=C(n,m)

            OK,这样就可以开始编码了。

 

   2)对于排列,我也准备推敲出A(n,m)与A(n-1,m-1)的关系。这个推敲很简单。A(n,m)=n*A(n-1,m-1),推导过程我就不写了。

   于是,这里也可以编码了。

 

   当时只推出了公式,没有实现编码。等这几天空的时候,我就再把代码补上。对于这里的算法,我在想出递归的方法后,就没有继续去想

动态规划的算法了。如果哪位有更高级的算法,不妨拿出来交流下。感激不尽!

 

 

时间: 2024-10-27 10:46:00

组合排列遍历算法浅析(一)的相关文章

递归求解几类排列组合问题(四、普通选择性组合排列)

四.普通选择性组合排列 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input  5 3   1 2 3 4 5   Sample Output  123  124  125  134  135  145  234  2

递归求解几类排列组合问题(五、生成全子集组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 五.生成全子集组合排列(不含空集) Sample Input  4   1 2 3 4   Sample Output  1  12  123  1234  124  13  134  14

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input  4   1 2 2 3   Sample Output  1223  1232  1322  2123 

递归求解几类排列组合问题(一、类循环组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 一.类循环组合排列 Sample Input :  4 2   Sample Output  0000  0001  0010  0011  0100  0101  0110  0111 

二叉树遍历算法之一:前序遍历

递归实现前序遍历 二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次. 当调用遍历算法的时候前序遍历的具体过程如下: 首先访问根节点,如果根节点不为空,执行输出语句,打印根节点的值. 如果左子树不为空,则访问根节点的左孩子,并输出根节点做孩子的值 继续访问根节点的左孩子的左孩子,如果不为空则继续输出该左孩子的值: 如果这时左孩子为空,说明该节点是叶子节点,则按照先左孩子后右孩子的访问方式访问其左右孩子,如果不为空就打印输出 左

二叉树创建及遍历算法

//二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二叉树的前,中,后序遍历(递归) 时间:2001年10月7日(21:09:38-22:09:00) 内容:完成二叉树的前,中序遍历(非递归) 时间:2001年10月8日(10:09:38-11:29:00) 内容:完成查找二叉树的静,动态查找(非递归) */ #include "stdlib.h&qu

二叉树遍历算法集合

二叉树遍历算法集合(前中后序遍历的递归和非递归算法,层序遍历算法) 费了两天时间写的,包括前中后序遍历的递归和非递归算法,还有层序遍历总共2*3 + 1 = 7中遍历二叉树的算法,感觉其中后序遍历的非递归算法比较困难,想了很久最后的实现还是不够优雅,请大家指正~~ 总共三个文件,一个头文件,一个对应的cpp文件,还有一个用于测试的文件. 头文件: /**//******************************************************************** c

python以环状形式组合排列图片并输出的方法

 这篇文章主要介绍了python以环状形式组合排列图片并输出的方法,涉及Python使用pil库操作图片的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了python以环状形式组合排列图片并输出的方法.分享给大家供大家参考.具体分析如下: 这段代码可以自定义一个空白画板,然后将指定的图片以圆环状的方式排列起来,用到了pil库,可以通过: pip install pil 的方式安装. 具体代码如下: 代码如下: # -*- coding: utf-8 -*- __autho

二叉树的非递归后序遍历算法案例解析

 这篇文章主要介绍了二叉树的非递归后序遍历算法实例,需要的朋友可以参考下 前序.中序.后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的,必须有一些额外的信息存放在栈中. 方法有很多,这里只举一种,先定义栈结点的数据结构    代码如下: typedef struct{Node * p; int rvisited;}SNode //Node 是二叉树的结点结构,rvisited==1代表p所指向的结点的右结点已被访问过.   lastOrderTraverse(Bi