第1章 绪论
1.1 计算机与算法
1.1.1 冒泡排序
时间复杂度,用大O记号: T ( n ) = O ( n 2 ) T(n) = O(n^2) T(n)=O(n2)
void bubblesort1A(){
bool sorted = false;
while(!sorted){
sorted = true;
for (int i = 1; i < n; i++){
if (A[i-1] > A[i]){
swap(A[i - 1],A[i]);
sorted = false;
}
}
n--;
}
}
1.1.2 算法
算法是指基于特定的计算模型,旨在解决某一信息处理问题而设计的一个指令序列。算法应该具备:输入与输出,基本操作、确定性与可行性,难解性,计算效率,数据结构。
1.2 复杂度度量
时间复杂度
T
(
n
)
T(n)
T(n),选用所有可能中执行时间最长者。
渐进复杂度:大
O
O
O记号,大
Ω
\Omega
Ω记号,大
Θ
\Theta
Θ记号,表示时,常数项和低次项可以省略。
1.3复杂度分析
下列复杂度函数渐进增长。
O
(
log
(
n
)
)
、
O
(
n
)
、
O
(
n
)
、
O
(
n
log
(
n
)
)
、
O
(
n
2
)
、
O
(
n
3
)
、
O
(
2
n
)
O(\log(n))、O(\sqrt{n})、O(n)、O(n\log(n))、O(n^2)、O(n^3)、O(2^n)
O(log(n))、O(n)、O(n)、O(nlog(n))、O(n2)、O(n3)、O(2n)
1.4 递归
1.4.1 线性递归
数组求和,效果不好,蛮力递归
int sum(int A[], int n){
if (1 > n){
return 0;
}
else
return sum(A,n-1) + A[n - 1];
}
数组交换
void reverse(int* A, int lo, int hi){
if (lo < hi){
swap(A[lo],A[li]);
reverse(A, lo + 1,hi - 1);
}
}
//用while可以替代递归
void reverse(int* A, int lo, int hi){
while (lo < hi)
swap(A[lo++],A[hi--])
}
求
2
n
2^n
2n可以体现算法的优化。
p
o
w
e
r
2
(
n
k
)
=
{
power
2
(
n
k
−
1
)
∧
2
×
2
(
b
k
=
1
)
power
2
(
n
k
−
1
)
∧
2
(
b
k
=
1
)
power2\left(n_{k}\right)=\left\{\begin{array}{l}{\text { power } 2\left(n_{k-1}\right)^{\wedge} 2 \times 2}\quad(b_k = 1)\\ {\text { power } 2\left(n_{k-1}\right)^{\wedge} 2} \quad \quad (b_k = 1) \end{array}\right.
power2(nk)={ power 2(nk−1)∧2×2(bk=1) power 2(nk−1)∧2(bk=1)
正常情况下
//O(n)
int power2(n){
if (n == 0)
return 1;
else
return power2(n-1)*2;
}
//O(r) O(log n)
inline int sqr(a){return a * a}
int power2(int n){
if (0 == n) return 1;
return (n & 1) ? sqr(power2(n >> 1)) <<1 : sqr(power2(n >> 1));
}
1.4.2 二分递归
数组求和可以将原来数组一分为二
int sum(int A[], int lo, int hi){
if (lo == hi)
return A[lo];
else{
int mi = (lo + hi) >> 1;
return sum(A, lo, mi) + sum(A, mi + 1, hi);
}
}
//O(logn)
斐波那契数列
见https://blog.csdn.net/shinef/article/details/93620991