一、数据结构与算法的概念
1、数据结构
描述从现实抽象 数据模型,即数据关系的抽象
(1)逻辑结构:数据之间的逻辑关系
a.表、队列、栈:线性结构 一一对应
b、树: 非线性结构 1对多
c、图: 非线性结构 多对多
(2)存储结构:对数据以及 数据关系的存储
连续存储:将所有数据放在一起 数组
离散存储:数据可能分布在内存的不同位置
2、算法
不是简单的数值操作 而是一些逻辑操作 , 对数的操作
增:增加数据
删:删除数据
改:修改数据
查:查找 遍历数据
算法就是对某个动作的操作流程或步骤
(1)算法的特性:
a、可行性
b、确定性
c、有穷性
d、有一个或多个输入
e、有一个或多个输出
(2)算法优劣评判:
时间复杂度:语句执行的频度 与算法程序的时间没有必然关系
执行的频度:算法中语句执行的次数 与 输入问题规模的 比值
度量一个算法的时间复杂度 通常使用 量级表示
(3)常见时间复杂度 量级
最好 O(1)常量级 算法语句对的执行次数与输入问题规模无关
较好 O(log n)对数级
O(n)线性级
一般 O(n*log n)
较差 O(n^2) 平方级
O(2^n) 指数级
差 O(n!) 阶乘级
(4)空间复杂度:占用内存的多少
二、常见的数据结构———表
表(线性结构): 数据是连续排列的
每个节点(除头尾),都有且只有一个前驱 和后继节点
头节点 只有后继
尾节点 只有前驱
节点:数据逻辑的最小单元
c语言的 数组就是表结构
存储结构
顺序存储 :数组存储
顺序表:存储时 连续存储,逻辑是表结构
离散存储:链式存储
链表:存储使用 离散存储,逻辑上是表结构
对表的一些操作:
增:增加节点,插入数据
删:删除节点
改:修改数据
查:查询/遍历数据
链表与顺序表的优劣:
链表:
链表根据节点长度动态分配,没有长度限制
链表的插入和删除节点,时间复杂度比顺序表优秀 不会存在大片数据整体移动
顺序表:
存储密度高 不会有指针域浪费空间
顺序表的随机访问效率高
三、常见的数据结构——队列
队列是一种特殊的线性表,规定了表的入口和出口 同时 先进先出(多用于 缓冲)
队列的实现:
顺序存储的队列:循环队列
离散存储的队列:链式队列、
循环队列的一些操作:
1. 创建空队列
2. 销毁队列
3. 入队
4. 出队
5. 置空队列
6. 判空判满
7. 获得队列长度
四、常见的数据结构——栈
栈是 一种特殊 的 线性表,
只能在栈的 一端 进行插入和删除 ,且 后进先出
顺序栈 : 数组 从数组尾部进行插入和删除
链式栈 : 链表 从头部插入和删除
4种类型的栈:
增栈 : 入栈时 栈顶指针 向大地址方向移动
减栈 : 入栈时 栈顶指针 向小地址方向移动
空栈 : 栈顶指针 指向的位置数据 无效(空)
满栈 : 栈顶指针 指向的位置数据 有效(满)
五、常见的数据结构——树
1、树的定义
一个节点 有0个或多个 直接后继 节点 ,有1个(子节点)或 0个(根节点) 直接前驱 ,不能有环结构。
根节点: 树的起始位置 一棵树 一定有根节点
子节点: 树结构中 除根节点外 其他节点都称作子节点
叶子节点: 特殊的子节点, 没有后继的 子节点
树的度: 以树中 直接后继最多的节点 个数 称该树的 度
树的深度: 从根开始 到每一个叶子节点 最长的经过的节点 个数 即树的层数
树的路径: 从根节点开始 到目标节点 经过的节点顺序
子树: 一颗树 中的 一部分节点 构成的一颗 树 称该树是 其子树
2、二叉树
(1)二叉树的定义
二叉树是n(n≥0)个节点的有限集合,它或者是空集(n=0),或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。
二叉树与普通有序树不同,二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。
简单来说就是:a. 二叉树 有0个或1个或2个 直接后继节点 且 严格区分左右
b.一个二叉树 其 子树 也一定是二叉树
(2)二叉树的一些特性:
1.在二叉树的第i层上至多有2的i-1次方个结点 2^(i-1)
2.深度为k的二叉树至多有2的k次方-1个结点 2^k -1
3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点n2,那么n0=n2+1
叶子节点的 个数 始终比 度为2的节点个数多 1个
4.具有n个结点的完全二叉树的深度为 = (log2n)+1 取整数
第n号节点 是 (log2n)+1 取整 行
5.对一棵有n个结点的完全二叉树的结点按层序编号(从第一层到最后一层,每层从左至右),
对任一结点i(1<i<n)有:
a.如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点i/2 取整;
b.如果2i>n,则结点i无左孩子(即为叶子结点);否则其左孩子结点是2i;(偶数个结点,最后一个叶子结点一定是左)
c.如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1;(奇数个结点,最后一个叶子结点一定是右)
(3)二叉树的特例
a.满二叉树: 除叶子节点外 其他有所节点 都有两个 直接后继 且 叶子节点都在最后一层
b.完全二叉树: 只有最下面两层有度数小于2的节点,且最下面一层的叶节点集中在最左边的若干位置上。
除最底层 没有排满外 其他层 均 排满 且 每一层都需要按照先左后右的顺序排列
c.带权二叉树:二叉树的 路径上 带有 权值
(4)二叉树的遍历:
a层次遍历
b深度遍历
先序遍历: 先根 后左右
中序遍历: 先左 后根右
后序遍历·: 先左 后右根
先序遍历或后序遍历可以确定根节点
先序遍历第一个就是根节点
后序遍历最后一个为根节点
中序遍历 可以确定左右子树
六、常见的数据结构——图
1、定义
图是一种比表更复杂的数据结构 ,图有多个直接前驱,