X A X B = X A + B X^{A}X^{B}=X^{A+B} XAXB=XA+B
X A X B = X A − B \frac{X^{A}}{X^{B}}=X^{A-B} XBXA=XA−B
( X A ) B = X A B (X^{A})^{B}=X^{AB} (XA)B=XAB
X N + X N = 2 X N ≠ X 2 N {X^N}+{X^N}=2{X^N} \neq X^{2N} XN+XN=2XN=X2N
2 N + 2 N = 2 N + 1 2^N+2^N=2^{N+1} 2N+2N=2N+1
定义: X A = B X^A=B XA=B,当且仅当 l o g X B = A log_XB=A logXB=A
l o g A B = l o g C B l o g C A log_AB=\frac{log_CB}{log_CA} logAB=logCAlogCB
∑ i = 0 N 2 i = 2 N + 1 − 1 ⇒ ∑ i = 0 N A i = A N + 1 − 1 A − 1 \sum_{i=0}^{N}2^i=2^{N+1}-1\Rightarrow\sum_{i=0}^{N}A^i=\frac{A^{N+1}-1}{A-1} i=0∑N2i=2N+1−1⇒i=0∑NAi=A−1AN+1−1
∑ i = 1 N i = N ( N + 1 ) 2 ≈ N 2 2 \sum_{i=1}^Ni=\frac {N(N+1)}{2}\approx \frac{N^2}{2} i=1∑Ni=2N(N+1)≈2N2
∑ i = 1 N i 2 = N ( N + 1 ) ( 2 N + 1 ) 6 ≈ N 3 3 \sum_{i=1}^Ni^2=\frac {N(N+1)(2N+1)}{6}\approx \frac{N^3}{3} i=1∑Ni2=6N(N+1)(2N+1)≈3N3
∑ i = 1 N i k ≈ N k + 1 ∣ k + 1 ∣ \sum_{i=1}^Ni^k\approx \frac{N^{k+1}}{|k+1|} i=1∑Nik≈∣k+1∣Nk+1
如果N整除A和B,那么则说A和B模N同余(congruent),计为 A ≡ B ( m o d N ) A \equiv B(mod N) A≡B(modN),例如 81 ≡ 61 ( m o d 10 ) 81 \equiv 61(mod10) 81≡61(mod10)。性质:若 A ≡ B ( m o d N ) A \equiv B(mod N) A≡B(modN),则 A + C ≡ B + C ( m o d N ) A+C \equiv B+C(mod N) A+C≡B+C(modN), A C ≡ B C ( m o d N ) AC \equiv BC(mod N) AC≡BC(modN)。
定义1:如果 ∃ c , ∃ n 0 \exists c,\exists n_0 ∃c,∃n0使得当 N ≥ n 0 N \geq n_0 N≥n0时, T ( N ) ≤ c f ( N ) T(N) \leq cf(N) T(N)≤cf(N),则记为 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))。念成“大O ⋯ ⋯ \cdots\cdots ⋯⋯”。
定义2:如果 ∃ c , ∃ n 0 \exists c,\exists n_0 ∃c,∃n0使得当 N ≥ n 0 N \geq n_0 N≥n0时, T ( N ) ≥ c g ( N ) T(N) \geq cg(N) T(N)≥cg(N),则记为 T ( N ) = Ω ( g ( N ) ) T(N)=\Omega (g(N)) T(N)=Ω(g(N))。念成“omega ⋯ ⋯ \cdots\cdots ⋯⋯”。
定义3: T ( N ) = Θ ( h ( N ) ) T(N)=\Theta (h(N)) T(N)=Θ(h(N))当且仅当 T ( N ) = O ( h ( N ) ) T(N)=O(h(N)) T(N)=O(h(N))和 T ( N ) = Ω ( h ( N ) ) T(N)=\Omega (h(N)) T(N)=Ω(h(N))。念成“theta ⋯ ⋯ \cdots\cdots ⋯⋯ ”
定义4:如果 T ( N ) = O ( p ( N ) ) T(N)=O(p(N)) T(N)=O(p(N))且 T ( N ) ≠ Θ ( p ( N ) ) T(N)\neq \Theta (p(N)) T(N)=Θ(p(N)),则 T ( N ) = o ( p ( N ) ) T(N)=o(p(N)) T(N)=o(p(N))。念成“小o ⋯ ⋯ \cdots\cdots ⋯⋯ ”。
用传统的不等式来计算增长率,则定义1表示T(N)的增长率小于等于 ( ≤ ) (\leq) (≤)f(N)的增长率;定义2表示表示T(N)的增长率大于等于 ( ≥ ) (\geq) (≥)g(N)的增长率;定义3表示表示T(N)的增长率等于 ( = ) (=) (=)h(N)的增长率;定义2表示表示T(N)的增长率小于 ( < ) (<) (<)p(N)的增长率。当我们说 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N)),我们是在保证T(N)以不快于f(N)的速度增长,因此 O O O表示一个上界, Ω \Omega Ω表示一个下届。
法则1:
如果 T 1 ( N ) = O ( f ( N ) ) T_1(N)=O(f(N)) T1(N)=O(f(N))且 T 2 ( N ) = O ( g ( N ) ) T_2(N)=O(g(N)) T2(N)=O(g(N)),那么
T 1 ( N ) + T 2 ( N ) = m a x ( O ( f ( N ) ) , O ( g ( N ) ) ) T_1(N)+T_2(N)=max(O(f(N)),O(g(N))) T1(N)+T2(N)=max(O(f(N)),O(g(N)))
T 1 ( N ) ∗ T 2 ( N ) = O ( O ( f ( N ) ) ∗ O ( g ( N ) ) ) T_1(N)*T_2(N)=O(O(f(N))*O(g(N))) T1(N)∗T2(N)=O(O(f(N))∗O(g(N)))
法则2:如果T(N)是一个k次多项式,则 T ( N ) = Θ ( N k ) T(N)= \Theta (N^k) T(N)=Θ(Nk)。
法则3: ∀ 常 数 k \forall 常数k ∀常数k, l o g k N = O ( N ) log^kN=O(N) logkN=O(N),这说明对数增长很缓慢。
常见函数增长率排序:
函 数 名 称 c 常 数 级 l o g N 对 数 级 l o g 2 N 对 数 平 方 级 别 N 线 性 级 N l o g N N 2 平 方 级 N 3 立 方 级 2 N 指 数 级 \begin{array}{|c|c|} \hline 函数 & 名称 \\ \hline c & 常数级\\ \hline logN & 对数级\\ \hline log^2N & 对数平方级别\\ \hline N & 线性级\\ \hline NlogN\\ \hline N^2 & 平方级\\ \hline N^3 & 立方级\\ \hline 2^N & 指数级\\ \hline \end{array} 函数clogNlog2NNNlogNN2N32N名称常数级对数级对数平方级别线性级平方级立方级指数级
以简化分析,一般约定:不存在特定的时间单位 ,抛弃一些常数系数和低阶项,从而要做的是计算大O运行时间(即上界)。程序可以提前结束,但是绝不可以拖后。
一个简单的例子,计算 ∑ i = 1 N i 3 \sum_{i=1}^Ni^3 ∑i=1Ni3的程序片段:
Sum(int N){
int i,PartialSum;
/*1*/ PartialSum=0;
/*2*/ for(i=0;i<N;i++)
/*3*/ PartialSum += i*i*i;
/*4*/ return PartialSum;
}
函数变量声明不计算时间,第1行和第4行各占一个单元时间。第3行每执行一次占用四个单元的时间(3个乘法运算1个加法运算)。第3行的i初始化占一个时间单位,测试N+1个单位,自增N个单位。因此,总的时间开销是6N+4,则说该函数是O(N)。
假设每一个程序段都像上述来分析是不明智的,于是得到一些一般法则:
法则1:FOR循环
一次for循环的运行时间至多是循环内部语句时间乘以迭代次数。
法则2:嵌套的FOR循环
有里向外分析,在一组嵌套循环语句内部语句时间乘以该组for循环的大小。
for(i=0;i<N;i++)
for(j=0;j<N;j++)
语句;
上述程序段的运行时间就为 O ( N 2 ) O(N^2) O(N2)
法则3:顺序语句
将各个语句的运行时间一次求和即可,意味着其中的最大值就是运行的时间。
for(i=0;i<N;i++)
语句;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
语句;
上述程序端的运行时间 O ( N ) + O ( N 2 ) O(N)+O(N^2) O(N)+O(N2),抛去低阶项,则程序的运行时间为 O ( N 2 ) O(N^2) O(N2)
法则4:IF/ELSE语句
if中的判断时间开销,if中的执行语句开销,else中的执行语句开销,这个时间开销估计会过高,但绝不会过低。
等比数列( a n = a 1 ⋅ q ( n − 1 ) a_n=a_1\cdot q^{\left(n-1\right)} an=a1⋅q(n−1))求和公式:
S n = n × a 1 ( q = 1 ) S_n=n\times a_1\quad (q=1) Sn=n×a1(q=1)
S n = a 1 ⋅ 1 − q n 1 − q = a 1 − a n ⋅ q 1 − q ( q ≠ 1 ) S_n=a_1\cdot \frac{1-q_n}{1-q}=\frac{a_1-a_n\cdot q}{1-q} \quad (q\neq1) Sn=a1⋅1−q1−qn=1−qa1−an⋅q(q=1)
等差数列( a n = a 1 + ( n − 1 ) d a_n=a_1+(n-1)d an=a1+(n−1)d)求和公式:
S n = n a 1 + n ( n − 1 ) 2 d = 1 2 n ( a 1 + a n ) , n ∈ N ∗ S_n=na_1+\frac{n(n-1)}{2}d=\frac{1}{2}n(a_1+a_n),n\in N^* Sn=na1+2n(n−1)d=21n(a1+an),n∈N∗