算法设计和分析复习资料.docVIP

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计和分析复习资料.doc

分治法求全排列 算法描述 分治法求解问题分为三个步骤: - 分解:将问题分为若干个子问题。 - 解决:递归地求解每个子问题。 - 合并:将每个子问题的解合并成为整个问题的解。 现在我们需要求具有n个元素的数组A的全排列。例如:大小为3的数组A=[a,b,c] (为方便起见,我把引号全都省略了,其实应该是A=[a,b,c]。下同),它的全排列为: [[a,b,c], [a,c,b], [b,a,c], [b,c,a], [c,a,b], [c,b,a]] 这是一个大小为 n!*n 的二维数组。 使用分治算法求解全排列的过程如下 - 分解:将数组分为子数组 A[1..k-1] 和一个元素 A[k]。 (1≤k≤n) - 解决:递归地求解每个子数组 A[1..k-1] 的全排列,直至子数组A[1..k-1]为空时结束递归。 - 合并:将上一步的结果—A[1..k-1]的全排列(一个二维数组)与元素A[k]合并,得出A[1..k]的全排列。例如: [[]] 与 a 合并得到 [[a]] [[a]] 与 b 合并得到 [[a,b], [b,a]] [[a,b],[b,a]] 与 c 合并得到 [[a,b,c],[a,c,b],[c,a,b],[b,c,a],[c,a,b],[c,b,a]] #include cstring #include iostream using namespace std; #define N 4 char str[10]; void Perm(char *str, int k, int m); void Swap(char a, char b); int main() { int n; while(scanf(%d, n) != EOF) { for(int i=0; i=n; ++i) { str[i] = i+0; } Perm(str, 1, n); } return 0; } void Perm(char *str, int k, int m) { int i; if(k == m) { for(i=1; i=m; ++i) coutstr[i] flush; coutendl; return; } for(i=k; i=m; ++i) { Swap(str[k], str[i]); Perm(str, k+1, m); Swap(str[k], str[i]); } } void Swap(char a, char b) { char tmp = a; a = b; b = tmp; } 分治法求第K小元素算法: 求一列数中的第k小元素,利用分治的策略进行递归求解。 首先随便指定一个数,这里我指定的是第一个数为第k小元素记为randK,将数组中其他的数与findK进行比较,比他小的放在左边,大的放在右边,如果randK左边的元素个数为k-1个,说明findK就是你所要找的元素,如果左边的元素个数k-1,说明你要找的元素在左边的数中,继续使用相同的方法在左边的数中进行查找,如果左边的元素的个数k-1,说明你要找的元素在右边的数中,则继续使用相同的办法在右边的数中进行查找。。。 代码: #define Array_max 200 void swap(int a,int b){ int temp; temp = a; a = b; b = temp;} void out(int a[],int n){ for(int i = 0;in;i++){ couta[i] ; if(i % 8 == 0 i != 0) coutendl;} coutendl; } int findP(int a[],int oP,int R){//oP是随机元素的位置开始为0,oP左边,R右边 nt randK = a[oP];//随机找一个数 int

文档评论(0)

feiyang66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档