自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(234)
  • 收藏
  • 关注

原创 7.8.红黑树的定义和性质(红黑树英文缩写为RBT)

如上述图片,红黑树相比于二叉排序树:红黑树是二叉排序树的一种优化,因此红黑树必定是二叉排序树,二叉排序树具有"左子树中每一个结点的值<根结点的值<右子树中每一个结点的值"的特性,因此红黑树也有该特性。此外,为了保证查找、插入、删除操作的效率,红黑树还具有上述图片描述的特性红黑树相比于平衡二叉树:平衡二叉树必须满足任何一个结点的左、右子树的高度之差不超过1,红黑树就没有这个特性。

2025-06-24 12:07:08 558

原创 7.7.平衡二叉树的删除

如果一棵平衡二叉树的结点总数为n,那么该平衡二叉树删除操作的时间复杂度为O(log₂n)

2025-06-24 12:03:07 128

原创 7.6.平衡二叉树(英文缩写为AVL树)

1.平衡二叉树简称平衡树(AVL树,该缩写来源于平衡二叉树的发明人的名字简称);2.结点的平衡因子=左子树高-右子树高;3.以上述图片左下角的二叉树为例,结点50的左子树的高度为2,右子树的高度为3,因此结点50的平衡因子为2-3即-1;4.显然如果一棵二叉树是平衡的,那么各个结点的平衡因子只可能是-1、0、1,也就是绝对值不超过1,如果二叉树中有任何一个结点的平衡因子绝对值超过1,那么这棵二叉树一定不是平衡二叉树;​//平衡二叉树结点int key;

2025-06-24 11:54:30 280

原创 7.5.二叉排序树(英文缩写为BST,又名二叉查找树)

如上图,二叉排序树又名二叉查找树,英文缩写为BST,需要满足的特性:左子树中每一个结点的值<根结点的值<右子树中每一个结点的值(有的题目会要求"左>中>右"),如上述图片中左下角的树就是二叉排序树,左子树和右子树又递归地各是一棵二叉排序树,基于"左子树中每一个结点的值<根结点的值<右子树中每一个结点的值",如果中序遍历二叉排序树,可以得到一个递增的有序序列,因为中序遍历就是先遍历左子树,再遍历根结点,最后遍历右子树,

2025-06-24 11:45:49 119

原创 15.数据类型的作用

变量是一个存储数据的空间,这个空间中具体存整数、小数、字符等由数据类型决定。以上述图片为例,定义了一个变量a记录数据56,那么在内存中就有一个存储数据的空间,在这个空间中存的是56的二进制111000,不仅仅是这样,在内存中还会用如下图这么大的空间存储:如上图,前面的空间就算用不上,也会用0补齐,如下图:如上图,之所以用0补齐,是因为数据类型int,int在Windows操作系统中占4个字节,也就是32个0101,如下图:如上图,在计算机中所有的数据都是以二进制的形式进行存储,在二进制中每一个0或者1称之为

2025-06-20 11:55:30 394

原创 14.变量的注意细节

​int main()//变量之间用逗号分隔,最后一个变量后要写分号//此时表示同时定义了3个变量b、c、d,这3个变量都是int型,里面能存整数,其中b记录10,c记录20,d记录30//运行结果为b=10//运行结果为c=20//运行结果为d=30​return 0;如上述代码,一条语句可以定义多个变量,但可读性差,比如变量d一眼看不出是什么类型,还需要往前找才能得知是int型,因此建议定义变量时一行只定义一个变量。

2025-06-20 11:51:07 315

原创 13.变量

可以把变量理解为一个"盒子",把数据放入这个"盒子"中进行存储,在使用的时候直接获取"盒子"中的数据即可,而且"盒子"中的数据可以随时进行更改,从而实现"变"的效果。注:变量是存储时据的"盒子",不是里面的数据,我们只是把变量放到这个"盒子"中进行存储而已以上述图片为例,定义了一个变量int a;,变量就是存储数据的"盒子",那么这个"盒子"装整数还是小数呢?又或者是其他数据类型呢?而这个"盒子"的大小又是多少呢?

2025-06-20 11:47:46 250

原创 8.1.排序的基本概念

