- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第一章张孝乃绪论
贪心法 基本思想是:当追求的目标是一个问题的最优解时,设法把对整个问题的求解工作分成若干步骤来完成。在其中的每一个阶段都选择从局部看是最优的方案,以期望通过各阶段的局部最优选择达到整体的最优。 算法 1.1解着色问题时就是采用的贪心法。 贪心法实际上不能保证都成功地产生一个全局性最优解,但是通常可以得到一个可行的较优解。(举例) 分治法 基本思想是:把一个规模较大的问题分成两个或多个较小的与原问题相似的子问题。首先对子问题进行求解,然后设法把子问题的解合并起来,得出整个问题的解,即对问题分而治之。如果一个子问题的规模仍然比较大,不能很容易地求得解,就可以对这个子问题重复地应用分治策略。 二分法检索就是用分治策略的典型例子。 回溯法 基本思想是:有一些问题,需要通过彻底搜索所有可能情况寻找一个满足某些预定条件的最优解。由于彻底搜索的运算量通常非常大,所以采取一步一步向前试探,当有多种选择时可以任意选择一种,只要目前可行就继续向前,一旦发现问题或失败就后退,回到上一步重新选择,借助于回溯技巧和中间增加判断,这样常常可以大大地减少搜索时间。 常见的迷宫问题以及八皇后问题都可以用回溯方法来解决。 动态规划法 与分治法相似都是把一个大问题分解为若干较小的子问题,通过求解子问题而得到原问题的解。 不同点是: 分治法每次分解的子问题数目比较少,子问题之间界限清楚,处理的过程通常是自顶向下进行; 动态规划法分解的子问题可能比较多,而且子问题相互包含,为了重用已经计算的结果,要把计算的中间结果全部保存起来,通常是自底向上进行。 在带权图中,求所有结点之间最短路径的Floyd算法(见第9章)就属于动态规划法。 分枝界限法 与回溯法相似,也是一种在表示问题解空间的树上进行系统搜索的方法。 所不同的是,回溯法使用了深度优先策略,而分枝界限法一般采用广度优先策略或者采用最大收益(或最小损耗)策略,并且利用最优解属性的的上下界来控制搜索的分枝。 最后一章,在讨论背包问题时,介绍了一个用分枝界限法设计的算法。 1.4.3 算法的精化 实现一个算法,就是要把设计者头脑中的算法思想转化成计算机中可以执行的程序。 对于一个比较复杂的算法,其实现的过程往往需要经过多次细化才能完成。习惯上,把这个过程称为算法的精化。 排序问题 假设有n≥1个不同的整数a0,a1,…,an-1,要求把这些整数从大到小进行排序。 排序算法可以明确地用下面的输入和输出关系来描述其功能: 输入:是含n个元素的整数数组,记为a,其中的元素依次为:a[0], a[1], …, a[n-1]。 输出:是输入数组a中元素重新排列,记为a,其中的元素依次为:a[0], a[1], …, a[n-1],满足a[i]≥a[i+1],对所有的0≤in-1都成立 直接选择排序的思想 1 从a中选出一个最大的整数放到一个空的数组a中,作为a中的第一个元素。 2 从a中剩下的元素中再选出最大的整数放到a中,接在前一个已放入元素的后面。 反复执行步骤2,直到a中所有整数都放到排好序的数组a中。 第一步精化: 将排序后的数据仍然存储在排序前的数组里 1 从a[0]到a[n-1]中选出最大整数,设为a[j],把a[0]与a[j]进行交换。 2 从a[1]到a[n-1]中选出最大整数,设为a[j],把a[1]与a[j]进行交换。 …… …… n 从a[n-1]到a[n-1]中选出最大整数,设为a[j],把a[n-1]与a[j]进行交换(因为j=n-1,故这步可省)。 第二步精化: 把上面执行n次重复的工作,精化成一个循环。 i以1为步长,从0到n-2,循环执行: (1) 从a[i]到a[n-1]中选出最大的整数,设为a[j]。 (2) 把a[i]与a[j]进行交换。 第三步精化 循环 i以1为步长,从0到n-2,执行 (1) j←i (2) 循环 k以1为步长,从i+1到n-1,执行:若a[k]a[j],则j←k (3) t←a[i];a[i]←a[j];a[j]←t 使用C语言的函数形式描述的算法 void sortIntArray(int[] a,int n) { int i,j,k,t; for(i=0; in-1; i=i+1){ j=i; /*把a[i]作为最大整数的初值*/ for(k=i+1; kn-1; k=k+1) /*从a[i]到a[n-1]中选出最大整数*/ if(a[k]a[j]) j=k; t=a[i]; a[i]=a[j]; a[j]=t; } } 1.4.4 算法分析 分析
文档评论(0)