第 2 章 算法分析

算法(algorithm)是为求解一个问题需要遵循的、被清楚地指定的简单指令的集合。

2.1 数学基础

定义:

    如果存在正常数 c 和 n_{0} 使得当 N \geq n_{0} 时 T(N) \leq cf(N),则记为 T(N) = O(f(N))。(上界,小于等于)

    如果存在正常数 c 和 n_{0} 使得当 N \geq n_{0} 时 T(N) \geq cg(N),则记为 T(N) = \Omega (g(N))。 (下界,大于等于)

    T(N) = \Theta (h(N)) 当且仅当 T(N) = O(h(N)) 且 T(N) = \Omega (h(N))。(等于)

    如果 T(N) = O(p(N)) 且 T(N) \neq \Theta (p(N)),则 T(N) = o(p(N))。  (上界,小于)

以上定义的目的是要在函数间建立一种相对的级别。

重要结论:

    法则 1:

        如果 T_{_{1}}(N) = 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)) * O(g(N))

    法则 2:

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

    法则 3:

        对任意常数 klog^{k} N = O(N) 。它告诉我们对数增长地非常缓慢。

注意事项:

    1. 在需要大 O 表示的任何分析中,各种简化都是可能发生的。低阶项一般可以被忽略,而常数也可以弃掉。

    2. 总能够通过计算极限 \lim_{n \rightarrow \infty} f(N) / g(N) 来确定两个函数的相对增长率时,必要的话可以使用洛必达法则:

  • 极限是 0:即 f(N) = o(g(N))
  • 极限是 c \neq 0:即 f(N) = \Theta (g(N))
  • 极限是 \infty:即 g(N) = o(f(N))
  • 极限摆动:二者无关。

2.2 模型

    模型机是一台标准的计算机,指令被顺序地执行。

    做任何简单的工作都恰好话费一个时间单元。

    有固定范围的整数并且不存在诸如矩阵求逆或排序等运算。

    且具有无限的内存。

2.3 要分析的问题

    考虑输入规模对时间的影响。当输入为 N 时,用 T_{avg}(N) 表示算法所花费的平均运行时间,用 T_{worst}(N) 表示算法在最坏情况下的运行时间。

    一般来说,若无相反的指定,则所需的量是最坏情况下的运行时间。

最大的子序列和问题:

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

这个问题所以有吸引力,主要是因为存在求解它的很多算法,而这些算法的性能又差异很大。

因此只要可能,使得算法足够有效而不致成为问题的瓶颈是非常重要的。

2.4 运行时间计算

 

 

你可能感兴趣的:(算法与数据结构)