24数据结构

数据结构

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 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
 V

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、重要考点
![在这里插入图片描述](https://img-blog.csdnimg.cn/0635d14f075442aeb6369a529f89c6f2.png

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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值