如上图,所谓排序,就是把杂乱无章的一堆数据元素按照一定的规则如递增重新排列一遍,总而言之经过排序算法之后,要保证最终的一堆的数据元素的关键字是有序的,在之前的章节中说过(详情见"7.1.查找的基本概念"),各个数据元素的关键字是唯一的,但在排序算法中难免会遇到关键字相同的情况,比如王者荣耀里的荣耀战力排行榜,其中荣耀战力的值为关键字,荣耀战力会遇到相同的情况;如上图,有一个网站(电脑/手机上的浏览器都可以),来自于美国的旧金山大学,这个网站可以帮助我们可视化地理解很多算法,如下图:如上图,

2025-06-10 21:40:44 462

原创 7.4.分块查找

步骤一:在索引表中确定待查记录所属的分块(注:判断待查记录在哪一个分块,可以通过顺序查找,也可以通过折半查找,因为索引表中保存的元素是有序的,并且索引表是用数组的形式即顺序存储来实现的,所以对索引表的查找也可以使用折半查找)步骤二:在所属的分块内进行顺序查找(因为分块内的元素大多是乱序存放的,所以只能采取顺序查找来依次往后对比查找)以上述图片为例,该例中查找表里的数据元素采用了顺序存储,如果该查找表需要进行元素的增加或者删除时就会效率很低,因为比如要增加一个数据元素,该数据元素的值是8,

2025-06-10 21:35:58 782

原创 7.3.折半查找(二分查找)

对于一个折半查找,如果查找区间为[low,high],中间指针mid = ( low + high ) / 2,且每次对比的是mid指针指向的数据元素,那么在查找判定树中对于任何一个结点都有"在同一个根结点下,右子树结点数-左子树结点数=0或1(右子树结点数不小于左子树结点数)"如果包含失败结点,那么折半查找(二分查找)的树高h为h+1。

2025-06-10 21:28:18 1027

原创 7.2.顺序查找

线性表分为顺序储存和链式存储,但无论是哪种存储方式,顺序查找都是适用的。以上述图片为例,比如要查找关键字43,只需要从线性表的第一个元素开始,依次往后找,最终找到了43,如下图:上述图片中的代码解读:查找表采用顺序表实现,即数据元素采用顺序存储(注:查找表也可以采用单链表、双链表等链式存储,只是Search_Seq函数里的for循环和return语句会有差别)结构体SSTable采用了动态数组(类似Java的ArrayList集合,动态数组不是链表,动态数组在CSDN收藏里有详解)的方式,其中elem指针会

2025-05-22 21:31:06 644

原创 7.1.查找的基本概念

1.查找:找到所需的数据;2.查找表:用来存储数据的数据结构;3.查找表可以是线性结构、树形结构、图结构(网状结构),因此查找表由数据元素构成;4.查找表并不是特定的数据结构,它只是对于要执行查找操作的这个数据结构的统称,所以查找表并不是新的数据结构;5.关键字:用来唯一区分各个数据元素的数据项->例一:如上图,给出了一张表,表的内容是成绩信息,每个同学会有一个学号,这个学号都是不重复的,所以可以把学号这个数据项作为区分各个数据元素的关键字,姓名无法作为关键字,因为姓名可能重复,比如上述表中的"铁柱"例二:

2025-05-22 21:25:25 574

原创 6.13.拓扑排序

如上图,拓扑排序放到AOV网中,其实就是要求找到做事的先后顺序。

2025-05-22 21:23:04 824

原创 6.12.有向无环图描述表达式

如上图,第5个生效的运算符 * 是基于第3个生效的运算符 * 得到的结果和第4个生效的运算符 * 得到的结果,所以第5个生效的运算符 * 要放在倒数第三层。如上图,第6个生效的运算符 * 是基于第5个生效的运算符 * 得到的结果和第2个生效的运算符 * 得到的结果,所以第6个生效的运算符 * 要放在倒数第四层。第5个生效的运算符 * 是基于第4个生效的运算符 * 得到的结果和第3个生效的运算符 * 得到的结果,所以第5个生效的运算符 * 要放在倒数第四层,

2025-05-22 21:14:01 763

原创 12.输出常量的两个小扩展

