[数据结构复习]自用大纲

news2025/1/15 6:50:42

内容多基于王道和李春葆《数据结构教程》,做复习提纲之用

基本内容回顾

顺序队

队列是线性表(具有逻辑上的前驱后继关系)。头插尾删,先进先出

队列的实现至少需要维护如下内容(一数组,二指针):

  • 数组(定长,且知道大小)
  • 队首指针front(指向队首元素)
  • 队尾指针rear(指向队尾元素的下一个位置)

队列的逻辑是环形使用数组,数组最后一个位置使用后接着使用第一个位置。通过对下标使用取余确保不会越界。

由于空队列时的条件为front==rear,若不加以修改,满队列条件实际上和这个一样,因此有三种策略:

  1. 少装一个元素,当front == (rear+1)%MaxSize就认为满
  2. 多设置一个size变量,入队自增,出队自减
  3. 设置tag,入队置1,出队置0

对3进行解释:只有在前一次操作插入才会导致队满,此时tag==1,故有判定条件为front == rear && tag == 1。同理只有在前一次操作删除才会导致队空满,此时tag==0,故有判定条件为front == rear && tag == 01

注意:

  • 入队前需先判断是否满
  • 出队前需先判断是否空

链队

一般需要维护的如下:

  • 链表节点(一般需要头结点,空的,初始化malloc一个就行)
  • 两个指针(指向头结点和尾节点,front == reat为空)

链队一般不会满(除非没得内存),但是顺序队由于底层是定长数组,会满。

要点:

  • 入队就尾插
  • 出队就front->next
  • 删除节点记得释放空间

此外还有双端队列和循环队列,过于简单不做赘述

后进先出

典型应用:

  • 括号匹配
  • 树的某些遍历方法
  • 前中后缀表达式
  • 函数调用有调用栈

实现需要:

  • 定长数组
  • 记录栈顶下标的int变量top

矩阵压缩

涉及:

  • 压缩前后的下标转换
  • 上/下三角矩阵
  • 稀疏矩阵

涉及数据结构:

  • 三元组
  • 十字链表法

[ADT笔记]串(String)及其C语言实现

串是特殊的线性表(线性表在逻辑上具有前驱和后继的关系)

实现:

#define maxsize 50
typedef struct
{
	char data[maxsize];
	//使用length可以把求长度的时间复杂度降为O(1)
	int length;
}SqString;

核心是char[],但是为了知道串长度有如下几种操作:

  1. 另设一个存放长度的int(上例即是)
  2. data[0]存放长度(由于char占一个字节,所以串长不能超过256)
  3. 使用\0结尾,不存串长(那Getlength()无法降到 O ( 1 ) O(1) O(1),上两种方法倒是可以)

注:串可以链式存储,但是每个节点存储一个char回导致存储密度降低。可以一个节点存一个块(一个块存多个字符)形成块链结构,缺点是增删麻烦。

其他:模式匹配问题(蛮力/KMP)

  • 节点的度:节点有几个孩子
  • 树的度:各节点的度的最大值

度为n的树至少有一个节点的度为n,但是n叉树允许所有节点度小于n,甚至可以是空树

二叉树:

  • 二叉树左右顺序要区分
  • 满二叉树:叶子结点全在最下面一层,非叶子结点均有两个子节点
  • 完全二叉树:深度为h的二叉树除第 h 层外其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边
  • 实现可以顺序存储或者链式存储

遍历一般依靠递归就够了:

  • 前序:根左右
  • 中序:左根右
  • 后序:左右根

这里可以和上面提到的前中后缀表达式联系起来

线索二叉树:

线索二叉树的前提必须指明是那种遍历方式

就是在指定的遍历方式的情况下,节点会产生前驱/后继的关系(因为遍历会得到一个访问序列)。线索二叉树就是要为节点指明前驱后继,该过程称为线索化。

线索化要使用节点的空的指针,也就是说需要线索化处理的节点位于叶子结点或者孩子没满的节点。

typedef struct BiTree {
	struct BiTree *lchild, *rchild;	//左右子节点指针
	int data;	// 数据域
	// 左右标志,0 代表指向的是孩子,1代表指向的是前驱/后继
	int LTag;
	int RTag;
}BiNode;

