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

news2024/11/24 8:51:27

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.coloradmin.cn/o/1871216.html

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

相关文章

嵌入式学习——数据结构(双向无头有环链表、内核链表、栈)——day48

1. 约瑟夫环问题——双向无头回环链表 1.1 问题描述 给定 ( n ) 个人(编号为 ( 1, 2, \ldots, n )),他们围成一个圈。从第一个人开始报数,每报到第 ( k ) 个人时,杀掉这个人,然后从下一个人重新开始报数。…

一些硬件知识(十二)

1、请说明一下滤波磁珠和滤波电感的区别。 因此磁珠通常用于模数地的连接。 磁珠由导线穿过铁氧体组成,直流电阻很小,在低频时阻抗也很小,对直流信号几乎没有影响。 在高频(几十兆赫兹以上)时磁珠阻抗比较大&#xff0…

事务处理概述

一、引言 1、决定数据库应用系统性能的DBMS的关键实现技术——事务处理技术 事务处理技术是为了解决早期的DBMS产品在应用过程中遇到的现实问题而在后续的DBMS产品中加以实现的技术 2、比如在银行系统中,账户转账是常见的业务,是金融学中的交易trans…

【MLP-BEV(7)】深度的计算。针孔相机和鱼眼相机对于深度depth的采样一个是均匀采样,一个是最大深度均匀采样

文章目录 1.1 问题提出1.1 看看DD3D 的深度是怎么处理的给出代码示例 1.2 我们看看BEVDepth的代码 1.1 问题提出 针孔相机和鱼眼相机的投影模型和畸变模型不一样,如果对鱼眼的模型不太了解可以到我的这篇博客【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模…

go语言day4 引入第三方依赖 整型和字符串转换 进制间转换 指针类型 浮点数类型 字符串类型

Golang依赖下载安装失败解决方法_安装go依赖超时怎么解决-CSDN博客 go安装依赖包(go get, go module)_go 安装依赖-CSDN博客 目录 go语言项目中如何使用第三方依赖:(前两步可以忽略) 一、安装git,安装程序…

vue启动时的错误

解决办法一:在vue.config.js中直接添加一行代码 lintOnSave:false 关闭该项目重新运行就可启动 解决办法二: 修改组件名称

步步精科技诚邀您参加2024慕尼黑上海电子展

尊敬的客户: 我们诚挚地邀请您参加即将于2024年7月8日至7月10日在上海新国际博览中心举办的2024慕尼黑上海电子展(electronica China)。此次展会汇聚了国内外优秀企业,展示从元器件到系统集成方案的完整产品链,为各行…

点云处理实战 点云平面拟合

目录 一、什么是平拟合 二、拟合步骤 三、数学原理 1、平面拟合 2、PCA过程 四、代码 一、什么是平拟合 平面拟合是指在三维空间中找到一个平面,使其尽可能接近给定的点云。最小二乘法是一种常用的拟合方法,通过最小化误差平方和来找到最优的拟合平面。 二、拟合步骤…

极验行为式验证码适配HarmonyOS 鸿蒙SDK下载

现阶段,越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与,早在去年9月,极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率,方便大家…

放大招了|十亿参数大模型LLMs运行功耗仅需13W,内存使用量减少90%!

矩阵乘法(MatMul)历来是大型语言模型(LLMs)总体计算成本的主导因素,尤其在模型向更大维度嵌入和上下文长度发展时,这一成本呈指数级增长。 近期有一篇刚刚发表的论文中提出的方法完全去除了矩阵乘法操作&am…

SS8870T-3.6A 扫地机和滚刷电机的大电流电机驱动

扫地机器人已经成为现代家庭清洁的必备工具,而其中的关键部件——电机,对于其性能和用户体验起着至关重要的作用。为了确保扫地机器人的高效清洁和稳定运行,至少需要使用7个直流电机,包括行走轮、滚轮、边刷和吸尘等功能的驱动。 …

2024/5/9【贪心5/5】--代码随想录算法训练营day36|56. 合并区间、738.单调递增的数字、968.监控二叉树 (可跳过)

56. 合并区间 力扣链接 class Solution:def merge(self, intervals):result []if len(intervals) 0:return result # 区间集合为空直接返回intervals.sort(keylambda x: x[0]) # 按照区间的左边界进行排序result.append(intervals[0]) # 第一个区间可以直接放入结果集中…

专业软件测试公司分享:安全测评对于软件产品的重要性

在互联网普及的今天,随着各类软件的大规模使用,安全问题也变得愈发突出。因此,对软件进行全面的安全测评,不仅可以有效保障用户的信息安全,还能提升软件产品的信任度和市场竞争力。 安全测评对于软件产品的重要性就如…

SSL证书部署的安装环境

一、SSL证书常见的几种服务器环境 SSL证书可以安装部署在多种服务器环境中,以实现网站的HTTPS安全加密通信。正常常见的几种服务器主要分为Apache服务器、Nginx服务器、IIS服务器、Tomcat服务器。 1、Apache服务器: Apache是广泛使用的Web服务器软件。…

【C++】STL-stack_queue

目录 1、stack和queue的使用 1.1 最小栈 1.2 栈的弹出和压入序列 1.3 二叉树的层序遍历 2、stack和queue的模拟实现 2.1 适配器 2.2 deque 2.2.1 deque的成员变量 2.2.2 deque的迭代器 2.2.3 deque尾插元素 2.2.4 deque头插元素 2.2.5 下标访问 2.2.6 deque的不足 …

Vite: Esbuild的使用与其插件开发

概述 作为 Vite 的双引擎之一,Esbuild 在很多关键的构建阶段(如 依赖预编译 、 TS 语法转译 、 代码压缩 ) 让 Vite 获得了相当优异的性能,是 Vite 高性能的得力助手无论是在 Vite 的配置项还是源码实现中,都包含了不少 Esbuild 本身的基本概…

postGreSQL关系数据库介绍

什么是postGreSQL关系数据库? PostgreSQL 是一个强大的、开源的对象关系型数据库管理系统(ORDBMS)。它基于POSTQUEL查询语言的继承,提供了对SQL标准的广泛支持,并扩展了许多高级功能,如事务处理、多版本并…

被年轻人整不会的1688,终于开始反击了!

“我可以买贵的,但我不能买贵了。”成为年轻人新晋购物哲学。 最近,在豆瓣、小红书等社交媒体上出现了一种独特的消费趋势。在这些平台被种草之后,越来越多对价格敏感、注重性价比的年轻人开始挖宝“大牌平替”。他们涌入阿里巴巴旗下以批发…

配置Nginx二级域名

一、环境 (一)配置 1.服务器 linux CentOS 2.反向代理 Nginx 3.开放端口 云服务器开放端口80和443 二、域名备案 (一)腾讯云 1.腾讯云域名备案流程 备注:一级域名备案后,二级域名可以不用再备案&a…

第一个Flask程序

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 一切准备就绪,现在我们开始编写第一个Flask程序,由于是第一个Flask程序,当然要从最简单的“Hello World&#xff…