算法分析数学基础

相对增长率

    我们将两个函数的相对增长速度称为相对增长率,从数学角度上来说其实就是一阶导数,看谁的增长速度更快,比如 f ( x ) = x 2 f(x)=x^2 的增长速度比 g ( x ) = x g(x)=x 要更快。
    在算法分析中:

  • 我们将 f ( x ) f(x) 的增长率大于或等于 g ( x ) g(x) 的增长率记为 g ( x ) = O ( f ( x ) ) g(x)=O(f(x)) ,也叫大O标记法。
  • 反之,我们将 f ( x ) f(x) 的增长率小于或等于 g ( x ) g(x) 的增长率记为 g ( x ) = Ω ( f ( x ) ) g(x)=Ω(f(x))
  • f ( x ) f(x) 的增长率等于 g ( x ) g(x)的增长率 记为 g ( x ) = Θ ( f ( x ) ) g(x)=Θ(f(x))
  • 另外还有一个 g ( x ) = o ( f ( x ) ) g(x)=o(f(x)) ,不同于 O O 的大于等于,小 o o 表示 f ( x ) f(x) 的增长率大于 g ( x ) g(x)

    基于上面的定义,有几点推论:

  • 如果 T 1 ( N ) = O ( f 1 ( N ) ) T_1(N)=O(f_1(N)) T 2 ( N ) = O ( f 2 ( N ) ) T_2(N)=O(f_2(N)) ,则有 T 1 ( N ) + T 2 ( N ) = O ( f 1 ( N ) + f 2 ( N ) ) T_1(N)+T_2(N)=O(f_1(N)+f_2(N))

  • 如果 T 1 ( N ) = O ( f 1 ( N ) ) T_1(N)=O(f_1(N)) T 2 ( N ) = O ( f 2 ( N ) ) T_2(N)=O(f_2(N)) ,则有 T 1 ( N ) T 2 ( N ) = O ( f 1 ( N ) f 2 ( N ) ) T_1(N) \cdot T_2(N)=O(f_1(N) \cdot f_2(N))

  • T ( N ) T(N) 为k次多项式, T ( N ) = Θ ( N k ) T(N)=Θ(N^k) ,即低次项和常数可以忽略

  • 对于任意尝试k, l o g k N = O ( N ) log^kN=O(N) ,对于对数,无论是几次幂,他的增长率也没有N的增长率大,说明对数函数的增长率极其慢。

相对增长率与极限的关系

  • lim x T ( N ) f ( N ) = 0 \displaystyle \lim_{x \to \infty}{\frac{T(N)}{f(N)}}=0 ,则 T ( N ) = o ( f ( N ) ) T(N)=o(f(N))

  • lim x T ( N ) f ( N ) = c \displaystyle \lim_{x \to \infty}{\frac{T(N)}{f(N)}}=c ,c为常数,则 T ( N ) = Θ ( f ( N ) ) T(N)=Θ(f(N))

  • lim x T ( N ) f ( N ) = \displaystyle \lim_{x \to \infty}{\frac{T(N)}{f(N)}}= \infty ,c为常数,则 f ( N ) = o ( T ( N ) ) f(N)=o(T(N))

程序的增长率函数

    对于不同的程序逻辑都会对应不同增长率,所以不同的算法在大数据下执行效率千差万别,对于一般的顺序执行或者判断,他的增长率为 O ( 1 ) O(1) ,你不管传入多大的入参,执行起来是无差别的,而对于循环语句则意味着 O ( N ) O(N) ,而循环中嵌入了k重循环,则增长率是 O ( N k ) O(N^k) 。而一些折半或者二分算法他的增长率就是 O ( l o g N ) O(logN)

发布了39 篇原创文章 · 获赞 9 · 访问量 998

猜你喜欢

转载自blog.csdn.net/qq_30095631/article/details/103845576
今日推荐