算法时间复杂度的定义及运算规则
1、Big O
- 需要定义算法的时间复杂度
- 不必非常精确
- 通常只需要了解其上界,相对简单
定义
- \(f(n) = O(g(n)), \ if \ \exists \ c > 0:c * g(n) \geq f(n)\)
- \(f(n) = \Omega (g(n)), \ if \ \exists \ c > 0:c * g(n) \leq f(n)\)
- \(f(n) = \Theta (g(n)), \ if \exists \ c_1 > 0, \ c_2 > 0:c_1 * g(n) \leq f(n) \leq c_2 * g(n)\)
注:\(f(n) = \Theta (g(n)), \ if \ and \ only \ if \ f(n) = O(g(n)) \ and \ f(n) = \Omega (g(n))\)
2、复杂度函数的运算规则
- \(o(T_1(n) + T_2(n)) = max(O(T_1(n)), \ O(T_2(n)))\)
- 如果 \(T(n)\) 是阶数为 \(k\) 的任意多项式,则 \(O(T(n)) = O(n^k)\)
- \(O(T_1(n) * T_2(n)) = O(T_1(n)) * O(T_2(n))\)
- \(O(dominant \ terms \ + \ others) = O(dominant \ terms)\) (dominant terms:主项)
- \(O(T_1(n) - T_2(n)) = unknown\)
3、O 和 =
-
对多项式 \(f_1(n) = 3n^2 - 1000n + 25\),有 \(f_1(n) = O(n^2)\)
-
同样,对 \(f_2(n) = 2n^2 + 5\),有 \(f_2(n) = O(n^2)\)
然而,这是否意味着 \(f_1(n) = f_2(n)\) ? 答案显然是“否”
-
显然,如果 \(x = y\) 且 \(y = z\),则 \(x = z\)
-
对于用O表示的复杂度,结合律不成立,= 等价于 \(\in\)
4、O 表示中的常数
- 常系数无关紧要,可以丢弃
- 低阶项无关紧要,可以不要
- 以常数为底的对数函数中的常数指数也可以省略
- 能否去掉所有的指数? \(O(n) \equiv O(n^2)\) ? 显然不对!