3_序列和字符串.ppt

  1. 1、本文档共105页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2005年浙江省队培训 第3讲 序列和字符串的算法 刘汝佳 目录 一、算法分析基础 二、排序 三、序列的算法 四、串的算法 一、算法分析基础 抽象操作 抽象操作(abstract operations). 对于单一操作(如加法)的算法, 运行时间 = 操作时间 * 操作次数 (不考虑cache等体系结构方面的影响) 操作时间取决于计算机 操作次数取决于算法 算法分析: 只考虑算法特性, 因此只考虑操作次数 操作数函数 在很多情况下, 基本操作数可以写成N的函数f(N), 其中N代表主要参数 例如, 给N个数排序的问题, N就是主要参数, 它最明显的决定了问题的复杂程度, 也影响着算法效率 存在多个主参数的情况类似定义, 本节暂不考虑 比较两个算法 假设有两个算法 算法一执行了f(n)=n2次基本操作 算法二执行了g(n)=n2/2次基本操作 那个算法好呢? 绝对操作数算法二好,因为g(n) f(n) 增长情况呢? n扩大10倍,f(n)扩大100倍,g(n)也扩大100倍 两个算法的增长情况一样! 我们说: 渐进时间复杂度一样! 渐进时间复杂度 f(n)=n2和g(n)=n2/2 结论: 增长情况一样 问题: 如何表示“增长情况”? 方法: 把f(n)和g(n)变成“渐进”形式,然后直接比较 如何变成“渐进”形式?只保留最“大”项, 忽略系数, 符合前面介绍的原则 例1:3n4+8n2+n+2 ? n4 例2:2n+1+n100+5 ? 2n (为什么n+1变成了n?) 常见的函数增长 f(N)的渐进形式往往是以下某个函数 1(常数, constant): 和N无关, N多大运行时间都一样 logN(对数, logarithmic): 这是个增长缓慢的函数. 若底为2, 则log1000000约为20 N(线性, linear): 对于必须处理N个输入数据, 或者得到N个输出数据的问题, 算法(在渐进意义下)是最优的. N2(平方, quadratic): 若N加倍, 函数值变为四倍 2N(指数级, exponential): N很小时2N已经很大了 多项式算法Na: 有效算法 函数增长和运行时间 对数函数 若bL=n, 记L = logbn,称L为以b为底的n的对数 对数的公式 logan + logam = loganm klogan = logank 换底公式: logan/logbn=logba 对数是一种增长很慢的函数 log21000 约为 10 lo约为20 对数函数 由于算法分析忽略常数,通常logN不指定底, 默认情况为2, 记为lgN, 若底为自然对数e(=2.71828), 记为lnN lgN为N二进制表示中的位数,lg10=3.322 有时也取对数的对数 loglogN. 由于lglg1012=lg39.865.32, 所以一般可以把它看作常数 其他常见函数和近似 复杂度分析不清楚怎么办 只分析上限,而不需要精确计算实际运行时间 若n充分大时|f(n)|=c|g(n)|,其中c为某常数 记f(n) = O(g(n)),表示g(n)为f(n)的渐进上限 例1:5n2+3n+1 = O(n2) 例2:2n3 = O(7n8) 类似的,可以定义下限Ω 如果上下限相等,增长情况完全一样,记做Θ 由于上限有无限多个,我们希望它尽量精确, 否则我们的分析就过于悲观了,实际算法没那么糟糕 递归式 在很多时候, 无法写出时间复杂度T(n)的显式表达式, 而只能得到递归方程 公式一: T(1)=1, T(n)=T(n-1)+n, 则T(n)为n(n+1)/2 公式二: T(1)=1, T(n)=T(n/2)+1, 则T(n)约为lgN 公式三: T(1)=0, T(n)=T(n/2)+n, 则T(n)约为2n 公式四: T(1)=0, T(n)=2T(n/2)+n, 则T(n)约为nlgN 公式五: T(1)=1, T(n)=2T(n/2)+1, 则T(n)约为2n 考虑一般情形: T(n) = aT(n/b) + f(n) 递归树分析 T(n) = aT(n/b) + f(n), a, b为常数,f(n)为给定函数 递归树: T(n) = f(n)+af(n/b)+a2f(n/b2)+…+aLf(n/bL) 其中最后一项为递归边界,即n/bL=1,因此L=logbn 公式四分析 T(n) = aT(n/b) + f(n) 递归树得到的结果: T(n) = f(n)+af(n/b)+a2f(n/b2)+…+aLf(n/bL) 其中L=logbn 公式四:T(n) = 2T(n/2) + n a = 2, b = 2, f(n) = n 对于第k项,有2kf(n/2k) = 2k *n/2k =

您可能关注的文档

文档评论(0)

精华文档888 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档