前言
本文主要内容:算法的重要性,普遍性以及算法的几个基本概念。
算法的重要性:
现在计算机的处理速度超级快,许多人认为算法的研究已经没有什么必要性。但是考虑下面两种情况:1.在拥有高效处理器的计算机上使用汇编语言编写插入排序,插入排序的运行时间为c1*n2,这里假设c1 = 2;2.在拥有低速处理器的计算机上使用低效编译器和高级语言编写合并排序算法,合并排序的运行时间为c2*nlogn,这里假设c2 = 50
假设输入规模为106。t1 = 2*(107)2/109 = 2*105
t2 = 50*(107)log107/107 = 350 * log10
得出 t1 > t2;
从而证明了算法的重要性。
算法的普遍性:
操作系统中的进程调度算法,计算机网络中的路由选择算法,人工智能算法等等。
下面介绍几个基本概念:
算法的输入规模:
视具体问题而定。如果是排序,那么输入规模则为输入序列的大小;如果是两整数相乘,则输入规模取决于两整数的位数;如果输入的是图结构,那么输入规模取决于图的顶点个数和边的个数。
算法的运行时间:
特定输入下,算法执行的步数。
循环不变式:用来验证算法的正确性。分为初始化,保持以及结束三个部分。
- 初始化:第一次迭代之前,验证算法的正确性
- 保持:如果某一次迭代正确,那么下一次迭代也必须正确
- 结束:最后一次迭代完成后,验证算法的正确性
与数学归纳法类似,先证明基本情况正确,然后假设前一次正确,然后证明后一次正确。但是数学归纳法中n可能是无限下去,而循环不变式则是有限的,因为迭代有限,否则是无限循环了。又与软件工程中的测试类似,不但要测试平时(循环不变式中的保持),而且要测试边界(循环不变式的初始化和结束)。
算法的分析:
分析基于的是通用单处理器和随机存储器,不涉及多处理器,并行算法,还有高级缓存,虚拟内存之类的。算法的分析结果是用时间复杂度表示 每一步执行所花时间*执行次数。然后累计每一步之和。会得到与输入规模有关的表达式。