题目如下:解答如下:注意:前面的占位符要与后面填入的数据一一对应,因为后面填入的数据是依次填补到占位符的,第一个数据填补到第一个占位符中,第二个数据填补到第二个占位符中,以此类推。上述代码中虽然分成两行写printf语句,但最终的结果写在了同一行,如果要实现换行,该怎么写呢?其实使用换行符即可。此时用的是Windows操作系统,所以换行符是\r\n,修改结果如下:三.有关Windows操作系统的换行符\r\n:1.历史演变:如上图,在以前的机械打印机中,换行的操作是先把纸推回去,

2025-05-18 11:33:05 862

原创 11.输出常量

输出常量,很明显要用到printf函数,很多人会认为打印一个整型常量或打印一个实型常量等直接写printf(23)、printf(18.123)即可,实际上这么写不对,原因就涉及到printf函数了。占位符:通俗地理解就是在打印的时候用占位符先占个位置,之后再用真实的数据填补。

2025-05-18 11:26:01 780

原创 10.实型常量(浮点型常量)细节补充

第一题答案是B。题目要的是正确的整型常量,A是实型常量,因为12.等同于12.0;B是整型常量;C中间有逗号,使得C不是整型常量;D有空格,所以D不是整型常量;所以最终选B,任意的正整数、负整数和0都是整型常量。

2025-05-18 11:22:32 336

原创 6.11.各顶点间的最短路径问题-Floyd算法

对于Floyd算法,采用了动态规划的思想,核心内容是把一个大问题拆分为多个小问题再进行求解,每一个小问题之间有一个递进的关系,比如本篇中的Floyd算法,若求每一对顶点之间的最短路径,首先会把该问题分为n个阶段求解,求解的是对于任意一对顶点即Vi->Vj之间的最短路径,首先设置一个初始阶段:该阶段不允许Vi->Vj之间的路径存在其他的中转顶点;第二个阶段:会考虑如果允许v0顶点作为Vi->Vj之间的中转顶点,那么Vi->Vj之间的最短路径会不会有进一步的优化;

2025-05-02 19:06:50 996

原创 6.10.单源最短路径问题-Dijkstra算法

以上述图片为例来解释Dijkstra算法,其中的图是有向图,之所以不使用无向图,是因为无向图与有向图的原理一致,无向图的一条无向边就对应有向图的两条有向边,

2025-05-02 18:58:24 660

原创 6.9.单源最短路径问题-BFS算法

以上述图片为例,比如从G港到Y城,可以是G港->R城->Y城,也可以是G港->P城->Y城等,有很多条路径都可以实现从G港到Y城,但要从中找出G港到Y城距离最短的那一条路径,这就是单源最短路径问题。单源最短路径问题就是只有一个源头,从该源头出发,到达其他任意一个顶点可以走的最短路径。对于单源最短路径的题型,需要掌握BFS算法(可以求无权图的单源最短路径)和Dijkstra算法(可以求带权图和无权图的单源最短路径)。

2025-05-02 18:50:22 1189

原创 4.换行和续写

假设在本地文件中要输出数据aweihaoshuai 666,在输出这个数据时要换行写出,如下图:假设在一个文本文件中已经存在数据aweihaoshuai,如果此时再次写入数据如diyishuai,若不想把原来的数据清空,而是想接着写即续写,如下图:(按照之前的写法使用write方法写出数据会把原有的数据清空再写出数据)将数据写入文本文件的过程中,要想实现换行,只需要写出一个换行符即可(注意:不同的操作系统中换行符是不同的)。对于Windows操作系统,以下图为例:Windows操作系统的换行符是\r\n,叫

2025-04-26 15:38:15 878

原创 6.8.最小生成树

假设有一个城市叫P城,P城周围规划了学校、农场、电站、渔村、矿场,各个地方之间有上图所示的修路方案,其中数字表示修路的成本,比如修一条P城和学校之间的路需要1块钱,修一条学校和矿场之间的路需要5块钱,现在为了节省P城的财政支出,没有必要把所有的可行的道路都修一遍,因此需要制定一个修路方案,这个方案要求所有地方都是连通的即各个地方之间是相互可到达的(各个地方之间不一定是相邻的),但是成本又必须降到最低,此时有如下两种方案:左边的方案可以使得各个地方连通,代价是20块钱(图片打错了);

