数据结构与算法分析(01):四种记法及算法耗时估计一般法则

1. 基本概念

大O记法,用以确定函数的上限; 表示两个量之间的不大于关系

f(N) \leq c f(N) \rightarrow T(N) = O(f(N))

Ω记法,用以确定函数的下限;表示两个量之间的不小于关系

f(N) \leq c f(N) \rightarrow T(N) \leq O(f(N))

Θ记法,确定两个函数相等;表示两个量之间的相等关系

f(N) = \Theta(H(N)))

小o记法用以表示两个函数之间只存在小于关系; 

注意:在大O表示法中,各种简化发生是常见的现象,低阶项一般被忽略,常数项会被丢弃。

2. 评价方法

我们可以通过极限来评判两个量的相对增长率:lim_{N->oo}f(x)/g(x)

当极限为0时,意味着大O记法;当极限不等于0时,意味着Ω记法;当极限为oo时,意味着小o记法

常见的几种函数的增长率对比:

C<\log N < \log^{2}N < N < N \log N < N^2 < N^3 < 2^N

对算法最坏性能的分析代表了程序应对任何输入可能的一种保证,而对算法平均性能的分析则代表了算法运行的典型结果,通常很少去分析算法的最好运行性能。

对于一些运行高效的算法,其瓶颈一般出现在数据读入;算法真正用于解决问题运行的时间只是很小一部分,数据一旦读入,算法将很快解决。

3. 算法运行时间测算的一般法则

for循环:循环内语句的运行时间 × 迭代次数

嵌套for循环:内存循环语句运行时间 × 所有外层循环大小

顺序语句:各语句运行时间求和

if/else语句:不超过判断语句 + 耗时较长分支的运行时间

有方法调用:分析方法调用耗时

递归:注意分析其for的简单变体还是其他更复杂的形式

//复杂度为O(N)的斐波那契数列计算
long fab(int n)
{
    if n = 1;
        return 1;
    else
        return n * fab(n - 1);
}

//频繁函数调用的计算方式,该方式存在大量无效的计算,效率极低
long fab(int n)
{
    if n <= 1;
        return 1;
    else
        return fab(n - 1) * fab(n - 2);
}

更多精彩内容,欢迎关注本人微信公众号:

数据结构与算法分析(01):四种记法及算法耗时估计一般法则_第1张图片

你可能感兴趣的:(算法分析)