数据结构与算法基础(王卓)--学习笔记

1 数据结构分类

1.1 逻辑结构分类

  • 集合结构
  • 线性结构:线性表、栈、队列、串
  • 树形结构
  • 图形结构

1.2 物理结构分类

逻辑结构在计算机中的真正表示方式(又称为映射)称为物理结构,也可叫做存储结构

  • 顺序存储结构:数组
  • 链式存储结构
  • 索引存储结构
  • 散列存储结构

 2 算法

2.1 算法的特性:

  • 有穷性
  • 确定性
  • 可行性

2.2 算法效率

  •  时间复杂度
  • 空间复杂度

 3 线性表:List

线性表是具有相同特性的数据元素的一个有限序列。是一种典型的线性结构。

 3.1 顺序表

顺序表(元素)特点:顺序存储结构

地址连续、依次存放、随机存储、类型相同

定义顺序表的类型:

#define SQLMAXSIZE 100  // 线性表存储空间的初始分配量
typedef int SqlElemType;typedef struct __Sqlist {
SqlElemType *base;
int length;
} Sqlist;

 例子:

 定义顺序表类型时内存分配:

 3.2 链表 

3.2.1 单链表

  1. 单链表由头节点(不存放数据只存放下个节点的地址)和n个节点组成,
  2. 每个节点分为两个域:数据域和指针域(存放下个节点的地址)
  3. 第n个节点的指针域为NULL。
  4. 单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名,为链式存储结构。
3.2.1.1 单链表类型的定义

 例子:

或:

3.1.2.2 销毁单链表

3.2.1.3 清空链表

链表仍存在,但链表中无元素,成为空链表(头指针和头节点仍然存在)。

3.2.1.4 求单链表的表长

从首元节点开始,依次计数所有节点。

 3.2.2 双链表

节点有两个指针域的的链表。

3.2.3 循环链表

首尾相接的链表

4 栈和队列

栈和队列是限定插入和删除只能在表的“端点”进行的线性表

4.1 栈(Stack)

特点是后进先出(LIFO),应用场景有:

  • 进值转换
  • 括号匹配的检验
  • 行编辑程序
  • 迷宫求解
  • 表达式求值
  • 八皇后问题
  • 函数调用
  • 递归调用实现

 4.1.1 顺序栈

4.1.1.1 顺序栈类型定义

 4.1.1.2 顺序栈的初始化

 4.1.2 链栈

4.1.2.1 链栈类型定义

链栈是运算受限的单链表,只能在链表头部进行操作

 4.1.2.2 链栈的初始化

4.1.2.3 链栈的入栈

 4.1.2.4 链栈的出栈

 4.2 队列(queue)

特点是先进先出(FIFO),应用于类似排队的场景中:

  • 脱机打印输出:按申请的先后顺序依次输出
  • 多用户系统中,多个用户排成队,分时地循环使用CPU和主存
  • 按用户的优先级排成多个队,每个优先级一个队列
  • 实时控制系统中,信号按接收的先后顺序依次处理
  • 网络电文传输,按时到达的时间先后顺序依次进行 

4.2.1 循环队列

只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表 

4.2.1.1 循环队列类型定义

 4.2.1.2 循环队列的初始化

 4.2.2 链队列

若用户无法估计所用队列长度,则宜采用链队列。 

4.2.2.1 链队列类型定义

4.2.2.2 链队列的初始化

 5 串、数组、广义表

5.1 串(String)

串是零个或多个任意字符组成的有限序列。

子串:一个串中任意个连续字符组成的串叫子串。

5.1.1 顺序串

5.1.1.1 顺序串的类型定义

 存储从1开始,0闲置不用。

 5.1.1.2 串的模式匹配算法

目的:确定主串中所含子串(模式串)第一次出现的位置(定位)。

1. BF算法

Brute-Force 简称 BF算法,又称为简单匹配算法,采用穷举法的思路。时间:O(n*m)

2. KMP算法

 主串S 中指针i 不必回溯,子串T中j 回溯,可提速到O(n+m);

相比BF算法,KMP算法增加一个 next数组,通过 next数组将 j回溯;

 求模式串(子串)的next数组:

即:

代码:

5.1.2 链串

5.1.2.1 链串(块链)的类型定义

 5.2 数组

按一定格式排列起来的,具有相同类型的数据元素的集合。

一维数组的 声明格式:数据类型 变量名称[长度];  int num[4];

