数据结构
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、绪论
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、线性表
三、栈、队列和数组
3.1 栈
3.1.1 栈的基本概念
1、栈的定义
只能在一端进行插入删除的线性表结构。
2、栈的基本操作
3.1.2 栈的顺序存储结构
1、顺序栈的实现
连续的存储单元+top指针。
2、顺序栈的基本运算
(1)初始化
(2)判栈空
(3)进栈
(4)出栈
(5)读栈顶元素
3、共享栈
3.1.3 栈的链式存储结构
规定链栈没有头节点,在表头进行所有操作。
3.2 队列
3.2.1 队列的基本概念
1、队列的定义
2、队列常见的基本操作
3.2.2 队列的顺序存储结构
1、队列的顺序存储
一块连续空间+队头指针front+队尾指针rear,默认front指向队头元素,rear指向队尾元素的下一个位置。
2、循环队列
循环队列的出现是为了解决不能用MAXSIZE判断栈满的问题。
判断队空队满的三种方式
(1)牺牲一个单元。入队的时候少用一个单元,当队头front处于队尾指针的下一个位置就表示队满了。
(2)增加一个Q.size
(3)
3、循环队列的操作
(1)初始化
(2)判队空
(3)入队
(4)出队
3.2.4 队列的链式存储结构
1、队列的链式存储
同时带有队头指针和队尾指针的单链表。
不带头节点的链式队列,需要频繁移动front指针,故一般采用带头节点的单链表。
链式队列没有队满溢出的问题。
2、链式队列的基本操作
(1)初始化
建立头结点并初始为空。
(2)判队空
front和rear是否相等。
(3)入队
申请结点==》给结点赋值,结点下一位置空==》插入链表==》修改rear指针
(4)出队
判断是否队空==》新增指针P指向front下一个元素==》保存值==》修改front指针==》如果P指针和rear相等,说明这是最后一个结点,删除完队空了==》free
3.2.4 双端队列
用前端和后端来区分
3.3 栈和队列的应用
3.3.1 栈在括号匹配中的应用
需要有匹配的[()],否则算匹配失败,左括号入栈,遇到右括号就出栈。
3.3.2 栈在表达式求值中的应用
3.3.3 栈在递归中的应用
3.3.4 队列在层次遍历中的应用
3.3.5 队列在计算机系统中的应用
1、主机与外设之间速度不匹配的问题
2、多用户引起的资源竞争问题
3.4 数组和特殊矩阵
3.4.1 数组的定义
3.4.2 数组的存储结构
一个数组的所有元素在内存中占有一段连续的存储空间。
多维数组可以按行优先和列优先存储。
行优先公式:
列优先公式:
3.4.3 特殊矩阵的压缩存储
压缩存储:指相同元素只分配一个存储空间,零元素不分配。
特殊矩阵:对称矩阵、上下三角矩阵、对角矩阵。
1、对称矩阵
对于数组B[k],有
2.三角矩阵
上三角矩阵同理。
3、三对角矩阵
3.4.4 稀疏矩阵
指含零元素较多且零元素分布没有规律的矩阵。可以用三元组(行标,列标,值)和十字链表存储。
四、串
4.1 *串的定义和实现
4.2 串的模式匹配
串的模式匹配指的是子串的定位操作,求的是子串(模式串)在主串中的位置。
4.2.1 简单模式匹配算法
每次匹配失败,都从主串的下一个位置开始比对,
最坏的情况是每次都匹配到子串的最后一个位置才失败。
4.2.2 串的模式匹配算法–KMP算法
next算法
4.2.3 KMP算法的进一步优化
nextval算法
五、树与二叉树
5.1 树的基本概念
5.1.1 树的定义
(1)可以为空树
5.1.2 基本术语
(1)祖先、双亲、兄弟
(2)树的度是树中度的最大值
(3)度大于0的结点是分支结点(非终端结点),度等于0的结点是叶结点(终端节点)
(4)高度和深度结果一样,方向不同
(5)有序树是各子树从左到右是有次序的,变动后会变成不同的树。
(6)路径是两个结点之间所经过的结点序列构成的;路径长度是经过的边的个数。
5.1.3树的性质
5.2 二叉树的概念
5.2.1 二叉树的定义及其主要特性
1、二叉树的定义
2、几个特殊的二叉树
(1)满二叉树
①树中只有度为0和度为2的结点
②
(2)完全二叉树
①叶结点只可能在层次最大的两层出现。
②只可能有一个度为1的结点。
(3)二叉排序树
关键字:左《根《右。
(4)平衡二叉树
任意结点左右子树深度之差不超过1。
3、二叉树的性质
(1)n0=n2+1;
(2)
5.2.2 二叉树的存储结构
1、顺序存储结构
2、链式存储结构
5.3 二叉树的遍历和线索二叉树
5.3.1 二叉树的遍历
1、先序遍历
根左右
2、中序遍历
左根右
3、后序遍历
左右根
4、递归算法和非递归算法
5、层次遍历
6、由遍历序列构造二叉树
先序/后序/层序+中序=唯一的二叉树
5.3.2 线索二叉树
1、线索二叉树的基本概念
来源:因为传统的二叉链表存储时为了保持父子关系,需要用很多空指针来占位,这就导致了资源浪费,线索二叉树可以把这些空指针利用起来,让左指针指向前驱,右指针指向后继。
tips:在有n个结点的二叉树中,有n+1个空指针。
2、中序线索二叉树的构造
tips:可以增加一个头结点建立一个双向线索链表。主要变动有
(1)头结点的左孩子指针指向根节点
(2)第一个结点的左孩子指向头结点
(3)最后一个结点的右孩子指向头结点
3、中序线索二叉树的遍历
4、先序线索二叉树和后序线索二叉树
5.4 树、森林
5.4.1 树的存储结构
1、双亲表示法
需要一片连续的存储空间,可以根据每个元素的parent找到双亲,但是找孩子需要遍历整个表。
2、孩子表示法
3、孩子兄弟表示法
二叉树表示法,每个结点有三个部分,左边指向自己的第一个孩子(左孩子),右指针指向自己的兄弟。
找双亲很麻烦,但可以设置一个parent域指向父节点。
5.4.2 树、森林与二叉树的转换
1、树转二叉树的规则:左孩子右兄弟
2、森林转二叉树
3、二叉树转森林
参考上图
5.4.3树和森林的遍历
1、树的遍历
(1)先根遍历
(2)后根遍历
(3)参差遍历
2、森林的遍历
(1)先序遍历森林
(2)中序遍历森林(从左至右访问孩子结点,最后访问根结点)
3、总结
5.5 树与二叉树的应用
5.5.1 哈夫曼树和哈夫曼编码
1、哈夫曼树的定义
权
结点的带权路径长度
树的带权路径长度
哈夫曼树:在一个带权的树里,带权路径长度(WPL)最小的树,也叫最优二叉树。
2、哈夫曼树的构造
(1)构造过程
(2)哈夫曼树的特点
3、哈夫曼编码
固定长度编码
可变长度编码
前缀编码–没有编码是另一个编码的前缀。
字符出现的频率作为权值,每个字符必须在叶结点位置,否则不唯一。
5.5.2 并查集
六、图
6.1 图的基本概念
6.1.1 图的定义
1、有向图
2、无向图
3、简单图、多重图
4、完全图(简单完全图)
任意两个顶点之间都存在直接相连的边。
5、子图
6、连通、连通图和连通分量
连通:有路径存在即可;
连通图:任意两顶点都是连通的(都存在路径),否则为非连通图;
连通分量:无向图中的极大连通子图。
关于边的考察:
(1)假设一个图有N个顶点,若边数小于n-1,此图必是非连通图。
(2)如果是非连通图,最多可以有多少条边?
(3)如果是连通图,最少可以有多少条边?n-1条
7、强连通图、强连通分量
强连通:两个顶点之间有路径;
强连通图:任何一对顶点之间都有路径;
强连通分量:有向图的极大强连通子图。
8、生成树、生成森林
生成树:包含顶点集中的所有结点并且不产生回路的极小连通图。
一个图的生成树并不唯一。
生成森林:是相对于非连通图的概念。
9、顶点的度、入度、出度
10、边的权和网
权值:图中的边上标的数值;
带权图也叫网;
11、稠密图、稀疏图
12、路径、路径长度、回路
路径:
路径长度:路径上边的数目;
回路:
13、简单路径、简单回路
简单路径:顶点不重复出现的路径;
简单回路:出来第一个和最后一个顶点外,其余顶点不重复出现的回路。
14、距离
15、有向树
6.2 图的存储及基本操作
6.2.1 邻接矩阵法
1、无向图采用邻接矩阵存储,计算度时只看行或者列就行。有向图需要把行和列相加。
2、适用于稠密图
3、
6.2.2 邻接表法
1、适用于稀疏图
2、给每个结点建立一个单链表,分顶点表和边表(对于有向图是出边表)。
3、
6.2.3 十字链表法
1、有向图
2、不唯一
3、找A结点的出度就沿着绿色区域找。找A结点的入度就沿着橙色区域找。
4、空间复杂度(V+E)
6.2.4 邻接多重表
6.2.5 图的基本操作
6.3 图的遍历
6.3.1 广度优先搜索
采用邻接表存储进行广度优先搜索的序列不唯一。
6.3.2 深度优先遍历
6.3.3 图的遍历和图的连通性
6.4 图的应用
6.4.1 最小生成树
1、最小生成树的概念
生成树是针对连通图来说的。
2、prim算法
3、kruskal
6.4.2 最短路径
1、知识概览
2、BFS求最短路径(单源–无权图)
单源:从某一个源点出发到其他顶点。
如图,求的是从2出发到其他顶点的路径和路径长度。
d[]:到2的路径长度;
path[]:到2的路径;
由BFS得到的最小生成树也能表示最短路径。
3、Dijkstra算法(单元)
带权路径长度:
用来求从某个顶点出发,到其他顶点的路径和路径长度;
final置true–》检查并更新dist【】–》修改path【】,path【】是直接前驱。
4、Floyd算法(全局性)
考试要求会算A矩阵。
从无中转点开始依次加入中转点。
6.4.3 有向无环图描述表达式
6.4.4 拓扑排序
逆拓扑排序
从出度为0的顶点开始删除。
6.4.5 关键路径
1、事件最早开始时间
2、事件最晚开始时间
3、活动最早发生时间
4、活动最晚发生时间‘
5、活动余量
活动余量为零的活动是关键活动,对应的路径就是关键路径。
七、查找
7.1 查找的基本概念
1、查找:查找结构有成功和失败;
2、查找表:用来查找的数据集合,进行的操作一般有①查找某个元素;②查找某种属性;③在查找表中插入一个元素;思在查找表中删除一个元素;
3、静态查找表:只进行①②两种操作的查找表,对应的查找方法有:顺序查找、折半查找、散列查找等;动态查找的方法有二叉排序树的查找、散列查找等。
4、关键字:唯一的标识元素的值;
5、平均查找长度:一次查找长度指需要比较的关键词次数。平均查找长度指的是所有查找过程中进行关键字比较次数的平均值。
7.2 顺序查找和折半查找
7.2.1 顺序查找
顺序查找的优化有:(1)将表中元素有序放置;(2)按照查找概率放置。
7.2.2 折半查找
7.2.3 分块查找
分块也叫索引顺序查找。
块内无序,块间有序。
分块查找分两步:第一步先在索引表中确定要查找的块,第二部在块内查找。
索引表里记录的有各块最大关键字和第一个元素的地址。
7.3 树型查找
7.3.1 二叉排序树(BST)
二叉排序树的查找
二叉树的插入
二叉树排序树的删除
7.3.2 平衡二叉树
1、定义
2、平衡二叉树的插入和旋转
(1)LL
(2)RR
(3)LR
(4)RL
7.3.3 红黑树
红黑树主要考察定义、性质、插入
1、红黑树的定义
左根右
根叶黑
不红红
黑路同:不算起点的黑
2、红黑树的性质
3、红黑树的插入
7.4 B树和B+树
7.4.1 B树及其基本操作
结点个数:根节点和非根节点;
非根结点和其子树中关键字大小的关系。
叶结点看成失败结点。
每个结点的关键字都不重复。
7.4.2 B+树的基本概念
重点掌握:
1、根节点和非根结点的个数。
2、叶结点包含所有结点的信息,其他分支结点相当于索引。
3、相邻叶结点之间按照大小顺序链接。
1、B树的查找
2、B树的插入:
插入可能会导致关键字超过上限,需要中间的移到上一层中去。
3、B树的删除
可能会导致关键字低于下限,需要合并。分为非叶终端结点和叶终端结点。
7.5 散列表
7.5.1 散列表的基本概念
7.5.2 散列函数的构造方法
7.5.3 处理冲突的办法
7.5.4 散列查找及性能分析
八、排序
主要考察
1、排序手动算法
2、代码
3、时间空间复杂度
8.1 排序的基本概念
8.1.1 排序的定义
8.2 插入排序
8.2.1 直接插入排序
1、算法思想
2、代码
3、稳定性、时间空间复杂度
8.2.2 折半插入排序
1、算法思想
2、代码
8.2.3 希尔排序
1、算法思想
用增量d
2、代码
3、稳定性、时间空间复杂度
8.3 交换排序
8.3.1 冒泡排序
1、每次都会使一个最大或者最小的元素确定最终位置
2、代码
2、
8.3.2 快速排序
1、重要考点
2、代码
8.4 选择排序
8.4.1 简单选择排序
1、重要考点
2、代码
8.4.2 堆排序
1、重要考点
2、代码
3、堆的插入和删除
8.5 归并排序和基数排序
8.5.1 归并排序
1、二路归并
2、代码实现
3、重要考点
8.5.2 基数排序
8.6 各种内部排序算法的比较和应用
8.6.1 内部排序算法的比较
8.6.2 内部排序算法的应用
8.7 外部排序
8.7.1 外部排序的基本概念
1、外存和内存是以块为单位进行读写的
2、
3、读写磁盘时间和归并趟数
4、优化归并趟数
8.7.2 外部排序的方法
8.7.3 多路平衡归并与败者树
8.7.4 置换选择排序(生成初始归并段)
8.7.5 最佳归并树
二级标题
三级标题
四级标题
五级标题
六级标题
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。