目录
一、数据结构概述
二、线性表
三、栈
四、队列
五、串
六、树
七、图
八、查找
数据结构根据视点不同,有逻辑结构和物理结构之分
逻辑结构用来描述数据元素之间的逻辑关系
物理结构是面向计算机的,它的目标是将数据元素及其他们之间的逻辑关系存储到计算机的内存中
逻辑结构
集合、线性、树形、图形
物理结构
顺序存储
物理存储
顺序存储结构 把数据元素存放在地址连续的存储单元里,能够反映其逻辑关系
就像排队占位,大家按顺序排好,谁也别插队
物理存储结构 把数据元素存放在任意的存储单元里,可以连续也可以不连续,不能反映数据元素之间的逻辑关系
就像排队系统,叫号,不用排队
存储结构——线性表
线性表{a1,a2,……,an},每个元素的类型均为DataType,除第一个元素a1以外,每个元素有且只有一个前驱,除最后一个元素an以外,每个元素有且只有一个后继,数据元素之间的逻辑关系是一对一的关系
线性表的顺序存储结构(数组)
插入和删除需要移动大量的元素
占用一段连续的内存
线性表的链式存储结构(单链表、静态链表、循环链表、双向链表)
充分利用碎片内存空间
元素的个数不受限制
插入和删除快
查找慢
静态链表 用数组描述的链表叫做静态链表
循环链表 (单循环链表)将单链表中终端节点的指针由空指针改为指向头结点,就使整个单链表形成一个环。这种头尾相接的单链表称为单循环链表,简称循环链表
双向链表 在单链表的每个节点中,再设置一个指向其前驱节点的指针域,克服了单链表的单向性。
栈是限定仅在表尾进行插入和删除的线性表
后进先出 比如浏览器的回退功能,Word中的撤销
栈的插入操作 入栈push 栈的删除操作 出栈pop
两栈共享空间
栈也有顺序存储和链式存储两种结构
栈的应用:递归,斐波那契数列、后缀表示法、逆波兰表示法、n的阶乘、n的K次幂、字符串逆转、进制转换、括号匹配、表达式求值
队列是只允许在一段进行插入操作、而在另一端进行删除操作的线性表、
队列是先进先出 例如键盘输入到显示器显示
队列 入队 往后追加
队列 出队 在队头 下标为0的位置,后面所有的元素均要移动
队列会有假溢出的问题(顺序存储结构)
循环队列,头尾相接,可以解决假溢出
串
ASCII码 2^7=128 扩展 2^8 = 256位 Unicode 码 2^16。为了和ASCII码兼容,Unicode的前256个字符与ASCII码完全相同
串的逻辑结构和线性表相似,但对于基本操作有较大差别,线性表更关注单个元素的位置,比如查找一个元素、插入删除一个元素。串更关注查找子串位置,得到指定位置子串,替换子串等操作
串的顺序存储结构 一般用定长数组的来定义
串的模式匹配 IndexOf String类
KMP模式算法
KMP模式算法是在文本串txt中查找子串pat(模式串),如果找到了,返回这个子串的起始索引,否则返回-1
KMP算法永不回退模式串指针i,不走回头路,不会重新扫描txt
简单来说:KMP算法仅后移模式串,比较指针不回溯,求next数组
树
子树一定不相交
节点拥有的子树称为度 度为0的节点称为叶节点
树的深度 有几层
线性结构和树结构比较
线性结构:第一个元素无前驱,最后一个元素无后继,中间元素,一个前驱,一个后继
树结构:根结点无双亲且唯一,叶结点无孩子且可以有多个,中间结点一个双亲,多个孩子
二叉树 每个节点最后只有两个子树
特殊二叉树:斜树、满二叉树、完全二叉树,满二叉树一定是完全二叉树
二叉树的性质
二叉树的遍历
中序遍历 左 根 右
前序遍历 根 左 右
后序遍历 左 右 根
层序遍历
树转二叉树:3步,加线、去线、调整
森林转二叉树
二叉树转树
最基本的压缩编码方法:赫夫曼编码
赫夫曼树(最优二叉树),构建最优二叉树
图
在生活中,图有什么用?帮助我们 用最少的成本(最省时和省钱)全国旅行
图的表示G(V,E)V定点集合,E中边集合
图就是由一些小圆点(顶点)和连接这些小圆点的直线(边)组成
无向图&有向图
连通图&非连通图
图的存储结构 :图的邻接矩阵 用两个数组来表示,一个一维数组记录顶点,一个二维数组记录边
图的遍历(就是要访问所有的结点):深度优先遍历DFS和广度优先遍历BFS
DFS的主要思想:
1.首先以一个未被访问的顶点作为起始点,沿当前顶点的边走到未被访问过的顶点
2.当没有未被访问过的顶点时,则回到上一个顶点,继续探测别的顶点,直到所有的顶点都被访问过
最小生成树 构造连通网的最小代价生成式成为最小生成树
两种经典算法:普利姆算法Prim和克鲁斯卡尔算法Kruskal
普利姆算法:以某顶点为起点,逐步找各项顶点上最小权值的边来构建最小生成树
克鲁斯卡尔算法:以边为目标
最短路径 相对于两个结点而言的
迪杰斯特拉算法Dijkstra
弗洛伊德算法Floyd
查找
根据给定的某个值,在查找表中确定一个某关键字等于给定值的数据元素(或记录)
静态查找表:只做作查找操作的查找表
动态查找表:在查找过程中同时插入查找表中不存在的数据元素或者从查找表中删除已经存在的某个数据元素
从逻辑上说,查找所基于的数据结构是集合,集合中的数据元素没有本质关系,可是要想获得较高的查找性能,我们就不得不改变这种数据结构,在存储时可以将查找集合组合成表、树等结构
静态查找表-->顺序表查找
有序表查找-->折半查找(二分查找)、插值查找、斐波那契查找
索引查找 按时间先后存储
二叉排序树(二叉查找树)
可以是空树,也可以是具有以下性质的树
1.若它的左子树不空,则左子树上的所有节点的值均 小于它的根结点的值
2.若它的右子树不空,则右子树上的所有节点的值均 大于它的根结点的值
3.它的左右子树也分别为二叉排序树
构建一棵二叉排序树,其目的不是为了排序,而是为了提高查找和插入、删除关键字的速度
不管怎么说,在一个有序数据集上的查找,速度总是快于无序的数据集,且二叉排序树这种非线性结构,也有利于插入和删除操作
平衡二叉树AVL 是一种二叉排序树 它是一颗空树或者它的左右两个子树的高度差的绝对值不超过1.并且左右两个子树都是一颗平衡二叉树
平衡因子 某结点的左子树与右子树的高度(深度)差为该节点的平衡因子,即AVL的平衡因子只有可能是-1,0,1
多路查找树 2-3树,2-3-4树,B树,B+树