1. 数据结构
数据的逻辑结构,存储结构及操作(数据的运算)
1.1 数据
数据:不只是一个单纯的数值,而是类似于一个集合的概念
数据元素:是数据的基本单位,由若干个基本项组成
数据项:是数据的最小单位,描述数据元素的信息
注意:节点就是数据元素
整个表为数据,每一行为数据元素,单个编号等信息为数据项
struct student
{
float weight;
float height;
int age;
};
int main(int argc, char const *argv[])
{
struct student t1; // 数据元素/结点
t1.weight = 123.6; // 数据项
struct student stu_arr_23061[49]; // 数据对象
return 0;
}
示例:
思考:这里的数据元素、数据项以及数据对象都是什么呢?
数据元素:从第二行开始每一行就是一个数据元素。
数据项:对于某数据元素来说,它的编号、书名、作者以及出版社等为数据项。
数据对象:该表格除去第一行结构体定义外,剩下的整体就相当于一个结构体数组。
1.2 逻辑结构
数据之间的逻辑规律和数据之间的关系
数据之间的关系:
1)线性关系 ----》 线性结构 ------》一对一 ------》线性表
2)层次关系 ------》树形结构 ---------》一对多 ---------》 树
3)网状关系 -------》 图状结构 --------》 多对多 ----------》 图
1.3 存储结构
数据结构的逻辑结构在计算机中的具体实现
1.3.1 顺序存储结构
数组:在内存当中一段连续的内存空间中保存数据(如c语言中的一维数组)
1.3.2 链式存储结构
特点:数据在内存中是不连续的,通过指针进行连接
struct Node
{
int data; // 数据域
struct Node *next; // 指针域(指向和自身结构体类型一样的、逻辑上的下一个结点
};
// 定义四个节点 ABCD
struct Node A = {1, NULL};
struct Node B = {2, NULL};
struct Node C = {3, NULL};
struct Node D = {4, NULL};
// 用指针链接ABCD
A.next = &B;
B.next = &C;
C.next = &D;
1.3.3 索引存储结构
提高查找速度
索引表 + 数据文件
查找一个人的电话就可以先查索引表,再查相应的数据文件,加快了查询速度。
特点:
- 检索速度快。
- 多了一张索引表,故占用内存多。
- 删除数据文件时要及时更改索引表。
1.3.4 散列存储结构
数据在存储的时候与关键码之间存在某种对应关系
存的时候按照对应关系存
取的时候按照对应关系取
2. 算法
解决问题的思想方法
软件 = 程序 + 文档
程序 = 数据结构 + 算法
软件 = 数据结构 + 算法 + 文档
算法 = 对结点集合的运算和操作 + 控制结构
2.1 算法与程序
算法:解决问题的思想方法
程序:用计算机语言对算法的具体实现
2.2 算法与数据结构
算法 + 数据结构 = 程序
算法的设计:取决于选定的逻辑结构
算法的实现:依赖于采用的存储结构(顺序、链式)
2.3 算法的特性
1)有穷性:算法的执行步骤是有限的
2)确定性:算法的每一步都是有明确含义的
3)可行性:算法能够在有限的时间内完成
4)输入
5)输出
2.4 评价算法好坏
正确性:保证算法可以正确完成功能
易读性:容易被解读
健壮性:容错处理
高效性: 执行效率,算法执行快慢容易受到计算机性能的影响,不可以作为评判 算法高效性的标准,这通过可执行语句重复执行次数来衡量算法是否高 效。(时间复杂度)
低存储型:占用空间小(空间复杂度)
2.5 时间复杂度
算法的可执行语句重复执行的次数
通常时间复杂度用一个问题规模函数来表达
T(n) = O(f(n))
T(n) //问题规模的时间函数
n 问题规模
O //时间数量级
f(n) //算法的可执行语句重复执行的次数 用问题规模n的某个函数f(n)来表达
计算大O的方法
1) 根据问题规模n写出表达式f(n)
2) 只保留最高项,其他项舍去
3) 系数化为1
4) 如果只有常数项,将其置为1