也看了几天『算法』了,总是觉得不得要领,在此做一点笔记想必会有所帮助,能够完整地写下来或者清楚地讲述给别人并使之理解才算掌握了知识,这个观点来自费曼,我深以为然。
算法及其重要性
算法 被用来描述一种有限的、确定的、有效的并适合计算机程序来实现的解决问题的方法,它是计算机科学的基础,是这个领域研究的核心。『算法』在前言中就如此讲到:
算法和数据结构的学习的学习是所有计算机教学计划的基础。
我想算法的重要性已不言而喻,这也是我在此努力学习的原因,当然我不是计算机系的学生,但我深信一定程度上了解算法和其分析方法对我的专业学习和理解也很有帮助。
使用数据抽象开发可重用的算法
虽然我关心的是算法背后的逻辑,但是真正实现起来还是落在代码上,为了保证其可重用性,使用数据抽象,让我们更关注算法的内核,而不是具体的数据。按照下面的步骤解决问题:
- 定义 API
- 根据特定的应用场景开发用例代码
- 描述一种数据结构,并在 API 说对应的抽象数据类型的实现中根据它定义类的实例变量
- 描述算法
- 分析算法的性能特点
算法分析
诸如『我的算法会运行多久?』和『为什么我的程序耗尽了所有的内存』这样的基础问题,我们使用 科学方法 可以给出实际性的回答,如下所示,同时使用 数学分析 为算法建立模型,还可以使用 实验数据 验证模型。
- 细致的观察真实世界的特点
- 根据观察的结果提出假设模型
- 预测未来事件
- 继续观测并核实预测的准确性
- 如此反复直到确认预测和观察一致
进行实际分析之前,首先要确定 输入模型 和 问题的规模,其实就是说 输入数据量的大小 和 数据的特点 对运行时间的影响,显然运行时间会随着规模的增大而变长。
关于数学分析,依据 Knuth 的观点,程序运行的总时间主要与 执行每条语句的耗时 和 执行每条语句的频率有关。对于前者,这由机器决定,我们不关心,而后者由程序和输入决定,这正是我们要分析的。对于语句频率的分析我们会采用近似的方法,这由会得到 增长的数量级 这一概念,当输入规模很大时,这被验证是可行的,而我们正是关注算法处理大规模输入的性能。
增长的数量级概念的应用使我们能够 将程序和它实现的算法隔离开,算法和输入模型决定了增长的数量级。
使用 成本模型 评估算法的性质,该模型定义了算法中的基本操作,如数组的访问次数和元素的交换次数等等。在选定的数学模型下,我们或许可以用精确的数学语言说明算法的性质,这正是我们进行数学分析的目的。
以上我们可以得出分析程序运行时间数学模型的步骤如下:
- 确定输入模型下,定义问题的规模
- 识别内循环
- 根据内循环的操作确定成本模型
- 对于规定的输入,判断这些操作的执行频率