算法设计及分析2.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  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文档。上传文档
查看更多
算法设计及分析2

第2章 算法分析基础 教学重点 大O符号;非递归算法的时间复杂性分析;最优算法 教学难点 问题的时间复杂性下界 教学内容 和 教学目标 知识点 教学要求 了解 理解 掌握 熟练掌握 输入规模与基本语句 √ 大O符号 √ 最好、最坏和平均情况 √ 非递归算法的时间复杂性分析 √ 递归算法的时间复杂性分析 √ 算法的空间复杂性分析 √ 问题的时间复杂性下界 √ 最优算法 √ 平凡下界 √ 判定树模型 √ 2.1 算法的时间复杂性分析 算法的时间复杂性分析是一种事前分析估算的方法,它是对算法所消耗资源的一种渐进分析方法。 所谓渐进分析是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。 渐进分析的好处是大大降低了算法分析的难度,是从数量级的角度评价算法的效率。 2.1.1 输入规模与基本语句 输入规模是指输入量的多少,一般来说,它可以从问题描述中得到。 一个事实是:几乎所有的算法,对于规模更大的输入都需要运行更长的时间。 运行算法所需要的时间T是输入规模n的函数,记作T(n)。 要精确地表示算法的运行时间函数常常是很困难的,即使能够给出,也可能是个相当复杂的函数,函数的求解本身也是相当复杂的。 考虑到算法分析的主要目的在于比较求解同一个问题的不同算法的效率,为了客观地反映一个算法的运行时间,可以用算法中基本语句的执行次数来度量算法的工作量。 基本语句是执行次数与整个算法的执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最重要的操作。 例2.1 int SeqSearch(int A[ ], int n, int k) //在数组A[n]中查找值为k的记录 { for (int i = 0; i n; i++) if (A[i] == k) break; if (i == n) return 0; //查找失败,返回失败的标志0 else return (i + 1); //查找成功,返回记录的序号 } 解:算法的运行时间主要耗费在循环语句,循环的执行次数取决于待查找记录个数n和待查值k在数组中的位置,每执行一次for循环,都要执行一次元素比较操作。因此,输入规模是待查找的记录个数n,基本语句是比较操作(A[i] == k)。 例2. 对如下起泡排序算法,请找出输入规模和基本语句。 void BubbleSort(int r[ ], int n) { int bound, exchange = n - 1; //第一趟起泡排序的区间是[, n-1] while (exchange != 0) //当上一趟排序有记录交换时 { bound = exchange; exchange = 0 for (int j = 0; j bound; j++) //一趟起泡排序区间是[, bound] if (r[j] r[j + 1]) { int temp = r[j]; r[j] = r[j + 1]; r[j + 1] = temp; //交换记录 exchange = j; //记载每一次记录交换的位置 } } } 解:算法由两层嵌套的循环组成,内层循环的执行次数取决于每一趟待排序区间的长度,也就是待排序记录个数,外层循环的终止条件是在一趟排序过程中没有交换记录的操作,是否有交换记录的操作取决于相邻两个元素的比较结果,也就是说,每执行一次for循环,都要执行一次比较操作,而交换记录的操作却不一定执行。因此,输入规模是待排序的记录个数n,基本语句是比较操作(r[j] r[j + 1])。 例2. 如下算法实现将两个升序序列合并成一个升序序列,请找出输入规模和基本语句。 void Union(int A[ ], int n, int B[ ], int m, int C[ ] ) //合并A[n]和B[m] { int i = 0, j = 0, k = 0; while (i n j m) { if (A[i] = B[j]) C[k++] = A[i++]; //A[i]与B[j]中较小者存入C[k] else C[k++] = B[j++]; } while (i n) C[k++] = A[i++]; //收尾处理,序列A中还有剩余记录 while

文档评论(0)

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

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

1亿VIP精品文档

相关文档