- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
简单算法提示.ppt
数据结构课程设计 1.分治算法 分治算法基本思想: 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 适用分治法求解问题的基本特征: 原问题的规模缩小到一定的程度可很容易解决; 原问题可以分解为若干个规模较小的相同问题,即原问题具有最优子结构性质 利用原问题分解出的子问题的解可以合并为原问题的解; 原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。 这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好 反例:快排的退化 分治算法的基本步骤 Divide-And-Conquer(P) { if ( | P | = n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk; //分解问题 for (i=1;i=k;i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 } 应用一:二分查找、二叉排序树、快排、归并排序 n=1时, move(x,1,z) 将编号为1的盘从 x 移至 z; n1时,先将上面的(n-1)个盘,从x 借助z y,即hanoi(n-1,x,z,y) 将n号盘x?z,即:mov(x,n,z); 将(n-1)个盘从 y 借助x z,即: hanoi(n-1,y,x,z) 即: 2.回溯法 回溯算法基本思想: 回溯法又称试探法。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。 基本思想是:从一条路往前走,能进则进,不能进则换一条路再试,不能换则退回去(回溯)。 在搜索(依次用各种方法一一试探)的过程中,当在 P 点有 N 种选择,则从第一种开始尝试,若第 K 种可行,即这一步搜索成功,打上标记,再向前(即 P+1点)搜索;如在P点搜索失败(所有的方法都试探过,没有一种可行),为了摆脱当前的失败,就返回搜索进程中的上一点(即P-1点),再用第 K+1 种方法(假设上次在P-1点用第K种方法搜索成功,必须明确以前用过的方法不能再用,否则会陷入死循环)再去搜索,重新寻求解答。这样搜索回溯,再搜索再回溯,如能搜索到终点,问题有解,如果最后回溯到出发点,问题就无解 用回溯法解题的一般步骤: 针对所给问题,定义问题的解空间, 它包含问题的所有解 确定易于搜索的解空间结构; 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数(约束条件)避免无效搜索。 回溯算法的一般框架 问题的解n元组(x0, x1,…,xn-1): void BackTracking(k) // 初始调用BackTracking(0); { 置X[k]为第一个可能值; while (X[k]可能值没有试完) { 设置X[k]所涉及的标记; if ((X[0], X[1],…,X[n-1])是解) 打印一组解; else BackTracking(k+1); 回溯,抹去X[k]涉及的标记; 取下一个可能的X[k]值; } } 八皇后问题 八皇后问题: 在8×8格的国际象棋棋盘上摆放8个皇后,使其不能互相攻击:任意两个皇后都不处于同一行、同一列或同一斜线上 问有多少种摆法? 四皇后为例: void Trial( int i ,int n ) { // 进入本函数时,在n×n 棋盘的前i-1行上已放置了满足条件的i-1个棋子。现从第i 行起,继续为后续棋子选择合适位置。当in 时,求得一个合法布局,输出之。 if( i n ) 输出棋盘的当前布局; else for( j=1; j=n; j++ ) { 在第i行的第j列上放一个棋子; //设置标志 if( 当前布局合法 ) Trial( i+1, n ); 移走第i行第j列的棋子; //抹去标志,试j+1列,若n列均试完,则回溯 }
文档评论(0)