数据结构与算法:
数据结构:描述从现实中抽象出数据模型 (数据抽象)
逻辑结构:数据之间的逻辑关系
线性结构: 表,队列,栈: 数据之间是线性关系 且 一 一对应
非线性结构: 树:一对多
图:多对多
存储结构:对数据以及数据关系的一种存储结构
连续存储:将所有的数据放到一起 (例如:数组)
离散存储:数据可能分布在内存的不同位置
算法(对数据的操作):对完成某个动作所需的操作流程或步骤(是多逻辑进行操作,而不是简单的数值操作)
增:增加数据
删:删除数据
改:修改数据
查:查找或遍历数据
算法特性:
1.可行性(可以实现,每个步骤能够在有限时间内完成)
2确定性(没有歧义,步骤唯一且确定)
3.有穷性(步骤是有限的)
4.有一个或多个输入和输出
求1+..+n的和的方法
1.for循环
2.等差数列求和
算法优劣评判标准:
时间复杂度(T):语句执行的频度 与算法程序执行的时间 没有必然关系
执行的频度:算法中 语句执行的次数 与 输入问题规模的比值
度量一个算法的时间复杂度 通常使用其量级(O表示)
常见的时间复杂度的量级:
最好的
O(1) 常量级 算法语句执行次数 与 输入问题规模 无关
较好
O(log n) 对数级
O(n) 线性级
一般
O(n*log n)
较差
O(n^2) 平方级
差 O(2^n) 次方级
O(n!) 阶乘级
空间复杂度:占用内存的多少
例如求杨辉三角:第i行 j 列的值(从0开始)
可用:A(i,j)=i!/(j!*(i-j)!)
常见数据结构:
1.表结构:数据逻辑组织为表形式,逻辑上,数据是连续排列的,每个节点(出头尾外),都有且仅有一个前驱和一个后继;
头节点 只有后继,没有前驱;尾结点 只有前驱,没有后继;
节点:数据逻辑的最小单元
例如:C语言中的数组
存储结构:
顺序存储:数组存储
顺序表:存储上连续存储.逻辑上是表结构
离散存储:链式存储
链表:存储上离散存储,逻辑上是表结构
顺序表的操作:
创建表-销毁表-增删改(修改节点值,排序)查(遍历)
链表:表的离散存储
逻辑结构(表结构) 通过指针方式实现逻辑上的链接
链表中的一些情况的表示:
链表尾部节点的表示: 指针域==NULL
空链表 表示: 使用一个不存储数据的节点 作为头结点,当头节点的指针域为空时表示空链表.
链表与顺序表的 优劣:
链表根据节点长度动态分配,没有 长度限制
链表的 插入和删除 节点,时间复杂度比顺序表优秀,不会存在大片数据整体移动的情况
顺序表的存储密度高 不会有指针域 (空间翻倍)
顺序表的随机访问效率高
链表的应用:
约瑟夫环问题
遍历链表 while(p->next!=NULL)p=p->next;
静态链表:链表的节点 事先以及开辟(节点数组),动态下标或指针域 来 建立逻辑关系
缺点:长度事先固定
队列:是一种特殊的线性表 (先进先出),规定了 表的入口和出口 (多用于缓冲)
队列的实现:
顺序存储的队列: 循环队列
离散存储的队列: 链式队列
离散方法的链式队列:双向循环链表循环队列
栈:特殊的线性表,只能在表的一端 进行插入和删除
顺序栈:例如:数组 从数组尾部进行插入和删除
链式栈:例如:链表 从头部插入和删除
4种类型的栈:
增栈:入栈时,栈顶指针向大地址方向移动
减栈:入栈时,栈顶指针向小地址方向移动
空栈:栈顶指针指向的位置数据无效(空)
满栈:栈顶指针指向的位置数据有效(满)
树:一个节点 有0个或多个直接后继 节点,有一个(子节点)或 0个(根节点) 直接前驱
典型树结构:目录结构
根节点: 树的起始位置
子节点:除根节点以外的其他节点都称为子节点
叶子点:特殊的子节点,没有后继
树的度:以树中直接后继最多的节点个数称为该数的度
树的深度:从根开始,到每一个叶子结点,经过的最长的节点个数,即树的深度
树的路径:从根节点开始到目标节点,所经过的节点顺序
子树:一颗树中的一部分节点构成的一棵树,称为该该树的子树
二叉树:度为2的数
1.二叉树 有(0,1,2)个直接后继节点 且严格区分左右
2.二叉树的子树也一定是二叉树
特殊的二叉树:
1.满二叉树: 每一层的每个节点 都有两个直接后继 且叶子节点都位于最后一层
2.完全二叉树: 最后一层从左到右依次排序,且没有排满
二叉树的存储:
顺序存储:将二叉树补全为完全二叉树,按从左到右,从上到下,依次进行编号,这个标号即为数组的下标.
二叉树的遍历:
深度遍历:先序遍历(左-根-右),中序遍历(根-左-右),后续遍历(左-右-根)
层次遍历
广度遍历
图: 网结构,是一种比表更复杂的数据结构,有多个直接前驱 和多个 直接后继
顶点: 图中 存储数据的节点
边/弧: 顶点与顶点间的关系 没有方向称边 有方向称弧
边/弧的权值: 从一个顶点到另一个顶点的代价
子图: 图中的一部分节点以及这些节点的边
路径:从一个顶点到另一个顶点所经过的边
简单路径:路径中所经过的顶点没有重复的
图的存储:
顺序存储:节点(数组) 边(邻接矩阵)
缺点:内存消耗较多
离散存储:邻接链表
稠密图: 边较多
稀疏图: 边较少
完全图: 边=n(n-1)
图-解决实际问题:
寻路算法:最短路径