目录
一、问题
- 算法是什么?
- 算法有什么特性?
- 算法设计有什么要求?
- 如何衡量一个算法的好坏?
二、算法的定义
算法是求解特定问题的求解步骤的描述,在计算机中表现为指令的有序序列,每条指令表示一个或多个操作步骤。
三、算法的特性
- 输入输出:一定有一个或多个输入,一定有一个或多个输出。
- 有穷性:指执行的步骤是有限的,不出现无限循环的情况。
- 确定性:指每个步骤是明确的。
- 可行性:指每一步都可以通过执行有限的步数完成。
四、算法设计的要求
表现在4个层次:
1)无语法错误
2)对于合法的输入数据能得到满足要求的输出结果。
3)对于非法的输入数据能得到满足规格说明的结果。
4)对于精心挑选的、甚至刁难的输出数据能得出正确的输出结果。
- 正确性 : 指算法至少应该具有输入、输出、加工处理无歧义性,能正确的反应问题的需求,能得到问题的正确答案。
- 可读性:指便于阅读、理解、交流。
- 健壮性:当输入数据不合法时,能够正常处理,不产生异常或莫名其妙的结果。
- 时间效率高存储量低:用时最短,用内存最少。
五、算法效率的度量方法
5.1 事后统计方法
通过设计好的测试程序和数据,通过计算机计时器对不同算法的运行时间进行比较,从而确定算法的好坏。
5.2 事前统计方法
在编程前,依据统计方法对算法进行估算。
算法运行时间取决于以下因素:
- 算法采用的策略方法
- 编译产生的代码质量
- 问题的输入规模
- 机器指令的执行速度
六、函数的渐进增长
七、算法时间复杂度
7.1 算法时间复杂度的定义
这里可以理解为:其他条件都一样,仅仅对算法的语句执行次数进行判断,次数越多,算法复杂度越高。
这里用大O来体现算法复杂度的计法称之为大O计法。
7.2 推导大O阶的方法
- 用常数1取代运行时间中所有的加法常数项。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不为1,则去除与这个最高阶项相乘的常数。
7.3 常见的时间复杂度
7.3.1 常数阶
一般顺序结构的算法时间复杂度为常数阶。例如这里的执行次数 f(n) = 3; 记作 O(1).
注意:常数阶的意义是指执行次数恒定的算法,不会随n的变化而变化,不论是1次、还是3次,或者其他次数,都记作O(1)。
7.3.2 线性阶
时间复杂度为: O(n)
7.3.3 对数阶
7.3.4 平方阶
八、算法空间复杂度
九、总结
- 算法的定义:解决某个问题的步骤的描述,在计算机中表现为指令的有限序列,每个指令表示一个或多个操作。
- 算法的特性:有输入输出,有穷性,确定性,可执行性。(这里更多的偏向于描述方法)
- 算法设计的要求:正确性,可读性,健壮性,时间效率高存储量低。(这里更多的偏向于描述程序)
- 算法度量方法:事后统计法(不科学) 事前估算法。
- 大O阶推导方法:执行次数函数的所有加法常数用1取代;只保留最高阶项;去掉与最高阶项相乘的常数。
- 常见的时间复杂度排列:
算法运行时间取决于以下因素:
- 算法采用的策略方法
- 编译产生的代码质量
- 问题的输入规模
- 机器指令的执行速度