嵌入式团队培训_数据结构和算法概述

要求:理解并记忆即可,会求解算法的时间复杂度

总结:程序设计 = 数据结构 + 算法
解释:数据结构用于解决数据存储问题,而算法用于处理和分析数据。(目录,网页前进和后退)

一:数据结构

数据:所有能输入计算机中的符号。不仅仅包括我们平时用的整型,浮点型等,还有字符,声音,图片,视频(通过编码变成字符数据)等。

直白地理解,就是研究数据的逻辑关系与存储方式的一门学科。简单的分为:数据的逻辑结构(逻辑关系)和
物理结构
。它是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作(CRUD)。

大一下考试内容:记住即可

1.逻辑结构:

数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系。

数据之间的逻辑关系可简单的分为三类:

  • 一对一 (线性结构,串)
  • 一对多 (层次结构 树)
  • 多对多 (图)

2.物理结构

指的是数据在计算机存储器中的存放方式(例如:内存中),可以选择集中存放,还是分散存放。

具体表现:顺序存储(地址连续)和链式存储(指针表示逻辑关系)。

3.抽象数据类型

抽象数据类型ADT:一个数学模型及定义在该模型上的一组操作。(说白了,就是个说明书)
之后讲解的一系列数据结构都是抽象数据类型。

二:算法

算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。在计算机中,算法是指解决方案的准确而完整的描述。

当解决问题时,首先心中要有解决问题的算法,围绕算法编写出程序代码。

所以程序设计 = 数据结构 + 算法

大一下考试内容:记住即可

1.算法的五个基本特征:

  1. 输入
    输入的参数,个数(>=0),例如:直接打印,就无参数传入。
  2. 输出
    输出和返回值,个数(>0),必须要有输出,至少要有个打印。
  3. 有穷性
    有限的执行步骤之后,不会出现无限循环,在有限时间内完成。
  4. 确定性
    每一步都必须具有具体的含义,不会出现二义性。
  5. 可行性
    刚才讲了要在有限时间内完成,即每一步是可行的,每一步都是有限时间的。(所以整体在有限时间内完成)

2.算法设计的要求

  1. 正确性(略):得到问题正确答案(废话)
  2. 可读性:便于程序员之间阅读,理解,交流,有助于人们理解算法,易修改调试。例如:注释
  3. 健壮性:对输入数据(参数)进行合法性校验。当输入数据不合法时,算法也会进行相关的处理,而不是出现异常。
  4. 尽量满足时间效率高和存储量低的需求(时间复杂度和空间复杂度低

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)) */
    }

}
循环嵌套
思考:下列代码的时间复杂度是?
(1int i,j;
for(i = 0; i < n; i++) {
    
    for(j = i; j < n; j++) {  /* 注意这里j=i */
     /* ......(里面是O(1)) */
    }

}2int 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;
发布了47 篇原创文章 · 获赞 18 · 访问量 4855

猜你喜欢

转载自blog.csdn.net/qq_43605085/article/details/103015404
今日推荐