===day1
【1】 数据结构
数据结构: 其实就是数据对应的逻辑结构、存储结构、操作;
数据结构指的是数据元素及数据元素之间的相互关系,或组织数据的形式。
数组 a[]在内存中是连续的;
未解决数据存在的弊端,搞出来了链式存储;
数据结构,划分成3个方面: 逻辑结构、存储结构、运算(操作);
a. 逻辑结构:
=> 线性结构: 是一对一的关系;
特性:首元素,没有前驱,但有唯一的后继;
中间元素,唯一的前驱和唯一的后继;
尾元素,唯一的前驱,但没有后继
(线性表)
=> 非线性结构: 是一对多或多对多;
树、图
b. 存储结构:
存储结构其实就是逻辑结构的具体实现;
=> 一种顺序存储(数组),
=> 另外一种是不连续(链表),链式存储;
=> 索引存储方法、
=> 散列(哈希HASH)存储方法。
c. 数据的运算:检索、排序、插入、删除、修改等
【2】
数据(Data):
数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。
数据元素(Data Element):
数据元素是数据的基本单位,又称之为记录(Record)。
一般,数据元素由若干基本项(或称字段、域、属性)组成。
数据类型(Data Type):
数据类型是对数据元素取值范围与运算的限定。
【3】算法(算法工程师)
PID
卡尔曼滤波
...
对于普通工程师来说需要做的是算法的移植;
陀螺仪 (MPU6050 ,MMA8451..):
三轴加速度(x,y,z)
概念:
算法(Algorithm)是一个有穷规则(或语句、指令)的有序集合。
算法的特性:
(1) 有穷性 —— 算法执行的步骤(或规则)是有限的;
(2) 确定性 —— 每个计算步骤无二义性; if else
(3) 可行性 —— 每个计算步骤能够在有限的时间内完成;
(4) 输入 —— 算法有零个或多个外部输入;(输入规模)
(5) 输出 —— 算法有一个或多个输出。
算法好坏的方法:
1. 时间复杂度
不是考量算法执行了多长时间,而是看算法中间执行的次数;
for(i = 0;i < n ;i++) // n
{
for(j = 0; j < n;j++) //(n-1)* n
{
printf("hello world.\n"); // n*n
}
}
n + (n-1)*n + n*n = 2n^2
时间复杂度 n^2
3n^2 + 4n^3 + 2n + 5 ?
时间复杂度为 n^3
2. 空间复杂度
3. 算法的健壮性
要求算法是比较稳定的;
4. 容易理解、容易编程和调试、容易维护。
【4】
数据结构 + 算法 = 程序
【5】
线性结构:
线性表 : 顺序存储、链式存储
-
线性表的顺序存储:
顺序存储的劣势:
a. 存储数据个数是有限的;
b. 增加数据或删除数据的时候,要大浮度的移动数据;
顺序存储的优势:
根据数据下标能快速的访问到对应的元素;顺序存储在内存中是连续的;(数组)
顺序表代码实现:
1. 构建模型(struct list)
struct list{
int data[N];
int last;
};
2. 创建一个空的顺序表;
(struct list *)malloc(sizeof(struct list))
last = -1;
3. 插入数据(尾插法)
插入数据前判断表是否已满
如果不满则可以插入;
找到最后一个元素下标;
将下标+1(last+1);
data[last] = x;
4. 判断表是否已满
last >= N - 1 为满
5. 遍历
6. 按位置来插入数据
seqlist_insert_pos(L,pos,value);
7. 删除数据
a. 按位置删
b. 按值删
先假设这个表里面数据没有重复的元素
c. 尾删
d. 头删
8. 查找
a. 按位置查找;
b. 按值查找;
9. 修改数据
a. 按位置修改
b. 根据值(old)来修改新(new)的值
作业:
1. 删除表中重复数据,只保留一个;
2. 合并两个表的数据;
先将L1表,置成有序表(从小到大)
L1 , L2,
将L2表中数据,按数据大小插入;
L1 4 5 8 9 9 6 8 7 4 7
L2 3 1 2 0
=> 0 1 2 3 4 5 6 7 8 9
3. 制作一个菜单选项:
===============================================
1. insert 2. find 3. del 4. updata 5. 退出
===============================================
strcmp( quit);
4. 预习链式存储
=================================================================