对于这些指针,如果是左指针空,则用它指向前驱,且LTag置1;若右指针为空,则用它指向后继,且置RTag为1。通过Tag变量区分指向的到底是子节点还是前驱后继。

线索化时需要借助中变量temp保存前驱以供访问。这里还是得看代码才直观

森林或树转换到二叉树

  1. 森林中各个树的根结点之间视为兄弟关系
  2. 左孩子右兄弟存储

二叉搜索树BST

[算法笔记]树表的查找:BST与AVL

  1. 若根节点的左子树非空,则左子树上所有结点关键字均小于根节点关键字
  2. 若根节点的右子树非空,则右子树上所有结点关键字均大于根节点关键字
  3. 根节点的左、右子树本身又各是一棵二叉排序树

BST涉及平衡操作,AVL树就是一种平衡的二叉搜索树,涉及LL、RR、LR、RL四种过程

平衡二叉树:每个节点左右子树高度最多相差1

哈夫曼树

[ADT笔记]图(graph)

生成树:所有顶点均由边连接在一起但不存在回路的图

表示方法:

  • 邻接矩阵
  • 邻接表
  • 十字链表

排序

在这里插入图片描述

[算法笔记]排序算法1:插入、选择和交换排序

[算法笔记]排序算法2:桶、计数与基数排序

其他补充

单链表 O ( 1 ) O(1) O(1)前插

bool InsertPriorNode(LNode *p, LNode *s){
    if(p==NULL || S==NULL)
        return false;
    // 常规尾插连接节点后交换数据域
    s->next = p->next;
    p->next = s;  // s连接到p
    ELemType temp = p->data;  // 交换数据域部分
    p->data = s->data;
    s->data = temp;

    return true;
}

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

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

相关文章

电脑开机屏幕闪烁后变成蓝屏无法启动怎么办?

电脑开机屏幕闪烁后变成蓝屏无法启动怎么办?有用户在将电脑开机之后,出现了屏幕会闪动的情况,接着电脑屏幕就变成蓝屏的了。而且再次启动的时候也是这样。这个情况下是我们的系统出现了问题,我们来看看如何去使用U盘进行系统重装的…

python+django大学生体质测试管理系统

系统分为学生和管理员,教师三个角色 学生的主要功能有: 1.学生注册和登陆系统 2.查看系统的公告资讯信息 3.学生查看体质测试的项目,下载测试文件 4.学生留言板在线留言 5.学生个人中心修改个人资料,修改密码 6.学生个人中心查询我…

Java 介绍与环境搭建

文章目录Java 介绍与环境搭建Java 背景介绍Java 背景故事Java 三大平台Java SEJava MEJava EEJava 跨平台工作原理平台与跨平台跨平台工作原理JDK 下载和安装下载 JDK安装 JDK第一个 Java 程序HelloWorld 介绍Java 程序开发的三个步骤HelloWorld 案例的编写和运行HelloWord 案例…

如何通过Terraform Associate考试并获得证书

1 什么是Terraform? Terraform是一个IaC工具,IaC全称为Infrastructure as Code,基础设施即代码。它的理念是通过代码来管理基础设施,如服务器、数据库等,更多请看《Terraform入门教程,示例展示管理Docker和Kubernete…

mysql快速生成100W条测试数据(5)商品销售数据并存入mysql数据库

这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据(1):游戏人物数据 mysql快速生成100W条测试数据(2)公司员工信息 mysql快速生成100W条测…

Linux USB实现网络共享

usb 网络共享 两个Linux设备之间实现USB网络共享,类似Android手机开启USB网络共享的功能。其中一台设备为USB Host,另外一台为USB Device。Device使用的USB接口必须为USB Slave,否则无法正常工作。使用RNDIS驱动,还能够通过USB与…

【ROS2入门】介绍 eloquent 版本中 turtlesim 和 rqt 使用

大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们Jeston TX1 核心模块,JetPack_4.6.3刷机后环境中安装了 ROS2 eloquent版本,并完成了初步的…

C语言-动态内存分配(12.1)

目录 思维导图: 1.为什么存在动态内存分配 2.动态内存函数的介绍 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.常见的动态内存错误 写在最后: 思维导图: 1.为什么存在动态内存分配 我们现在学习了一些内存开辟的方式&#xff1a…

IDEA如何把自己改动的代码一次性发给别人

