第2章 算法分析

2.1 数学基础

        本书将使用以下四个定义:

        定义:如果存在正常数 c 和 n_{0}使得当N\geqslant n_{0}T(N)\leqslant cf(N),则记为T(N)=O(f(N))

        定义:如果存在正常数 c 和 n_{0}使得当N\geqslant n_{0}T(N)\geqslant cg(N),则记为T(N)=\Omega (g(N))

        定义:当且仅当T(N)=O(h(N))T(N)=\Omega (h(N))时,T(N)=\Theta (h(N))

        定义:如果T(N)=O(p(N))T(N)\neq \Theta (p(N)),则T(N)=o(p(N))

        第一个定义的意思是,总存在某个点n_{0}使得在这个点或这点之后的N会让cf(N)至少和T(N)一样大。忽略常数因子的话就是f(N)至少和T(N )一样大。再说简单点就是用传统的不等式来计算增长率,第一个定义是说,T(N)增长率小于等于f(N),第二个是T(N)大于等于g(N),第三个是T(N)等于h(N),第四个是T(N)小于p(N)

        需要掌握的重要结论为:

        法则1:如果T_{1}=O(f(N)),且T_{2}(N)=O(g(N))那么

        (a)T_{1}(N)+T_{2}(N)=max(O(f(N)),O(g(N)))

        (b)T_{1}(N)*T_{2}(N)=O(f(N)*g(N))

        法则2:如果T(N)是一个k次多项式,则T(N)=\Theta (N^k)

        法则3:对任意常数klog^kN=O(N)。它告诉我们对数增长非常缓慢

2.2 模型 - 略

2.3 要分析的问题

        要分析的最重要的资源是运行时间,我们只考虑使用的算法以及该算法的输入的因素。

        通常输入的大小是主要的考虑方面,我们定义两个函数T_{avg}(N),T_{worst}(N),分别是输入为N时算法花费的平均运行时间和最坏运行时间,显然T_{avg}(N)\leqslant T_{worst}(N)。一般若无其他指定,则需要的是最坏情况下的运行时间,一个原因是它对所有的输入提供了一个界限,另一个原因是平均情况的界计算起来要困难得多。

        我们将在下一节考虑下述问题:

        最大子序列问题

        给定整数A_{1},A_{2},...,A_{k}(可能有负数),求\sum_{k=i}^{j}A_{k}的最大值(为方便起见,若所有整数为负数,则最大子序列和为0)

        例如:输入-2,11,-4,13,-5,-2时,答案为20(从A_{2}A_{4}),这个问题之所以有吸引力,主要是因为有许多求解它的算法,而这些算法性能相差很大。如图有四种算法

算法1234
时间O(N^3)O(N^2)O(NlogN)O(N)
N=100.001030.000450.000660.00034
N=1000.470150.011120.004860.00063
N=1000448.771.12330.058430.00333
N=10000NA111.130.686310.03042
N=100000NANA8.01130.29832

对于算法4,从磁盘读入数据所用的时间很可能在数量级上比求解上述问题需要的时间还要多,这是许多有效算法的典型特点。

2.4 运行时间计算 - 略

太累了不想写了,这两篇文章就当作记录吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值