算法是什么?
算法是描述求解问题方法的步骤集合,可以以多种形式表现。它是指令的有限序列,其中每一条指令表示一个或多个操作。此外,一个算法还有下列五个重要特性:
- 有穷性
- 算法应该包含有限的操作步骤,一个算法在执行若干个步骤后应该能够结束。算法每一步都应该在有限的时间内完成。
- 确定性
- 算法中的每一步都必须有确切的含义,不能存在二义性
- 可行性
- 算法的每一个步骤都应该能有效的执行,并得到确定的结果
- 输入
- 算法必须要有输入,所谓输入,是指在算法执行时,从外界取得必要的数据。计算机运行程序的目的就是数据的处理,多数情况下这些数据需要输入得到。所以,一个算法可以有 0 个或多个输入。
- 输出
- 算法必须要有输出,一个算法有一个或多个输出,这是算法处理数据后的结果。没有输出的算法都将变得毫无意义。
算法设计
算法设计的好坏关系到程序的执行效率,算法设计必须满足以下要求:
- 正确性
- 算法对于一切合法的输入数据都能得到满足要求的结果,它是正确的。事实上,因为合法的输入数据量太大,用枚举法验证不太现实。所以,算法的正确性指的是:算法达到了我们的测试要求,而不是所有的数据都有验证。
- 可读性
- 人们对算法阅读理解的难易程度,可读性高的算法易于阅读,便于交流
- 健壮性
- 对于非法的输入数据,算法能给出相应的响应而不是产生不可预料的后果。
- 效率与低存储量需求
- 效率指的是算法的执行时间,执行的时间越少,效率越高
- 算法的存储量越少越好
算法的时间复杂度
算法的时间复杂度通常用算法中语句的执行次数来度量一个算法的效率
for(i=0;i< n;i++)次数:n + 1
for (j=0;j<n;j++)次数:n2 + n
{
c[i][j]=0; 次数:n2
for (k=0;k< n; k++) 次数:n3 + n2
c[i][j]=c[i][j]+a[i][k]*b[k][j]; 次数:n3
}
所有执行语句的总执行次数为 Tn=2n3 + 3n2 + 2n + 1
算法分析
时间复杂度是以问题规模 n 自变量总执行次数的式子。我们是以它的数量级 O(n3) 作为它的时间复杂度。
下列列举出三种计算时间复杂度的情况:
- count++;
- 只执行一次,没有循环,它的时间复杂度是 O(1),称之为常量阶的时间复杂度。
- for (let i = 1; i < n; i++)
-> count++;- 执行一重循环,它的时间复杂度是 O(n),这是一种线性阶的时间复杂度,也就是随着 n 的增长一次幂的增长。
- for (let i = 1; i < n; i++)
->for (let i = 1; i < n; i++)
->->count++;- 两重循环,O(n3)
算法的分析就是看它的时间复杂度是高还是低。如果时间复杂度高,那么它的效率就低,反之就高。我们需要的是它的执行次数越少越好,所以时间复杂度越低越好。
常见的时间复杂度:
O(1)常数阶、O(n)线性阶、O(n2)平方阶、O(2n)指数阶、O(log2n)对数阶与O(nlog2n)。时间复杂度从小到大排列:
log2n | n | nlog2n | n2 | n3 | 2n |
---|---|---|---|---|---|
0 | 1 | 0 | 1 | 1 | 2 |
1 | 2 | 2 | 4 | 8 | 4 |
2 | 4 | 8 | 16 | 64 | 16 |
3 | 8 | 24 | 64 | 512 | 256 |
4 | 16 | 64 | 256 | 5096 | 65536 |
5 | 32 | 160 | 1024 | 32768 | 2147483648 |
尽量避免 2n 次方的产生
算法空间复杂度
算法空间复杂度是以辅助空间作为度量,空间复杂度是作为算法所需空间存储复杂度作为度量。讲通透就是硬件。一般不讨论算法空间复杂度的分析。除非你穷...