背景介绍: 想把自己改动的代码同步给同事 方式1:通过git,把自己本地代码 push 到代码托管平台,同事从代码托管平台 pull 最新代码; 方式2:通过IDEA的Patch包的方式来快速发送修改的代码(步骤如下…

pr值高的域名对网站有什么价值?怎么在线查询搜狗PR权重

众所周知一个全新的搜狗域名在建立网站后搜索引擎会对其进行一个类似资格评价的阶段,我们将这个阶段称为沙盒,在沙盒里面的这段时间,我们将其称为沙盒期,沙盒期一般都是1-3个月。在沙盒期这段时间内。我们仍需要经常更新文章。所以…

联合证券|海南自贸港快速发展,概念股出炉!

海南自由贸易港货物进出口 初次打破2000亿元关口 1月13日,国新办就2022年全年进出口状况举行发布会。会上介绍道,近两年海南自由贸易港货物进出口快速开展,继2021年头次打破1000亿元后,2022年再上新台阶,初次打破2000…

Pytorch深度学习【十二】

填充和步幅 卷积核带来的问题—输入形状不断减小更大的卷积核可以更快的减小输出大小 形状从nh∗nwn_h * n_wnh​∗nw​减少到 (nh−kh1)∗(nw−kw1)(n_h-k_h1)*(n_w-k_w1)(nh​−kh​1)∗(nw​−kw​1) 解决方案 填充—在输入周围添加额外的行/列—一般用0填充理论依据 填充p…

Odoo 16 企业版手册 - 库存管理之报告

报告 正确监控库存操作将帮助您轻松分析和理解库存管理的工作流程。Odoo可以为您提供一个专用平台,特别是用于为您的组织中完成的库存操作生成报告,并在图形和表格视图中准确表示数据。您可以实时自定义报告,以根据您的要求获得细致的报告。在…

Nvm,Nrm使用教程

NVM介绍 NVM全称node.js version management ,专门针对node版本进行管理的工具,通过它可以安装和切换不同版本的node.js 使用场景 我目前的公司有很多项目,其中有一些老项目用的是vue2.5左右了webpack版本也比较低,只能使用10.16.…

[前端笔记——WEB基础] 1.WEB基本概念

[前端笔记——WEB基础] 1.WEB基本概念基本概念1.资源 resourse2.链接3.HTTP 协议4.网页的真实样子:HTML静态网页与动态网页1.静态网页2.动态网页现代网站架构1.网站架构当我们访问一个网站时,后台都会发生什么事情捏?www——万维网 www:Worl…

Android系统启动(三) — SystemServer处理过程

system_server 进程主要是用于创建系统服务,AMS、WMS、PMS 都是由它创建的。 具体来说,SystemServer 进程被创建后,主要做了以下工作: 启动 Binder 线程池,这样就可以与其他进程进行通信;创建 SystemServi…

JDK9下载、安装和配置环境变量图解

下载 1.输入:https://www.oracle.com/ 2.选择“java download” 3.点击“java archive” 下拉找到 java9 4.点击进入,选择windows版本 5.勾选,下载。需要账号下载 安装 1.双击安装包,下一步 2.选择安装路径,…

旅游景区官网(网站、小程序)小开发可以实现哪些功能?

伴随着我们生活水平的提升和手上的余钱愈来愈多,绝大多数人一定会选取去不同地方开展旅游,旅游也成為了经济发展的一大支撑。将来便捷用户和旅游业的发展趋势,打造出旅游景区官网(网站、H5、小程序等)开发设计是十分关…

【UE4 第一人称射击游戏】50-用另一种方法实现僵尸随机漫游 僵尸攻击玩家时造成伤害

上一篇:【UE4 第一人称射击游戏】49-僵尸攻击动画本篇效果:使用另一种逻辑实现了僵尸的随机漫游僵尸攻击玩家时会对玩家造成实质上的伤害步骤:打开“SimpleAI”,当僵尸看见玩家时,设置变量“CanSeePlayer”为False我们…

深入了解 LinkedBlockingQueue阻塞队列,分析扩容机制以及小顶堆原理

1. 前言 今天的目的是为了深入了解下优先队列的机制。不过优先队列是基于大小顶堆实现的,但是其本质就是一个二叉树,所以今天会讲一些铺垫知识,好了,废话不多说了,让我们开始吧 2. 前置知识 2.1 大顶堆 完全二叉树&am…