2025-04-18 23:13:20 940

原创 6.7.图的深度优先遍历(英文缩写DFS)

假设图使用了邻接矩阵或者邻接表存储,如上图,邻接表中各个链表中顶点号都是从左向右递增的,因此,对于某一个顶点,要找到与该顶点相邻的其他顶点,在该邻接表中找到的顺序与左边的邻接矩阵找到的顺序是一致的,因为邻接矩阵的顶点号也是从左向右递增的。下图的两个例子都是从2号顶点开始深度优先遍历图,左边的例子基于之前第一个邻接表,右边的例子基于之前第二个邻接表,由于邻接表的不同,即使从同一个顶点开始深度优先遍历,得到的遍历序列也可能不同,:深度优先遍历的过程中也是在探索各条边所连接的顶点的过程,

2025-04-18 22:58:08 815

原创 6.6.图的广度优先遍历(英文缩写BFS)

图的广度优先遍历类似于树的层序遍历(广度优先遍历),因为树是特殊的图(没有回路的图就是树)

2025-04-18 22:45:01 1014

原创 6.综合练习1-创建文件

题目要求是"在当前模块下的aaa文件夹",此时在左侧的目录中,是没有aaa文件夹的,所以要先创建a.txt文件的父级路径aaa文件夹,由于是在当前模块下操作,所以用相对路径(不带磁盘的路径)即可->注:这里不需要调用exists方法判断aaa文件夹是否存在,因为如果要创建的aaa文件夹已经存在,那么会创建失败,方法mkdirs返回false,如果aaa文件夹不存在,才会成功创建,方法mkdirs返回true。上述图片中,此时左边的目录中就会有aaa文件夹,该文件夹中会有一个a.txt文件。

2025-04-08 18:49:40 483

原创 8.方法引用综合小练习2-获取部分属性并收集到数组

首先要明确一点:map方法中所做的操作并没有创建Student对象,因此map方法中使用方法引用的话不能引用构造方法,这里可以直接使用引用静态方法改写,因为map方法在main方法里,main方法是静态的。->因此可以用stream流里的map方法把集合中的学生对象转换为姓名即字符串型(注:这不是过滤元素,不能用filter方法),再使用toArray方法收集到数组中。题目要求是"只获取姓名并放到数组当中",

2025-04-08 18:25:37 149

原创 9.C语言的常量

,比如'A','b','1'和'!'->注:单引号里的字符必须写一个,字符只能是大小写英文字母、数字或英文符号(空格也算英文符号即' ')比如:整型常量123可以用于计算,而字符串常量"123"就不能用于计算,如果仅仅只是展示,整型常量123和字符串常量"123"都可以。''虽然有单引号,但没有大小写字母、数字或英文符号中的任意一个,且长度不为1,因此就不是字符。' '里面有一个空格,空格属于英文符号,而且有单引号,所以是字符常量。'¥'这个不是字符,虽然有单引号且长度为1,但¥是$的中文符号。

2025-04-06 13:22:36 290

原创 6.5.图的基本操作

邻接矩阵以上述图片为例,例如要找C顶点除当前邻接点的下一个邻接点,可以扫描C行的数据(也可以扫描C列的数据,因为此时是无向图,邻接矩阵是对称的),直到找到除当前邻接点的下一个1,就找到了C顶点除当前邻接点的下一个邻接点,假设C顶点当前的邻接点为A顶点,邻接矩阵中A顶点之后的下一个为1的数据对应的顶点是E顶点,所以顶点C除当前邻接点A的下一个邻接点是E顶点。

2025-04-05 21:42:05 849

原创 3.字节输出流FileOutputStream写出数据的三种方式

上述图片的第三个write方法是只把b数组里的一部分数据写到指定文件中->第一个参数byte[] b就是装着要输出的数据的数组;第二个参数int off是起始索引;第三个参数int len表示要截取的个数->比如起始索引off为0,len为3,表示要写出的数据是从b数组里的0索引开始,一共写3个数据。上述图片的第二个write方法用于一次写出多个字节数据,其中需要把要写出的数据先放到一个byte类型的数组中,再把整个byte数组中的数据写到文件中->顺序是把byte数组里的元素依次写入指定文件中。

