数据结构与算法##1.绪论
教程来源于mooc 数据结构与算法
文章目录
1.问题的抽象
编写计算机程序的目的是解决实际的应用问题
任务需求 -> 问题模型
数据结构 -> 数学模型
设计算法
数据结构+算法 = 程序设计
农夫过河问题–最短路径问题
问题抽象:抽象出几个约束条件
数据抽象:图模型
数据结构:相邻矩阵
算法:最短路径
2.数据结构
结构 = 实体 + 关系
数据结构是按照逻辑关系组织起来的一批数据,按一定的存储方法把它存储在计算机中,在这些数据上定义了一个运算的集合。
图 -> 树 -> 二叉树 -> 线性表
表,栈,队列,串,二叉树,Huffaman树,有向图,无向图
2.1存储结构
逻辑结构到物理存储空间的映射
计算机主存储器(内存) 非负整数地址编码,相邻单元的集合,基本单位是字节,随机访问(到不同地址花费时间相同)
对每个逻辑结构都建立一个唯一的连续存储区域
顺序、链接、索引、散列
2.2抽象数据类型ADT
数学模型,与物理存储结构无关,不关心存储细节,实现面向对象
隐藏运算实现的细节和内部数据结构,实现软件复用
结构二元组: <数据对象D,数据操作P>
逻辑结构+运算
e.g. 栈:线性表+限制访问端口
可以用不同模板来描述ADT
3.算法
3.1 定义
算法是对特定问题求解过程的描述,是指令的有限序列。
程序是算法在计算机程序设计语言中的实现。
3.2 算法的特性
- 通用性:对参数化输入进行问题求解,保证计算结果的正确性
- 有效性:有限条指令,又一系列步骤组成
- 确定性:步骤没有歧义
- 有穷性:有限步内结束
3.3 算法的分类
- 穷举法 顺序找k值
- 回溯、搜索
- 递归分治 二分法找K值
- 贪心法
- 动态规划
3.4 算法的复杂性分析
大O表示法
存在c和n0,对任意n>n0,有f(n)<=c*g(n)
则f(n)=O(g(n))
表示函数增长率的下限
单位时间:
- 简单的布尔或算数运算
- 简单I/O
- 函数返回
加法规则:只看大的那个
乘法规则:全部保留
大Ω表示法
存在c和n0,对任意n>n0,有f(n)>=c*g(n)
则f(n)=Ω(g(n))
表示增长率下界
最要要有最紧下限
大Θ表示法
顺序找k值 O(n)
二分法找k值 O(logn)
空间和时间复杂度一般相互制衡
数据结构和算法的选择
- 仔细分析所要解决的问题 数据结构的初步设计往往先于算法设计
- 注意数据结构的可扩展性 考虑当输入数据的规模发生改变时,数据结构是否能够适应求解问题的演变和扩展