指数
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∗