第3章分治法.ppt.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与分析 授课教师:王秋芬 办公地点:7307 Email: w_qiufen@163.com 第三章 分治法 目录 概述 二分查找 循环赛日程表 合并排序 快速排序 教学目标 掌握分治法的基本思想和求解步骤 理解分治法的精髓,即如何分?如何治?才能使得算法效率更高 通过实例学习,掌握运用分治法来解决实际问题的方法 学习分治法的意义 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关:问题的规模越小,越容易直接求解。 要想直接解决一个规模较大的问题,有时是很困难的。那么,为了更好地解决这些规模较大的问题,分治法应运而生了。 在计算机科学中,分治法是一种很重要的算法。它采取各个击破的技巧来解决一个规模较大的问题,该技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等。 分治法的基本思想 基本思想 将一个难以直接解决的大问题,分解成一些规模较小的相同问题,以便各个击破,分而治之。 何时能、何时应该采用分治法来解决问题呢? 分治法的解题步骤 步骤1:分解——即将问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题; 步骤2:治理 步骤2-1:求解各个子问题 步骤2-2:合并 二分查找 问题描述 二分查找又称为折半查找,它要求待查找的数据元素必须是按关键字大小有序排列的。问题描述:给定已排好序的n个元素s1,…,sn,现要在这n个元素中找出一特定元素x。 首先较容易想到使用顺序查找方法,逐个比较s1,…,sn,直至找出元素x或搜索遍整个序列后确定x不在其中。显然,该方法没有很好地利用n个元素已排好序这个条件。因此,在最坏情况下,顺序查找方法需要O(n)次比较。 算法思想 假定元素序列已经由小到大排好序,将有序序列分成规模大致相等的两部分,然后取中间元素与特定查找元素x进行比较,如果x等于中间元素,则算法终止;如果x小于中间元素,则在序列的左半部继续查找,即在序列的左半部重复分解和治理操作;否则,在序列的右半部继续查找,即在序列的右半部重复分解和治理操作。可见,二分查找算法重复利用了元素间的次序关系。 算法设计 步骤1:确定合适的数据结构。设置数组s[n]来存放n个已排好序的元素;变量low和high表示查找范围在数组中的下界和上界;middle表示查找范围的中间位置;x为特定元素; 步骤2:初始化。令low=0;high=n-1; 步骤3:middle=(low+high)/2,即指示中间元素; 步骤4:判定low小于等于high是否成立,如果成立,转步骤5;否则,算法结束; 步骤5:判断x与s[middle]的关系。如果x==s[middle],算法结束;如果xs[middle],则令low=middle+1;否则令high=middle-1,转步骤3。 算法描述——递归形式 int BinarySearch(nt s[n],int x,int low,int high) { if (lowhigh) return -1; int middle=(low+high)/2; if(x==s[middle]) return middle; else if(xs[middle]) return BinarySearch (s, x, middle+1, high); else return BinarySearch (s, x, low, middle-1); } 算法分析 设给定的有序序列中具有n个元素。 显然,当n=1时,查找一个元素需要常量时间,因而T(n)=O(1)。 当n1时,计算序列的中间位置及进行元素的比较,需要常量时间O(1)。递归地求解规模为n/2的子问题,所需时间为T(n/2)。 因此,二分查找算法所需的运行时间T(n)的递归形式为: 当n1时,T(n)=T(n/2)+O(1) =…… =T(n/2x)+xO(1) 简单起见,令n=2x,则x=logn。 由此,T(n)=T(1)+logn=O(1)+O(logn)。因此,二分查找算法的时间复杂性为O(logn)。 循环赛日程表 问题描述 设有n=2k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其它n-1个选手各赛一次; (2)每个选手一天只能比赛一次; (3)循环赛一共需要进行n-1天。 由于n=2k,显然n为偶数。 分治法求解思路 (1)如何分,即如何合理地进行问题的分解? 一分为二 (2)如何治,即如何进行问题的求解? 进行合并 (3)问题的关键——发

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档