二维数组的 声明格式:数据类型 变量名称[行数][列数]; int mun[2][3];

 5.3 广义表(LS)

6 树(Tree)

6.1 树的基本定义 

  • 根结点:非空树中无前驱结点的结点
  • 结点的度:结点拥有的子树数(即直接的分枝个数)
  • 树的度:树内各结点的度的最大值
  • 叶子结点:终端结点(度为0)
  • 树的深度:树中结点的最大层次
  • 有序树:树中结点的各子树从左至右有次序(最左边的为第一个孩子)
  • 无序树:树中各结点无序
  • 森林:是m(m≥0)棵互不相交的树的集合

6.2 二叉树的定义

  •  二叉树是最多只有两个“叉”的树(度≤2),任何树都可以和二叉树相互转换;
  • 二叉树不是树的特殊情况,它们是两个概念;
  • 二叉树结点的子树要区分左子树和右子树,即使只有一棵树也要区分,说明其是左子树,还是右子树;

6.2.1 二叉树的抽象类型定义

6.2.2 二叉树的性质

  1. 在二叉树的第 i 层上至多有 2^{i-1} 个结点(i≥1),至少有1个结点
  2. 深度为 k 的二叉树至多有 2^{k}-1
  3. 深度为 k 的二叉树至少有 k 个结点
  4. 对于任何一个二叉树 T,如果其叶子树为 n_{0},度为 2 的结点数为 n_{2} ,则 n_{0}=n_{2}+1

