算法
- 是指令的集合,是为解决特定问题而规定的一系列操作。
- 他明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据集合作为输出。
- 五个特征:
- 输入:一个算法应以待解决的问题的信息作为输入
- 输出:输出对应指令集处理后得到的信息。
- 可行性:算法是可行的,即算法阿忠的每一条指令都是可以实现的
- 无穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止
- 确定性:算法对于特定的合法输入,其对应的输出是唯一的
- 算法就是计算机解题的过程
评价算法的优劣
- 复杂度(时间复杂度,空间复杂度)
- 算法的复杂性体现了该算法的计算机所需资源的多少上,主要是时间和空间
- 时间复杂度:指执行算法所需要的计算工作量
- 空间复杂度:执行这个算法所需要的空间资源
时间复杂度
- 算法的时间复杂度是指执行算法所需要的计算工作量。计算机算法是问题规模n 的函数f(n),算法的时间复杂度因此记做T(n)=Ο(f(n))
- 因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关
- 时间复杂度就是时间频度去掉低阶项和首项常数。
- 一般讨论最坏时间复杂度
- T(n) = O(n2) O表示最坏情况
- T(n) = Ω(n2) Ω表示最好情况
- T(n) = Θ(n2) Θ表示最坏和最好一样的情况
// 一个简单语句的时间复杂度为O(1)
int count =0;
// 时间复杂度为T(n)=O(n^3)
f(n)=5x^3 + 4x^2 + x + 2
// 时间复杂度 O(n)
int n = 8, count = 0;
for(int i = 0; i < n, i++){
count++;
}
// 时间复杂度 O(log₂n)
int n = 8, count = 0;
for(int i = 1; i < n;i*=2){
count++;
}
// 时间复杂度 O(n²)
int n = 8, count = 0;
for(int i = 1; i < n;i++){
for(int j = 1; j < n; j++){
count++;
}
}
// 时间复杂度 O(n²)
int n = 8, count = 0;
for(int i = 1; i < n;i++){
for(int j = 1; j < i; j++){
count++;
}
}
// 时间复杂度 O(nlog₂n)
int n = 8, count = 0;
for(int i = 1; i < n;i*=2){
for(int j = 1; j < n; j++){
count++;
}
}
空间复杂度
- 算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
- S(n) = O(f(n))
- 递归算法,每次调用都要要分配空间,所以空间复杂度为S(n)=O(n)