嵌入式团队培训_数据结构与算法概述
要求:理解并记忆即可,会求解算法的时间复杂度
总结:程序设计 = 数据结构 + 算法
解释:数据结构用于解决数据存储问题,而算法用于处理和分析数据。(目录,网页前进和后退)
一:数据结构
数据:所有能输入计算机中的符号。不仅仅包括我们平时用的整型,浮点型等,还有字符,声音,图片,视频(通过编码变成字符数据)等。
直白地理解,就是研究数据的逻辑关系与存储方式的一门学科。简单的分为:数据的逻辑结构(逻辑关系)和
物理结构。它是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作(CRUD)。
大一下考试内容:记住即可
1.逻辑结构:
数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系。
数据之间的逻辑关系可简单的分为三类:
- 一对一 (线性结构,串)
- 一对多 (层次结构 树)
- 多对多 (图)
2.物理结构
指的是数据在计算机存储器中的存放方式(例如:内存中),可以选择集中存放,还是分散存放。
具体表现:顺序存储(地址连续)和链式存储(指针表示逻辑关系)。
3.抽象数据类型
抽象数据类型ADT:一个数学模型及定义在该模型上的一组操作。(说白了,就是个说明书)
之后讲解的一系列数据结构都是抽象数据类型。
二:算法
算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。在计算机中,算法是指解决方案的准确而完整的描述。
当解决问题时,首先心中要有解决问题的算法,围绕算法编写出程序代码。
所以程序设计 = 数据结构 + 算法
大一下考试内容:记住即可
1.算法的五个基本特征:
- 输入
输入的参数,个数(>=0),例如:直接打印,就无参数传入。 - 输出
输出和返回值,个数(>0),必须要有输出,至少要有个打印。 - 有穷性
有限的执行步骤之后,不会出现无限循环,在有限时间内完成。 - 确定性
每一步都必须具有具体的含义,不会出现二义性。 - 可行性
刚才讲了要在有限时间内完成,即每一步是可行的,每一步都是有限时间的。(所以整体在有限时间内完成)
2.算法设计的要求
- 正确性(略):得到问题正确答案(废话)
- 可读性:便于程序员之间阅读,理解,交流,有助于人们理解算法,易修改调试。例如:注释
- 健壮性:对输入数据(参数)进行合法性校验。当输入数据不合法时,算法也会进行相关的处理,而不是出现异常。
- 尽量满足时间效率高和存储量低的需求(时间复杂度和空间复杂度低)
3.时间、空间复杂度
(1)事后统计方法:(略)
通过设计好的测试程序(test)和数据,然后进行运行时间比较,从而才确定效率。
(2)事前估计估算方法
在编程前,依据统计方法对算法进行估算。
(3)时间、空间复杂度
算法的时间复杂度,主要看算法中使用到的循环结构中代码循环的次数(称为“频度”)。次数越少,算法的时间复杂度越低。
设问题输入的数据规模为n
a) ++x; s=0;
b) for (int i = 1; i <= n ; i++) { ++x; s += x; }
c) for (int i = 1; i <= n; i++) {
for (int j = 1; i <= n; j++) { ++x; s += x; }
}
频度f(n) 分别为 1、n、n^2。
算法的时间复杂度,算法的时间度量,记住:T(n) = O(f(n))
a 的时间复杂度为O(1),b 的时间复杂度为O(n),c 的时间复杂度为为O(n^2)。
如果把a、b、c三个例子组成一段程序,那么算法的时间复杂度为O(n^2 + n + 1 )。
但这么表示是不对的,还需要对n^2 + n + 1进行简化。
简化的过程总结为3步:
1. 去掉运行时间中的所有加法常数。(例如 n^2+n+1,直接变为 n^2+n)
2. 只保留最高项。(例如 n^2+n 变成 n^2)
3. 如果最高项存在但是系数不是1,去掉系数。(例如 n^2 系数为 1)
所以,最终a、b和c合并而成的代码的时间复杂度为O(n^2)。
常数阶:O(1)(单纯的分支结构也是执行一次)
int sum = 0,n = 100; /* 执行一次 */
sum = (1 + n) * n/2; /* 执行一次 */
printf("%d", sum); /* 执行一次 */
if(sum == 0) { /* 执行一次 */
printf("%d", sum);
} else {
printf("-1");
}
线性阶:O(n)(循环结构)
int i;
for (i = 0; i < n; i++) { /* 执行n次 */
/* ......(里面是O(1)) */
}
对数阶:O(logn)(迭代)
int count = 1;
while (count < n) {
//2^x=n x=logn
count = count * 2;
/* ......(里面是O(1)) */
}
平方(次方)阶:O(n^2),O(n^3)....
int i,j;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
/* ......(里面是O(1)) */
}
}
循环嵌套
思考:下列代码的时间复杂度是?
(1)
int i,j;
for(i = 0; i < n; i++) {
for(j = i; j < n; j++) { /* 注意这里j=i */
/* ......(里面是O(1)) */
}
}
(2)
int n;
void function (int count) {
int j;
for(j = count; j< n; j++) {
/* ......(里面是O(1)) */
}
}
---------------------------------
n++;
int i,j;
function(n);
for(i = 0; i < n; i++) {
for(j = i; j < n; j++) { /* 注意这里j=i */
/* ......(里面是O(1)) */
}
}
三、作业
1、下面程序段的时间复杂度是( )
s = 0;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
s += B[i][j];
sum = s;
2、下面程序段的时间复杂度是( )
for(i=0; i<n; i++)
for(j=0; j<m; j++)
A[i][j] = 0;
3、下面程序段的时间复杂度是( )
i=1;
while(i<=n)
i = i*3;