1.1 使用计算机求解问题
1.1.1 开发(设计、编写)一个程序,通常是为了解决一类问题,程序每次执行时能够解决该问题的一个实例。
1.1.2 程序的开发过程:
-
需求分析(深入分析情况和细节,得到一个尽可能严格表述的问题表述)
-
数据组织和算法设计
-
编码
-
检查编译
-
调试测试(关键在于设计一套出色的测试用例)
-
维护
1.2 算法和算法设计
1.2.1 问题是需要解决的一类具体需求,而问题实例是所属问题的一个具体例子。算法则是解决问题的计算过程的严格描述,是一系列解决问题的清晰指令。程序则是算法的实现。
1.2.2 算法的性质:
-
有穷性(算法描述应该由有限条指令或语句组成)
-
能行性(能够被设计成为具体的机械计算过程)
-
确定性(对于一个给定的初始数据,将产生一个唯一的确定的数据或输出结果)
-
终止性(算法产生的动作序列是有穷的)
-
输入输出(有明确的输入和输出)
1.2.3 算法的描述:采用自然语言描述、采用严格的形式化计发描述、采用伪代码描述。
1.2.4 常见的算法设计模式:
- 枚举法(利用计算机的速度优势)
- 贪心法(首先尽可能做出部分解,再逐步扩充得到完整解)
- 分治法(将复杂问题分解为相对简单的子问题,分而治之再组合)
- 回溯法(逐步探索所有可能的选择和步骤,一旦遇到无法前进则退回到前面的步骤,这一过程称为回溯)
- 动态规划法(在前面的步骤中收集信息,在后续步骤中动态选择最好的路径)
- 分支界限法(在不断搜索过程中将无用的选择不断删除)
1.2.5 算法的设计要求:正确性、可读性、健壮性、高效率与低存储量
1.3 算法代价和度量分析
1.3.1 在具体算法中,以其计数数值作为空间开销的基本度量,以其执行次数作为时间开销的基本度量。
1.3.2 代价分析分为事前分析(复杂度分析)和事后分析(测量执行时间和空间开销)。
1.3.3 复杂度分析的"大O记法":对于单调的整数函数 f ( n ) f(n) f(n),如果存在一个整数函数 g ( n ) g(n) g(n)和常数 c > 0 c>0 c>0,使得对于充分大的n总有 f ( n ) < = c × g ( n ) f(n)<=c \times g(n) f(n)<=c×g(n),就说函数 g ( n ) g(n) g(n)是 f ( n ) f(n) f(n)的一个渐近函数(忽略常量因子),记为 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n))。
1.3.4 常用复杂度:常量复杂度: O ( 1 ) O(1) O(1)、 O ( l o g n ) O(log n) O(logn)、 O ( n ) O(n) O(n)、 O ( n l o g n ) O(n logn) O(nlogn)、 O ( n 2 ) O(n^{2}) O(n2)、 O ( 2 n ) O(2^{n}) O(2n)
![](https://i-blog.csdnimg.cn/blog_migrate/392b2846f1dac6890844c455a6f37c4f.jpeg)
1.4 数据结构
1.4.1 一个具体的数据结构可以表达为一个二元组 D = ( E , R ) D=(E,R) D=(E,R), D D D是某个数据集合的一个有穷子集,而 R ∈ E × E R\in E \times E R∈E×E 表示元素之间的某种关系。数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系。
1.4.2 逻辑结构,数据之间的相互关系:
- 集合 结构中的数据元素除了同属于一种类型外,别无其它关系
- 线性结构 数据元素之间一对一的关系
- 树形结构 数据元素之间一对多的关系
- 图状结构或网状结构 结构中的数据元素之间存在多对多的关系
1.4.3 物理结构(存储结构),数据在计算机中的表示:
- 顺序结构
- 链式结构
- 索引结构
- 哈希结构
1.4.3 数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。