2025-04-05 21:30:56 523

原创 2.IO流的体系和字节输出流FileOutputStream的基本用法

父类对应的子类对应的子类对应的子类InputStream类FileInputStream类:File代表作用即操作本地文件的字节输入流,InputStream就是FileInputStream的父类ObjectInputStream类:Object是作用即操作对象的字节输入流, InputStream就是ObjectInputStream的父类。

2025-04-05 21:20:57 1081

原创 8.关键字

int表示整数,return表示程序结束了。

2025-04-02 13:22:37 213

原创 7.注释扩展知识点

在写注释的时候会发现一个问题,无论在写单行注释时,还是写多行注释时,注释的格式"//"和"/* */"都是手动写上去的,那如果不想要该注释了,也是手动删除,这样太麻烦->因此可以通过快捷键实现快速注释和取消注释。加注释的快捷键:ctrl+K,ctrl+C(这两个快捷键组合使用,可单行注释,可多行注释)或者ctrl+/(仅单行注释)或者ctrl+shifr+/(仅多行注释);取消注释的快捷键:ctrl+K,ctrl+U(这两个快捷键组合使用)。如下图,没有加单行注释前:如上图,如果要加单行注释,一定要先点一下

2025-04-02 13:19:21 782

原创 Java中GUI图片显示出错解决方案

如下图的imagine文件夹里的1.webp图片,此时后缀名不是.png,

2025-03-29 00:47:20 166

原创 Visual Studio 2022中打开其他项目的步骤

因此一定要找到VS项目才可以在Visual Studio 2022中进行操作与运行。此时在右侧的目录中是没有源文件的,意味着无法运行。此时右侧的目录中有源文件,是可以运行的。

2025-03-28 16:43:26 942

原创 1.IO流的概述

当玩拼图游戏时被打断,打断的过程中已经玩的游戏的进度不能丢失呀,这里可能会有疑问?

2025-03-25 12:01:30 597

原创 6.注释的基本使用

如果注释的内容比较多,一行写不下,就可以使用多行注释VS中写多行注释时先写一个/*,编译器VS会自动生成后半个 */选中要注释的内容,再ctrl+shift+/可把要注释的内容进行多行注释alt+鼠标左键:实现竖着勾画ctrl+滑轮:可修改视野单行注释:多行注释:三.注释的设置:在VS中,使用ctrl+滑轮可修改视野,但这类修改是暂时的,如果想要变成永久的,该怎么办呢?而且如果觉得注释里的字体不好看,该如何修改字体呢?未修改前:步骤:VS上方的"工具"->"选项,进入"选项"界面:打开"环境"的

2025-03-24 13:16:15 264

原创 5.HelloWorld执行流程分析

选中项目HelloWorld2的名称->鼠标右键点击该名称->在文件资源管理器中打开文件夹:其实就是打开本地文件夹。运行上述代码时编译器底层做了许多处理,通常只需要关注编写代码和运行代码即可。其中只有一个后缀名为c的文件,没有编译之后的obj文件和exe文件。所以针对一个C程序而言,完整的执行过程如上述。

2025-03-21 12:05:50 299

原创 4.HelloWorld代码分析

预处理#include<stdio.h>:表示提前找到stdio.h这个文件C语言程序的主入口:main函数(必须是main函数,名字不能变)printf是输出语句,要结合库函数#include<stdio.h>使用。

2025-03-20 22:06:51 315

原创 3.VS的使用与第一个程序Hello World(vs版)

无论是Java、Python、C、PHP等语言,第一个程序都是写Hello World,这是因为C语言之父丹尼斯 里奇写了一本书籍《C程序设计语言》中第一个程序就是展示Hello World,所以之后的编程语言都延续了这个传统,把Hello World当作是入门的第一个代码。

2025-03-20 22:02:37 834

原创 7.方法引用综合小练习1-转成自定义对象并收集到数组

【代码】7.方法引用综合小练习-转成自定义对象并收集到数组。

2025-03-20 21:55:27 135

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除