一.数据结构
目录
1.1 数据结构的定义及相关概念
要先了解数据结构,首先我们要先从以下几个定义开始学习:
1.数据:信息的载体,就是对客观事物的数和字符的集合。
2.数据元素:是构成数据的基本单位,一个数据元素是由若干个数据项构成。
3.数据项:数据项就是构成数据元素的单位,也是具有独立含义的数据最小单位。
(数据项构成数据元素,由数据元素构成数据。)
4.数据对象:是指性质相同的数据元素的集合。
由此我们可以引出数据结构的定义,
数据结构就是指所有数据元素以及数据元素之间的关系,可以看作相互之间存在着某种特定关系的数据元素的集合。
从数据结构的定义来看,数据结构 = 数据 + 结构 两部分组成。
数据结构通常分为以下几个部分:
数据的逻辑结构:由数据元素之间的逻辑关系构成。
数据的存储结构:数据元素及其关系在计算机存储器中的存储表示。
数据的运算:施加在该数据上的操作。
1.2 逻辑结构
逻辑结构的定义:
数据的逻辑结构是从数据元素的逻辑关系上描述数据的,是指数据元素之间的逻辑关系的整体,通常是从求解问题中提炼出来的。
逻辑结构的类型:
1.3 存储结构
存储结构的定义:
数据的逻辑结构在计算机中存储器中的存储表示称为数据的存储结构,也就是逻辑结构在计算机中的存储实现。
存储结构的的4种常用的存储类型:
1.4 数据运算
数据运算的定义:对数据进行操作。
最常用的数据运算:
查找,插入,删除,更新和排序等。数据运算最终在存储结构上用算法实现。
而运算的定义是基于逻辑结构的。
二.算法
2.1 算法定义
算法的定义:
是对特定序列问题求解步骤的一种描述。它是指令的有限序列。
2.2 算法的特性及其目标
五大特性:
1.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内完成。
2.确定性:是指算法执⾏的每⼀步骤在⼀定条件下只有⼀条执⾏路径,也就是相同输⼊只能有⼀个唯⼀的输出结果。
3.可行性:是指算法每⼀步骤都必须可⾏,能够通过有限的执⾏次数完成。
4.有输入:是指算法具有零个或多个输⼊。
5.有输出:是指算法⾄少有⼀个或多个输出。
五大目标:
1.正确性:要求算法能够正确的执行预先规定的功能和性能要求。(最重要的,最基本的标准)
2.可读性:算法应该易于使人理解,也就是可读性好
3.健壮性:要求算法具有较好的容错性,即提供异常处理
4.可使用性:要求算法能够很方便地使用。
5.高效率与低存储需求:即就是后面的时间复杂度和空间复杂度。
2.3 时间复杂度
算法的时间性能分析:
占用CPU时间的多少称为时间性能分析。
通常有两种衡量算法时间性能的算法:
1.事后统计法:编写算法对应的程序,统计其执行方法(与机器性能和编程的语言有关)
所以事后统计法并不是很公平。
2.事前估算法:抛开计算机硬件和软件相关的因素,仅考虑算法本身的效率高低。(大多数使用)
算法的时间复杂度的分析:
一、一个算法由控制结构(顺序,分支和循环三种)和原操作构成。而算法的执行时间就是取决于控制结构和原操作和综合效果。
二、时间复杂度O(n)表示:
1.一般会简化常熟项以及低阶的
2.多项相乘都保留
3.多项相加只保留最高项,且系数变为1
// 求两个 n 阶方阵 A,B 相加 C = A + B 的算法,计算其执行时间 T(n)
#define Max 20
void matrixadd(int n ,int A[Max][Max], int B[Max][Max], int C[Max][Max]){
int i,j;
for(i=0;i<n;i++) // 语句1:执行n+1次
for(j=0;j<n;j++) // 语句2:执行n(n+1)次
C[i][j] = A[i][j] + B[i][j]; // 语句3:执行n^2次
}
T(n)=语句1+语句2+语句3=n+1+n(n+1)+n^2=2n^2+2n+1----->O(n^2)
时间复杂度的数量级:(复杂度逐级递增)
- 常量阶
O(1)
- 对数阶
O(logn)
- 线性阶
O(n)
- 线性对数阶
O(nlogn)
- 平方阶
O(n^2)
,立方阶O(n^3)
...k次阶O(n^k)
- 指数阶
O(2^n)
- 阶乘阶
O(n!)
2.4 空间复杂度
算法的空间复杂度的定义:
是对一个算法在运行过程中临时占用的存储空间大小的量度。它是问题规模 n 的函数。记为: S(n) = O(g(n))。
一个程序在执行时除需要的存储空间来存放本身所用的指令,常数,变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。
算法原地工作是指算法所需辅助空间为常量,即O(1)。