文章目录
数据结构与算法—绪论
问题求解
- 编写计算机程序的目的?
—解决实际的应用问题 - 问题抽象
—分析和抽象任务需求,建立问题模型 - 数据抽象
—确定恰当的数据结构表示数学模型 - 算法抽象
—在数据模型的基础上设计合适的算法 - 数据结构+算法,进行程序设计
—模拟和解决实际问题
农夫过河
- 问题抽象: 人狼羊菜乘船过河
—只有人能撑船
—船只有两个位置(包括人)
—狼羊、羊菜不能在没有人时共处 - 数据抽象: 图模型
—不合理状态:狼羊、人菜、羊菜、人狼、狼羊菜、人
—顶点表示“原始状态”—10中(包括“空”)
—边:一次合理的渡河操作实现的状态转变 - 数据结构
—相邻矩阵 - 算法抽象
—最短路径
什么是数据结构
- 结构:实体+关系
- 数据结构:
- 按照逻辑关系组织起来的一批数据,
- 按一定的存储方法把它存储在计算机中
- 在这些数据上定义了一个运算的集合
数据结构的逻辑组织
- 线性结构
- 线性表(表,栈,队列,串等)
- 非线性结构
- 树(二叉树,Huffman树,二叉搜索树等)
- 图(有向图,无向图等)
- 图(树(二叉树(线性表)))
数据的存储结构
- 逻辑结构到物理存储空间的映射
计算机主存储器(内存) - 非负整数地址编码,相邻单元的集合
- 基本单位是字节
- 访问不同地址所需时间基本相同(即随机访问)
- 对逻辑结构(K,r),其中r属于R
- 对结点集K建立一个从K到存储器M的单元的映射:K->M,对于每一个结点(j属于K)都对应一个 唯一 的 连续存储 区域(c属于M)
- 关系元组((j1,j2)属于r)(其中(j1,j2属于K是结点))
- 顺序:存储单元的顺序地址
- 链接:指针的地址指向关系
- 四类: 顺序、链接、索引、散列
抽象数据类型
- 简称 ADT
- 定义了一组运算的数学模型
- 与物理存储结构无关
- 是软件系统建立在数据之上(面向对象)
- 模块化 的思想的发展
- 隐藏运算实现的细节和内部数据结构
- 软件复用
抽象数据类型ADT
- 抽象数据结构二元组
<数据对象D,数据操作P> - 先定义逻辑结构,再定义运算
- 逻辑结构: 数据对象及其关系
- 运算: 数据操作
例:栈的抽象数据类型ADT
- 逻辑结构:线性表
- 操作特点: 限制访问端口
- 只允许在一端进行插入,删除操作
- 入栈(push)、出栈(pop)、取栈顶(top)、判栈空(isEmpty)
//栈的模板类
template<class T>
class Stack
{
public: //栈的运算符
void clear(); //变为空栈
bool push(const T item); //item入栈,成功返回真,否则假
bool pop(T& item); //弹栈顶,成功为真
bool top(T& item); //读栈顶,成功为真
bool isEmpty(); //若栈空为真
bool isFull(); //若栈满为真
};
思考:关于抽象数据类型ADT
- 怎么体现逻辑结构?
- 抽象数据类型等价于类定义?
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程及设计技术。类的接口包括用户所能执行的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数
抽象数据类型是一个由对象以及对象上的操作组成的集合,对象和操作被捆绑为一个整体,可以从程序的一个部分传递到另一个部分。
分解和抽象可以使程序易于修改,以控制程序的复杂度,分解使程序具有结构,抽象则隐藏细节
- 不用模板来定义可以描述ADT吗?
算法
问题——算法——程序
目标:问题求解
- 问题 一个函数
- 从输入到输出的一种映射
- 算法 一种方法
- 对特定问题求解过程的描述,是指令的有限序列
- 程序
- 是算法在计算机程序设计语言中的实现
算法的特性
- 通用性
- 对参数化输入进行问题求解
- 保证计算结构的正确性
- 有效性
- 算法是有限条指令组成的指令序列
- 即由一系列具体步骤组成
- 确定性
- 算法描述中下一步应执行的步骤必须明确
- 有穷性
- 算法的执行必须在有限步内结束
- 换句话说,算法不能包含死循环
基本算法分类
- 穷举法
- 顺序找k值
- 回溯、搜索(能进就进,不能进就换,不能换就退(退到上次再换))
- 八皇后、树和图遍历
- 递归分治(最优子结构,子结构不能重复)
- 二分找K值、快速排序、归并排序
- 贪心法(最优子结构,贪心性质)
- Huffman编码树、最短路径Dijkstra算法、最小生成树Prim算法
- 动态规划(最优子结构,子结构重复,无后效性)
- 最短路Floyd算法