- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
复杂度及其分析-Read
§1. 算法的复杂度 算法的定义: 问题的算法是有限条指令的序列, 其中每条指令都有明确的含义, 每条指令的执行包含着有限的工作量, 序列的执行会在有限时间内停止下来, 并给出问题实例的解答. 问题: 一个一般化的概念. 例如: 排序问题 实例: 问题的一个实际情况. 例如, 排序问题中待排序的量的个数、每个量的值构成了问题的一个实例。 算法为问题而建立,但是算法不能为问题而运行; 算法只能为问题的实例而运行。 算法的特性为有穷性 有限序列 有限工作量 有限时间,这一点更要强调 专业人才不仅注意算法设计的技巧,更注重算法运行所需的时间和存储空间 更应当分析算法的品性。 一个问题往往有多个算法, 评判比较解决同一问题的各种不同算法优劣的标准。 对算法的要求 易于理解:易于编程 易于调试 高效:时间上快 存储空间小 这两者是互相矛盾的 高效的算法往往不易于理解、编程、调试 易于理解、编程、调试的算法往往低效 如何选择 取决于实际需求 只运行一两次的程序, 不必高效, 易于编程即可 多次反复运行的程序, 则要求高效, 宁可编程时候多花费时间, 但将来多次运行可以节省大量时间 以排序问题为例子。 汽泡法最直观简单,但时间要求最长; 快速排序法快一点,但是其思路不是那么易懂; 堆排序最快,可是它的思路更加难懂。 算法或由它写成的程序运行所需要的时间决定于两个因素: 问题实例的大小 实例的具体情况 问题的实例用x 表示, 实例的大小用|x|表示, 算法所需要的时间不仅与|x|有关。 算法A的时间复杂度(n的函数)定义为 TA(n) =max{m|存在实例x, |x|=n, A对x 运行所需时间为m} 时间复杂度就是算法A对大小为n的所有实例运行所需时间的最大者. 此即, 最坏情况 因此,时间复杂度是n的函数. 我们主要关心时间复杂度, 说到复杂度主要就是指时间复杂度. 空间复杂度 处理器复杂度 规定时间内可处理的最大实例 不同计算机对问题实例大小的限制 问题P有算法A1,复杂度T1(n)= n3 现在把算法改善为A2, 复杂度T2(n)= n2, 原来要1小时运行时间的实例现在需要多少时间? 解 实例大小为n, 则 n3 = 3600·1000 n = 153 用A2需要时间为 n2 = 1532 = 23489 毫秒 = 23秒 定义 两个非负函数T(n)和f(n)定义在非负整数域, 如存在正数c和正整数N, 使得 T(n) ≤ c·f(n) (n ≥ N) 则称T(n)的阶小于或等于f(n)的阶, 记作 T(n) = O(f(n)) 显然, c·f(n)是T(n)的上界. 千万注意: 不可写成 O(f(n)) = T(n) 例如 4n3 = O(n3) 2n3 = O(n3) 7n3 + 5n + 1000 = O(n3) 若T(n)是多项式, 用大O标记时, 只与最高项次数有关, 与其系数无关, 与低次项无关. 如果 T(n) = O(nk), 则有 T(n) = O(n j) (j k) 若求复杂度的大O(nk)表示, 应当求出k的最小值 §2. 算法分析 A. 正确性 给定实例任何有效的输入数据后, 算法经过有限时间的运算给出实例的结果. 正确性的证明不是容易的事情. 一般地,将整个算法分成部分, 各个部分完成原问题的子任务, 证明了各部分的正确性,合起来就证明了整个算法的正确性. B. 复杂度 取决于工作量. 工作量的度量应 与使用的计算机无关, 与编程的语言无关. 用运行时间做度量或执行的指令数目做度量, 都不适宜. 选取基本运算, 计其执行次数,以此作为工作量. 优点: 便于比较同一问题的不同算法. 选取的基本运算多, 则工作量度量越精确, 但分析越复杂; 反之, 分析简单, 但是, 工作量度量就粗糙. 选取基本运算, 只计算基本运算的执行次数. 不同问题应当选取不同的基本运算. 排序问题选取比较; 而矩阵乘法选取实数乘法和加法. 衡量算法的复杂度, 需要量化问题实例的大小. 排序问题 待排序的值的个数 矩阵乘法 两个矩阵的行数和列数 图问题 节点数和边的数目 实例大小确定之后, 工作量仍不确定, 还和实例的具体情况有关. 考虑平均情况 ∑ P(I)·t(I) I∈B(n) 其中B(n)为所有大小为n的实例的集合; I是实例; P(I)是实例I出现的概率; t(I)是算法对I运行所需要的工作量. 计算有很大困难, 因为P(I)和t(I)的计算都很困难
文档评论(0)