数据结构-数据选择算法-即从指定数组中选取指定个数的数据的种类

本文转载http://blog.csdn.net/feixiaoxing/article/details/6877461

在数学中,有一些数据选择的内容。举个例子来说,有这样一组数据:1、2、3、4。现在我们打算从中挑选出1个数据,那么有几种选择呢?结果应该是1、2、3、4;那么如果挑选2个数据呢,怎么选呢?那么结果应该是12、13、14、15。以此类推,我们还能挑选出3个数据、4个数据的情况。

    那么,在程序上面应该怎么表示呢?其实可以使用递归的方法。请大家和我一起计算一下:

    如果需要从1、2、3、4中挑选两个数据,那么是不是先从1开始,然后再2、3、4中挑选一个数据,这样可以有12、13、14三种情况。接着呢,我们从2开始,下面可以选择的数据只有从3、4中选择了,1不能选择了,否则会产生重复选项。以此类推,那我们从4开始的时候,发现4后面没有数据的时候,此时迭代终止。

    挑选2个数据如此,那么挑选n个数据是不是也是这样呢?首先选出第1个数据,那么剩下来的数据只能从这个数据后面位置开始挑选,如果挑选出n-1个数据,那么表示n个数据存在,继续寻找到,直到n-1个数据选不出来为止;接着我们移动第一个数据的位置,同样需要在当前数据的后面挑选n-1个数据。以此类推,如果我们发现当前数据后面连n-1个数据都没有了,那么表示递归就结束了。

    下面我们就可以书写代码了。

    a) 定义全局空间和打印函数,保存已经遍历的数据

[cpp]  view plain copy
  1. static int gAllData[MAX_NUMBER]= {0};  
  2. static int gTotal = 0;  
  3.   
  4. void print(int pData[], int length)  
  5. {  
  6.     int index;  
  7.   
  8.     for(index = 0; index < length; index++)  
  9.         printf("%d", pData[index]);  
  10.   
  11.     printf("\n");  
  12. }  
     b)开始数据的迭代

[cpp]  view plain copy
  1. void traverse(int pData[], int length, int number)  
  2. {  
  3.     int index;  
  4.     if(0 == length)  
  5.         return;  
  6.       
  7.     for(index = 0; index < length; index++){  
  8.         gAllData[gTotal ++] = pData[index];  
  9.   
  10.         if(1 == number)  
  11.             print(gAllData, gTotal);  
  12.         else  
  13.             traverse(pData + (index + 1), length - (index + 1), number -1);  
  14.   
  15.         gAllData[-- gTotal] = 0;  
  16.     }  
  17. }  
     c)编写测试用例,验证结果
[cpp]  view plain copy
  1. void test()  
  2. {  
  3.     int data[] = {1, 2, 3, 4, 5, 6};  
  4.     memset(gAllData, 0, sizeof(int) * MAX_NUMBER);  
  5.     traverse(data, sizeof(data)/sizeof(int), 4);  
  6. }  

第一章 引论 1.1 组合学研究的对象 1.2 组合问题典型实例 1.2.1 分派问题 1. 2.2 染色问题 1.2.3 幻方问题 1.2.4 36军官问题 1.2.5 中国邮路问题 习 题 第二章 排列与组合 2.1 两个基本计原理 2.2 无重集的排列与组合 2.3 重集的排列与组合 2.4 排列生成算法 2.4.1 序法 2.4.2 字典序法 2.4.3 轮转法 2.5 组合生成算法 .2.6 应用举例 习 题 第三章 容斥原理 3.1 引 言 3.2 容斥原理 3.3 几个重要公式 3.4 错位排列 3.5 有限制的排列 3.6 棋阵多项式 3.7 禁位排列 习 题 第四章 鸽巢原理 4.1 鸽巢原理 4. 2 鸽巢原理的推广形式 4. 3 ramsey 4.4 ramsey的性质 4.5 ramsey定理 习 题 第五章 母函 5.1 母函概念 5.2 幂级型母函 5.3 整的拆分 5.4 ferrers图 5.5 指型母函 习 题 第六章 递归关系 6.1 引言 6.2 几个典型的递归关系.. 6.3 用母函方法求解递归关系 6.4 常系线性齐次递归关系的求解 6.5 常系线性非齐次递归关系的求解 6.6 非常系非线性递归关系的求解 6.7 差分表法 6.8 stirling 习 题 第七章 polya定理 7.1 有限集的映射 7.2 群的基本概念 7.3 置换群 7.4 置换的奇偶性 7.5 置换群下的共轭类 7.6 burnside引理 7.7 polya定理 7.8 polya定理的母函型式 7.9 不标号图的计 习 题 第八章 图论基础 8.1 图的基本概念 8.2 同构图、完全图与二分图 8.3 通路、回路与图的连通性 8.4 euler图与hamilton图 8.5 割集与树 8.6 图的矩阵表示法 8.7 平面图、对偶图与色 8.8 匹配理论 8.9 网络流 习 题 第九章 拉丁方与区组设计 9.1 引言 9.2 拉丁方 9.3 有限域 9.4 正交拉丁方的构造 9.5 完全区组设计 9.6 平衡不完全区组设计(bibd) 9.7 区组设计的构造 9.8 steiner三连系 9.9 hadamard矩阵 习 题 第十章 线性规划 10.1 lp问题引例 10.2 lp问题的一般形式 10.3 lp问题的标准型 10.4 可行域和最优可行解 10.5 单纯形法 10.6 单纯形表格法 10.7 两阶段法 10.8 对偶原理 10.9 对偶单纯形法 10.10 应用举例 习 题 第十一章 组合优化算法与计算的时间复杂度理论 11.1 dijkstra算法 11.2 floyd算法 11.3 kruskal算法 11.4 求最优树的破圈法和统观法 11.5 二分图中最大匹配与最佳匹配的算法 11.6 fleury算法 11.7 中国邮路问题及其算法 11.8 深度优先搜索法--dfs算法 11.9 项目网络与关键路径法 11.10 网络最大流算法 11.11 状态转移法 11.12 好算法、坏算法和np类问题 11.13 npc类问题 11.14 货郎问题的近似解 习 题... 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值