数据结构与算法绪论文字笔记

数据结构与算法—绪论

问题求解

  • 编写计算机程序的目的?
    —解决实际的应用问题
  • 问题抽象
    —分析和抽象任务需求,建立问题模型
  • 数据抽象
    —确定恰当的数据结构表示数学模型
  • 算法抽象
    —在数据模型的基础上设计合适的算法
  • 数据结构+算法,进行程序设计
    —模拟和解决实际问题

农夫过河

  • 问题抽象: 人狼羊菜乘船过河
    —只有人能撑船
    —船只有两个位置(包括人)
    —狼羊、羊菜不能在没有人时共处
  • 数据抽象: 图模型
    —不合理状态:狼羊、人菜、羊菜、人狼、狼羊菜、人
    —顶点表示“原始状态”—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算法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值