《算法设计与分析》- 第 2 章 递归与分治策略.ppt

《算法设计与分析》- 第 2 章 递归与分治策略.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《算法设计与分析》- 第 2 章 递归与分治策略

第 2 章 递归与分治策略 第 2 章 递归与分治策略 第 2 章 递归与分治策略 鸽笼原理 (抽屉原理, Pigeonhole Principle ) 如果有 5 个鸽子笼,养鸽人养了 6 只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有 2 只或 2 只以上的鸽子(或者说不少于 2 只鸽子)。这个简单的事实就是著名的鸽笼原理(抽屉原理)。鸽笼原理的证明很简单,用反证法:假定不满足“至少有一个笼子中装有 2 只或 2 只以上的鸽子(或者说不少于 2 只鸽子)”,那么所有笼子里的鸽子数都少于 2 ,则鸽子的总数最多为 5,和已知的 6 只鸽子矛盾。得证。 第 2 章 递归与分治策略 鸽笼原理一般描述:有 n + 1 件或 n + 1 件以上的物品要放到 n 个抽屉中,那么至少有一个抽屉里有两个或两个以上物品。应用抽屉原理要注意识别“鸽笼”和“鸽子”,鸽子的数目一定要大于鸽笼的个数。 第 2 章 递归与分治策略 【例 1】任意 13 人中至少有两个人属相相同。 【解】 属相只有 12 种:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪。由于人数(13)比属相数(12)多,根据鸽笼原理至少有两个人属相相同(在这里,把 13 人看成 13 只“鸽子”,把 12 种属相看成 12 个“鸽笼”)。 第 2 章 递归与分治策略 第 2 章 递归与分治策略 【例 3】有 5 个人,每人都从装有许多黑白围棋子的布袋中任意摸出 3 枚棋子。证明这 5 个人中至少有 2 个人摸出的棋子颜色的配组是一样的。 【解】 3 枚棋子的颜色组合有:3 黑,2 黑 1 白,1 黑 2 白,3 白共 4 种配组情况,看作 4 个鸽笼。把每人的 3 枚棋子作为一组当作一只鸽子,因此共有 5 只鸽子。根据鸽笼原理,至少有两只鸽子在同一个鸽笼里,也就是他们所拿棋子的颜色配组是一样的。得证。 第 2 章 递归与分治策略 证明“稀疏性质”:矩阵 R 中最多只有 6 个 S 中的点。 第 2 章 递归与分治策略 函数 Partition 的执行过程 第 2 章 递归与分治策略 函数 Partition 的执行过程 第 2 章 递归与分治策略 函数 Partition 的执行过程 第 2 章 递归与分治策略 函数 Partition 的执行过程 第 2 章 递归与分治策略 函数 Partition 的执行过程 第 2 章 递归与分治策略 快速排序算法的时间复杂性 在快速排序中,记录的比较和交换是从两端向中间进行的。关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少(相对于其他比较类算法速度快)。 第 2 章 递归与分治策略 算法的运行时间与划分是否对称有关: (1)最坏情况:划分过程产生的两个区域分别包含 n – 1 和 1 个元素时,由于函数 Partition 的计算时间为 O( n ),如果算法 Partition 的每一步均出现这种不对称划分,则时间复杂性为: 注:由于上述划分的极端情况,QuickSort 中的递归仅执行了一次,所以上面T( n – 1 ) 的系数为 1。 第 2 章 递归与分治策略 第 2 章 递归与分治策略 (2)最好情况:每次划分所取的基准都恰好为中值,即每次划分都产生两个大小为 n / 2 的区域,则时间复杂性为: 第 2 章 递归与分治策略 快速排序算法的性能取决于划分的对称性。通过修改算法 Partition,可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步中,当数组还没有被划分时,可以在 a[ p : r ] 中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是较对称的。算法如下: 第 2 章 递归与分治策略 // 产生随机划分... int RandomizedPartition( int ArrayData[], int p, int r ) { // 生成随机数种子... srand( ( unsigned )time( NULL ) ); int i = p + rand( ) % ( r - p ); // 产生 p 和 r 之间的一个随机整数... // 将随机选择的元素作为划分基准元素... SwapData( ArrayData[ i ], ArrayData[ p ] ); return Partition( ArrayData, p, r ); } 第 2 章 递归与分治策略 // 随机选择策略快速排序算法... void RandomizedQuickSort( int ArrayData[], int p, int r ) { if ( p r )

您可能关注的文档

文档评论(0)

2266670 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档