6.3 满二叉树 

  •  每一层上的结点数都是最大结点数(即每层都满:2^{k}-1
  • 叶子结点全部在最底层

 6.4 完全二叉树

深度为 k 的具有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树中编号为 1~n 的结点一一对应时,称之为 完全二叉树。

 即:在满二叉树中,从最后一个结点开始,连续去掉任意个结点,都是一颗完全二叉树

 6.4.1 完全二叉树的性质

  • 具有 n 个结点的完全二叉树的深度为 \left \lfloor log_{2}n \right \rfloor+1
  • 如果对一颗有 n 个结点的完全二叉树(深度为 \left \lfloor log_{2}n \right \rfloor+1)的结点按层序编号(从第1层到第 \left \lfloor log_{2}n \right \rfloor+1 层,每层从左到右),则对任一结点编号 i(1 ≤ i ≤ n),有:

6.5 二叉树的存储结构

6.5.1 二叉树的顺序存储结构

实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素。

存储结构:(适用满二叉树或完全二叉树)

 6.5.2 二叉树的链式存储结构

6.5.2.1 二叉链表

 在 n 个结点的二叉链表中,有 n+1 个空指针域。

6.5.2.2 三叉链表

 6.5.3 遍历二叉树算法(递归方法)

 若二叉树为空,则进行空操作。

 6.5.3.1 二叉树先序遍历算法

 例:

6.5.3.2 二叉树中序遍历算法

遍历算法对比: 

6.5.4 中序遍历二叉树算法(非递归方法) 

6.5.5 二叉树的层次遍历(队列)

对于一颗二叉树,从左到右,从上到下进行遍历。

6.6 二叉树的建立算法(先序 读入字符)

 6.7 二叉树的复制算法

 6.8 计算二叉树的深度算法

6.9 计算二叉树结点总数算法

6.10 计算二叉树的叶子结点数算法

 6.11 线索二叉树

如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;如果某个结点的右孩子为空,则将空的右孩子指针域改为指向其后继-----这种改变指向的指针称为“线索”,即线索二叉树。

例:线索化

 线索二叉树结构:

 6.12 树的存储结构

6.12.1 双亲表示法

6.12.2 孩子链表

6.12.3 孩子兄弟表示法 (二叉链表表示法)

 6.13 树与二叉树的转换

6.13.1 将树转换为二叉树

6.13.2 将二叉树转换为树

 6.14 森林与二叉树的转换

 6.14.1 森林转换为二叉树

6.14.2 二叉树转换为森林

6.15 树与森林的遍历

6.15.1 树的遍历(三种方式)

 6.15.2 森林的遍历

6.16 哈夫曼树

 哈夫曼树即是:带权路径长度(WPL)最短的树。

贪心算法:构造哈夫曼树时首先选择权值最小的叶子结点。

6.16.1 构造哈夫曼树方法

6.16.2 哈夫曼树(结点类型定义):一维结构数组

6.16.3 构造哈夫曼树算法

6.16.4 哈夫曼编码算法

哈夫曼编码是前缀码,且是最优前缀码。

 哈夫曼编码构造算法:

 7 图(Grap)

 7.1 图的抽象数据类型定义

7.2 图的存储结构

7.2.1 数组(邻接矩阵)表示法

缺陷:插入和删除顶点不便

7.2.2 链式存储结构(邻接表)

7.3 图的遍历

7.3.1 深度优先搜索(DFS)

7.3.2 广度优先搜索(BFS)

7.4 图的应用

7.4.1 构造最小生成树

7.4.1.1 普里姆算法(Prim)

7.4.1.2 克鲁斯卡尔算法(KrusKal)

最小生成树并不唯一

 7.4.2 寻找最短路径

7.4.2.1 单源最短路径——迪杰斯特拉算法(Dijkstra)

 

7.4.2.2 所有顶点间的最短路径——弗洛伊德算法(Floyd)

7.4.3 有向无环图及其应用

7.4.3.1 拓扑排序

7.4.3.2 关键路径

8 查找

8.1 线性表的查找——线性存储结构

8.1.1 顺序查找(线性查找)

或:

改进:从后往前查找

8.1.2 折半查找(二分查找或对分查找)

8.1.3 分块查找

8.2 树表的查找——树型存储结构

8.2.1 二叉排序树

8.2.2 平衡二叉树

8.3哈希表的查找——散列存储结构

8.3.1 散列函数的构造方法 

8.3.1.1 直接订址法

8.3.1.2 除留余数法

8.3.2 散列表冲突解决方法

8.3.2.1 开放定址法

8.3.2.2 链地址法(拉链法)

8.3.3 散列表的查找

9 排序

9.1 排序的分类

 

9.2 插入排序

9.2.1 直接插入排序

9.2.2 折半插入排序

9.2.3 希尔排序

9.3 交换排序

9.3.1 冒泡排序

9.3.2 快速排序

快速排序不适于对原本有序或基本有序的记录序列进行排序。

9.4 选择排序

9.4.1 简单选择排序

9.4.2 堆排序

9.5 归并排序

9.6 基数排序

9.7 排序算法性能比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高德地图获取key值步骤

1、创建新应用 进入控制台(https://lbs.amap.com/dev/),创建一个新应用。 如果您之前已经创建过应用,可直接跳过这个步骤。 2、添加新Key 在创建的应用上分别填写key名称、选择服务平台、SHA1、以及PackageName SHA1:是在安卓…

【项目实训】解决前后端跨域问题

由于前端框架使用vue,后端使用flask,因此需要解决前后端通信问题 在vue.config.js中修改 module.exports defineConfig({transpileDependencies: true,lintOnSave:false, }) // 跨域配置 module.exports {devServer: { //记住&#x…

Omniverse 下载 isaac sim过慢的解决办法

比如在上海地区,下载isaac只有 200kb/s,这8个G下载要很长时间 对于着急的小伙伴,可以直接去日志里拿下载链接,在Omniverse里点右上角小人,点开里面SETTINGS,如图 点击,LOGS LOCATION&#xff0c…

海外仓一件代发效率提升方案:拣货区规划策略

作为海外仓的核心业务,一件代发处理的效率和准确性,可以说直接影响了海外仓的经济效益。今天我们就会针对大家都比较头疼的一件代发效率问题,给大家分享一些实用建议。 提升一件代发效率要考虑的3个关键要素 对以一件代发为主要业务的海外仓…

分布式系统:常见的陷阱和复杂性

分布式系统的复杂性是工程师和开发人员面临的重要挑战。复杂性往往会随着系统的发展而增加,因此积极主动非常重要。让我们来谈谈您可能会遇到哪些类型的复杂性以及在工作中应对它的有效策略。 分布式系统和复杂性 在开发中,分布式系统是相互连接并执行…

PyTorch入门:探索Tensor的基本操作(2)

torch.cat() a torch.zeros((2,4)) b torch.ones((2,4)) out torch.cat((a,b), dim1) print(out)运行结果如下: tensor([[0., 0., 0., 0., 1., 1., 1., 1.],[0., 0., 0., 0., 1., 1., 1., 1.]])torch.stack()&…

深度学习 --- stanford cs231学习笔记五(训练神经网络之数据的预处理)

数据的预处理(Data Preprocessing) 2 Data Preprocessing数据的预处理 数据预处理的几种方法 2,1 数据的零点中心化 数据的零点中心化的目的就是为了把数据的整体分布拉回到原点附近,也就是让数据的整体均值变为0。 ​ 2,2 数据的标准化 数据…

缓冲区溢出

本文作者:杉木涂鸦智能安全实验室 前置知识点 栈 栈(Stack)是计算机中的一种数据结构,用于存储临时数据。它的特点是后入先出(LIFO),只能在栈顶添加或删除数据。在程序中,栈被用于…

从一道算法题开始,爱上Python编程

Python是一门简单易学、高效强大的编程语言,许多人因为它的便捷性和广泛应用而爱上编程。今天,我将通过一道有趣的算法题,带领大家一步步写出Python代码,并最终解决问题。希望通过这篇文章,能激发大家对Python编程的兴…

[创业之路-131] :制造业企业的必备管理神器-ERP-ERP常见单据

目录 一、采购管理的ERP常见单据 1.1 请购单: 主要内容 作用 操作流程 1.2 采购订单(Purchase Order, PO): 1.3 采购合同(Purchase Contract): 1.4 采购发票(Purchase Invoi…

操纵系统的特征-线程的六种状态

线程的六种状态 线程是操作系统进行运算调度的最小单位,它可以分为六种状态 新建状态(NEW) 用new创建一个线程对象,这时候处于新建状态 可运行状态(RUNNABLE) 可运行状态又分为两种状态:就绪…

计算机网络模型(OSI架构、TCP/IP架构)

OSI开放式系统互联 为什么会有通用的网络通信模型(OSI、TCP/IP)一、OSI(1)OSI 是什么(2)OSI 七层第七层、应用层第六层、表示层第五层、会话层第四层、传输层第三层、网络层第二层、数据链路层第一层、物理…

Redis 7.x 系列【8】数据类型之哈希(Hash)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 HSET2.2 HGET2.3 HDEL2.4 HEXISTS2.5 HGETALL2.6 HKEYS2.7 HLE…

基于PHP+MySQL组合开发家政预约服务小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代,家政服务行业也逐渐融入了科技的力量。为了满足市场需求,我们开发了一款基于 PHPMySQL 组合的家政预约服务小程序源码系统。该系统不仅提供了便捷的家政服务预约功能,还具备完整的安装代码包和详细的搭建教程&…

安全工具 | BurpSuite安装使用(保姆级教程!)

Burp Suite下载,破解,代理web,代理模拟器 (一)为Burp Sutie下载运行执行脚本环境(Java) 1.Java官网下载地址:https://www.oracle.com/java/technologies/ 下载Java SE 17.0.8(LTS) 备注:1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持…

RP2040 开发,用 Arduino 通过 ADC 获取电压测量数据

这两天测试了一下如何通过 RP2040 的内置 ADC 获取一个待测量的电压数据,RP2040 内置了4路ADC,分辨率是12bit,也就是说,可以获取4096阶的变化量,但第4个 ADC 已经用于测量芯片的内部温度,所以实际能用的仅有…

浅谈逻辑控制器之随机控制器

浅谈逻辑控制器之随机控制器 随机控制器(Random Controller)是众多逻辑控制器中的一种,它为测试脚本引入了随机性,提高了模拟真实用户行为的灵活性。 随机控制器的功能 随机控制器的作用在于从其直接子元素(通常是采样器)中随机…

电脑桌面杂乱无章,整理电脑桌面,电脑桌面整理整洁电脑桌面这里推荐腾讯桌面整理软件

这里只需要下载桌面整理独立版就行,就37M多,官网如下: 桌面整理_桌面整理软件_一键桌面整理工具-腾讯电脑管家官网 (qq.com)

使用uniapp.pageScrollTo方法进行页面滚动

先看看是不是你想要的: 需求: 有个填写数据的单子在提交的时候,会对必填项做校验,如果必填项没有数据的话,必填项校验生效给出提示,并且页面滚动到第一个需要填写数据的地方。 开发: 因为这个…

vs code python开发笔记

目录 安装插件 不全: 2.选择python解释器 安装插件 不全: remote ssh python debuger 左下角,点击左右左右箭头,远程连接到ssh 2.选择python解释器 ctrlshiftP打开VSCode的命令行,输入python: select Interpreter…