当前位置: 首页 > news >正文

24. 图论 - 图的表示种类

在这里插入图片描述

Hi,你好。我是茶桁。

之前的一节课中,我们了解了图的来由和构成,简单的理解了一下图的一些相关概念。那么这节课,我们要了解一下图的表示,种类。相应的,我们中间需要穿插一些新的知识点用于更好的去理解图,比如说邻接矩阵。

图的表示

我们一般用什么样的形式来表示图呢?方法其实也是非常多样的。一开始说到定义的时候,就采用的集合表示的方法。集合表示什么意思呢?就是我们定义里面所说的那样,G = <V, E>,一个序偶。

V和E, 集合里面的元素各是多少,用集合的那种表达式可以展开就行了,这个就叫做「集合表示」。

图形表示也很常见,上节课一开始说到这个图的由来,包括我一直跟大家说这个图是一个怎样的东西的时候,都是采用的这种非常形象直观的方式去给大家进行讲解。

那它有什么样的特征呢?图里面V中结点,都是用小圆圈来表示的,这个有序的结点对<u,v>表示由结点u指向结点v的有向边e。这个时候如果它是有方向的,那我们就把这条边的u称为e的始点,因为它是由u指向v的,v称为e的终点,或者把它俩统称为端点。

如果是一个无向图,首先我们需要先来理解一下有向、无向是一个什么样的意思。比如,在一个图里面,
我们在里边是没有箭头的,它就是一个无向图。如果是由v3指向v2,那在就有一个箭头了,它就是一个有向图,或者说有向边。

大家注意,对于无序的情况的,表示符号是用圆括号来表示的,和上面的那种尖括号是不一样的,这个要区别一下。那无序的结点对(u,v)或者(v,u),表示结点u和结点v之间的无向边。这里就不区分始点终点了,统称为端点,此时仅称u, v为边e的两个端点。如果把v放前面,u放后面也是一样,等价。因为它是无序的。

我们来看一下,怎么样根据这个图的几何表示给它转换成图形表示。首先告诉你这个图是一个集合表现的形式,是由v和e表示的。

设图G=<V, E>, 且V = {v1,v2,v3,v4,v5}, E = {e1,e2,e3,e4,e5}

我们只知道顶点和边还不够,还要知道这些边是连接着哪两个顶点的。

图中的边为: e1=(v1,v2), e2=<v1,v3>, e3=(v1,v4),e4=(v2,v3),e5=<v3,v2>,e6=(v3,v3)

这样,才算告诉你完整的信息。如果只是告诉<V,E>部份,其实等于没有告诉你任何东西,你都不知道这些边是连接了哪些顶点的。所以下面那些边的信息是关键。

需要注意的就是,第一、我们要区分它是有向边还是无向边,第二、这些点的相对位置是否重要。就比如V1是不是得画在画布的中央或者左上角,或者画在其他什么位置,这些位置重不重要。以及我们连接这些顶点的这些边,非得是直线吗?还是说圆弧也行,或者其他的曲线都行,只要连接上两个点。这些是大家需要考虑的。

这里你可以先不往后看了,自己尝试着去画一下。画的漂不漂亮完全没有关系,就包括可能有的结点,有的圈画的比较大,有的结点的这个圈画的比较小没有任何关系。包括这些点哪一个在正中间,哪一个在左上角、左下角、右上角、右下角这个完全没有任何讲究。顶多就是有一些约定俗成的习惯。就像之前说到那个概率统计里面的正态分布曲线一样。高斯分布其实有很多种,但是一般我们都给它做一个标准化,转化成标准正态分布去研究。

我们高中写解析几何题一样,你会发现往往的我们这些椭圆题或者双曲线的题,他都是以这个坐标轴圆点为中心的,那难道椭圆就不能是以其他点为中心吗?并不是这样子。其实这个更多的时候只是为了降低一种繁琐的程度,没有说就一定要怎么样怎么样,这个大家需要知道一下。

好,我们现在来看一下这个答案,G的图形表示为:

在这里插入图片描述

这道题就是这个样子,有些边是有向的,有些边呢是无向的。这个信息区分就是通过是圆括号还是尖括号来区分。尖括号就表示它是一个有向边,圆括号的就是无向的,也就没有箭头。这其中,e1、e3、e4、e6是无向边,e2、e5是有向边。具体的这些点是要画在什么样的一个位置,其实压根不重要。

比如V5这个点是一个孤立的点。它是一个孤点,那你画在任意地方都一样,都可以。只要不改变这个图的本身结构就行。你不能V3和V5连上,那这个就不行了。

接下来,我们来看一道相反的题,就是我们知道了图形表示,现在需要我们将其转成集合表示。我们已知图G=<V,E>的图形表示如下,写出相应的G的集合表示。

在这里插入图片描述

这个其实也很简单,就是分两步,一个求v一个求e。首先看一下总共有几个顶点,然后分别把它们写成一个集合。再之后,这些顶点又有多少个边相互连接,哪些边是有向的,哪些边是无向的。其答案如下:

G= <V, E> = <{1, 2, 3, 4, 5}, {<1, 1>,<1, 2>,(1, 4),(1, 5),(2, 3),❤️, 5>,<4, 3>,<4, 5>}>

题目不难,就是一种转换。带着大家熟悉一下两种表现形式。大家这时候不要嫌麻烦,或者偷懒。这个其实很简单,但是很多东西如果不去自己尝试一下,你不会发现一些可能之前发现不了的东西。不下笔的话往往不会了解到一些信息。这个只有自己去尝试了之后才能明白。

一些点需要给大家说一下,就是这些边的表现形式非常多样,外面那个大圈就是由1那一点引出来的,转转转回到了自己本身,这样画是OK的。如果我们在这里只是画一个小小的圆圈,同样表示这个边,这两个是等价的。

画成这种形状,这里这个图画成这种形状是否代表着我这个它包含的里面2345的这些点呢?其实是没有任何关系的。这个图里不存在什么包含不包含的这种关系,别看它好像给这些围起来了,里面的点好像是被它围在中间一样,不是这个样子的,所以这些边、点的表现形式非常多。更多的时候我们是看怎么样美观,怎么样写起来画起来比较工整。

这题答案,集合表现就是G=<V,E>,再把v和e给拆开,v是一个集合,所以用花括号表示。它就是这5个点,1、2、3、4、5很简单。关键是这些边,我们要把这些边给找出来。这个边其实你一个一个去找,按顺序去找就行了。它有几条边,它有哪一个指向找出来。再按照这样的顺序,把这些点给找出来,在这个集合里面。

因为集合本身是一种无序的一种结构,所以在这里顶点集写成{1,2,3,4,5}。但是如果写成一个非常乱的顺序,比如{2,4,3,5,1}也完全可以,完全等价。

学习这些不要纠结这些东西,你要知道它是一个无序结构,所以你怎么样写都OK。为什么我们一般写成这种顺序结构呢?就是美观,比较符合人类的阅读习惯。如果你非写成一个乱序,压根就不算错。同样对于e里面,e这个集合,也是一个一个括号写。它里面就是一些边的集合了,在这里,边的顺序可以任意对调。

关键还有个什么?就是大家要把这些有向边、无向边要区分开来。就是这个表示方法容易出错,容易统一的用这个圆括号去表示了,大家尽量避免这个问题。

说完了这个两种表现形式之后,我们再来看一下它们各自有什么优缺点。

首先,集合表示的优点是可以精确描述图的组成信息。因为我们已经把组成这个图的两个基本要素,一个是顶点,一个是边都给它罗列出来了。所以它是非常精确的。集合表示的缺点就是比较抽象,不易于直观理解。这个是很明显的,尤其是我们说到边,比如说我给你这个集合表现形式,虽然我告诉你哪些点有哪些边,但是你不可能像图这样一眼望过去就知道哪两个点之间有这些边连接,以及这些边是否有向还是无向,有向的话是由哪个点指向哪一个点,这里面有没有环。都不是那么直接容易看出来的。

再来看看图形表示,图形表示的优点就是集合表示的缺点反过来了,因为它可以很直观形象地表示出来,所以易于我们人类去理解。但是它有一个致病的缺点,如果这个图里面的结点或者边数量比较小的话,那用图来表示完全可以,而且非常直观。但是如果结点以及边数量非常多,几千亿个,就像这个宇宙中的这种类银河系的这种系外星系,或者超星系团,数以千万计或者说数以亿计,如果要用图形表示的话,那就不可能了。那你得画到什么时候?计算机即便能画出来,人也看不过来。

所以说,他们俩各自都有一些优缺点。

那我们关于图的表示只有这两种方式了吗?一个图形表示,一个集合表示。其实并不是,其实图的表示是一个三国争霸的状态,还有一霸没有出现,这个一霸就叫做矩阵表示。

我们在这里将它列出来给大家看一下:

A G = [ 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 ] \begin{align*} A_G = \begin{bmatrix} 0 & 1 & 0 & 0 & 1 & 1 \\ 1 & 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 1 & 1 & 0 \end{bmatrix} \end{align*} AG= 010011101000011101001011100101101110

我在这里列出来的这种形式就是矩阵表示。是不是很疑惑,这个矩阵表示是怎么样去表示一个图的呢?

除了集合以及图形表示之外,为什么会多出来这么一种矩阵表示?因为我们很多时候,尤其是进入信息化时代,大部分的数据处理都是用计算机去做的,图也不例外。我们也希望计算机能帮助我们去处理关于图的这些数据,然而对于计算机而言,集合的形式或者图形的形式都不太适合。集合的形式输入给电脑里面,电脑它往往也不大明白这个该怎么处理,图形的形式可能更差。

我们知道,现在人工智能就有一个领域叫做计算机视觉,就是专门让计算机去像人类一样拥有视觉识别的功能。不过用于处理图可能还是有点勉强。可是矩阵是一个非常适合计算机的形式,我们上线性代数的时候就知道,在计算机里面我们可以去做矩阵运算,所以就想到用矩阵能不能去表现这些图。

邻接矩阵

如果我们用矩阵来表示的话,那我们得先约定一些东西。本身矩阵和图是两个差别很大,或者说隔得有点远的东西。那我们怎么样去给它做出一些约束呢?

  • 首先,我们这个矩阵里面的这些行列需要有固定的次序,行列的位置不同,代表不同的矩阵
  • 其次,需要讲图中的结点按某种既定顺序排列
  • 再次,若并未给出具体排序,则顺序默认为书写结点集V时的结点顺序。

我们知道,即便仅仅是行列的位置不同这两个矩阵也是完全不同的。比如我把这个2*2的矩阵第一行1、2,第二行3、4做一下转置,那第一行就变成1,3,第二行就变成2、4。这就表示成两个不同的矩阵了。

所以矩阵的行列是有一个固定的次序的,它不能任意的变动。为了满足这个条件,我们需要需要将图中的结点按照某种既定的顺序做个排列。如果你没有按照这种规则去做出排列,那我们这种顺序就默认成书写这个结点集V的时候的结点顺序。

比如我们有5个点,就像我们之前那道题里面{1,2,3,4,5},分别标号是12345的是5个点,如果写成35214,没有给它一个具体的排序方式的话,我们就可以按照35214这种顺序去约定它。第一个点就对应着标号为3这个点,第二个点就是标号为5的这个点,以此类推,35214。

好,说到这里可能大家还不是很明白为什么要做这种约束。接下来就需要用到刚才说的一个内容了,设这个图是G=<V,E>,其中V={v1,v2,…,vn},并且已经确定了各结点的排列次序,则将n阶方阵 A G = ( a i j ) n x n A_G=(a_{ij})_{nxn} AG=(aij)nxn称为G的邻接矩阵,其中:
a i j = { 1 , 若 V i 与 V j 间右边 0 , 若 V i 与 V j 间无边 i , j = 1 , 2 , . . . , n \begin{align*} a_{ij}=\begin{cases}1, 若V_i与V_j间右边 \\ 0, 若V_i与V_j间无边 \end{cases} & i,j = 1, 2, ..., n \end{align*} aij={1,ViVj间右边0,ViVj间无边i,j=1,2,...,n
这个邻接矩阵里面的每一个元素 a i j a_{ij} aij它代表了代表了这个矩阵里面第i行、第j列的这个元素。它的取值只有1和0。这个逻辑关系其实非常简单,就是说你vi这个点和vj这个点如果是有边连接的话,你对应的这个元素就是1,如果两个点之间没有边的话,那它就是0,这个是只有两个取值的。所以这个邻接矩阵本身的取值是非常简单。取1还是取0就完全取决于e,就是看e。如果有边就是1,无边就是0。

我们接下来看一个例子,给出了一个图G,写出图G的邻接矩阵。

在这里插入图片描述

这个里面总共有V1到V6总共有6个点,我们就按照这个下标的顺序来给它做个排列。

按照下标的顺序排列也就是说行方向是按照V1到V6的方向,列方向也是按照V1到V6的这个方向去排布。然后我们会观察到,行和列所交的位置代表了V1和V2之间有没有连线。如果有的话就是1,没有的话就是0。

大家可以去自己尝试一下,你就看一下矩阵列出来是怎样一个形式。我这里给大家列一下:

在这里插入图片描述

因为V1、V6都是一样的,大家会发现这个矩阵其实是一个对称的结构。因为, 行1列2是表示V1和V2连线,是1,行2列1呢,同样表示V1和V2的连线,也是1。所以对于无向图而言,邻接矩阵就是一个对称的结构,是一个沿对角线对称的结构。

但是如果是一个有向图的话那就不一样了,这个时候约定V1行代表了由V1指向的点,如果在这里V1、V2之间的这条边是由V1指向V2的,方向是指向V2的,在行1,它代表V1指向V2。但是如果在行2就又不一样了,代表了由V2指向V1。

我们再反过来看,如果箭头是由V1指向V2的话,并没有一条边由V2指向V1,在这里它就是0了。所以有向图无向图在这方面会稍微有点不一样,大家注意一下就OK了,其实它表达的意思呢很简单。

A G = [ 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 ] \begin{align*} A_G = \begin{bmatrix} 0 & 1 & 0 & 0 & 1 & 1 \\ 1 & 0 & 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 & 0 & 1 \\ 1 & 0 & 1 & 1 & 1 & 0 \end{bmatrix} \end{align*} AG= 010011101000011101001011100101101110

写成这个形式的就跟刚才一样了。

那么我们刚才呢说了很多这种约束条件,就比如说这个图的邻接矩阵,因为行和列位置交换一下的话都对应着不同的矩阵,所以我们说了要约定这个节点或者说顶点的一个默认排序。那在这里我们探讨一下,图的这个邻接矩阵这个矩阵的形式是唯一的吗?

  • 一般而言,同一个图按照不同的顶点排列次序,写出的邻接矩阵形式上是不同的,但是相互之间可以通过调换某些行或列的位置而得到。
  • 对邻接矩阵的行或列进行交换,对应的实际上是在对顶点的排序中调换顶点的位置。
  • 若不考虑顶点排序的不同产生的邻接矩阵的不同,则图与邻接矩阵之间是一一对应的。
  • 实际操作上,往往略去顶点排序不同导致的邻接矩阵的多样性, 选择任意一种顶点次序得出的邻接矩阵作为该图的邻接矩阵。

以上几句话的意思就是告诉大家,不要纠结,你选定一个之后,把这个顶点的排列顺序给写下来,然后我们就按照这个顺序去做这个邻接矩阵就行了。不用去管它有可能会有其他形式的一个排列,其他形式的排列你不能说它不合理,都是合理的,但是不用去管那些。就按照你写的这个去做就可以了。

在说了图的邻接矩阵之后,我们已经学了三种图的表现形式了。一个集合表示、一个图形表示、还有矩阵的一个表现形式。接下来,我们要来看看图的种类。

图的种类

其实图的分类方法也有非常多种,首先按照它这个边有没有方向我们可以分成3类。一类是有向的,就比如下面这张图:

在这里插入图片描述

一类是无向图,就是它这个边都没有方向的:

在这里插入图片描述

还有一类就是混合图,混合图就是里面既有有向的边,也有无向的边,这种叫做混合图。

在这里插入图片描述

混合图大家不要觉得奇怪,往往也会有一些实际运用。它这些边看似感觉像是没有方向的,但是实际上它代表了一对方向相反的连接相同端点的一对。在混合图中,可以将无向边转换为方向相反的两条有向边来处理:

在这里插入图片描述
在这里插入图片描述
为什么要做这样的转换呢?因为我们知道有向边和无向边的处理是有点不一样,就像我们在写程序的时候,把一个int和一个浮点型的变量加在一起的话,这个程序自动的会做一个强制类型转换。就变成一个精度更高的浮点型的形式。

如果按照图的里面有无平行边(重边)来分类的话,可以分成以下几类:

多重图:有平行边的图

在这里插入图片描述

线图:无平行边的图
在这里插入图片描述

简单图:无环的线图

在这里插入图片描述

简单图和线图之间的区别,就是看它有没有环。

还有一种分类方法,按边,或者顶点是否赋于权重进行分类,氛围赋权图和无权图。

赋权图: G是一个三重组<V,E,g>或四重组<V,E,f,g>, 其中V是结点集合,E是边的集合,f是V到负实数集合的函数,g是从E到非负实数集合的函数。

关于「权」,我们刚才所说的,包括之前那个高铁线路的例子里面,高铁线路里面线段的长度并不代表真实的这个线段长度的关系。图边的长度并不能代表任何东西,没有任何含义。当然在这我们就可以通过赋予权重的形式来给图更多的实际意义。

赋权图其实和图的定义非常相似,只不过就是多了一个或者两个函数。f是关于V,也就是从顶点到非负实数的一个映射函数。它可以把每一个顶点赋予一个非负实数。g是给每一条边赋予一个非负实数,它们都是一个函数。

在这里插入图片描述

这张图中,有a b c d四个点。现在我们不单单的是只有点和边,给每个顶点赋予了一些数字,同样的给每条边赋予了一些数字。先不管它这个实际意义是什么,只是一种抽象的数据结构。我们可以人为的给它这些数字,赋予一些意义。比如说可以表示距离,a、d和b、d之间的一个距离。

顶点的数值又代表了城市的半径有多大,我们可以根据自己的需要去赋予它实际意义。但是它对应的这种数据的数学抽象模型都是一样的。

我们根据题目里面给的这些数字能不能写出这个相应的函数呢?

f(a)=9, f(b)=6,f©=7,f(d)=10,g((a,b))=50,g((a,c))=70,g((a,d))=45,g((b,d))=40,g((c,d))=35。

其实形式也非常简单,我们就需要注意一下关于顶点一般约定俗称是用f来表示,g是代表了边的函数。所以在这里,a、b是用这个括号括起来,代表一个边,所以它是套两层括号。

就是把这个函数名称写出来,然后括号再加上你对应的顶点或者对应的边,数值是多少,就是这么简单。这个就是赋权图里面函数的写法。

赋权图函数,这些数字的含义往往在我们一些优化方式里面,尤其是在一些路径规划里面是非常有用的。有的同学可能是学过像greedy这种弹性算法,它这里面往往针对的就是有这种权重的图去研究的。因为它要算最短路径,图如果没有赋予它相应的权重的话,那它没有意义。

还有一件事大家可以注意一下,就是赋权图要么是一个三重组合,要么是一个四重组合。也就是说,要么是<V,E,g>, 要么是<V,E,f,g>。这里面不管是三重还是四重,都包含了g。而f往往是可有可无的。

这代表往往大部分情况,如果研究有权图边的权重绝大部分情况下都是有的。几乎你不会遇到只有顶点有权重而边没有权重这种情况。顶点可以没有权重,但一般按照实际问题来讨论的话,往往边的权重是会有的。

现在我们一共了解了三种分类方法,不过大家不要觉得这三种方法是彼此孤立的、只是一个单纯的并列关系,并不是这个样。往往是综合应用的,比如刚才我们举例的赋权图,全称应该是「无向赋权简单图」。

首先,它是一个无线的,第二它有权重,第三呢,它是一个简单图,因为它是一个无环的线图。

OK,在讲完图的种类之后,咱们这节课就结束了。下节课就是比较有意思的一个点了,「最短路径问题」是非常重要的一个问题。

相关文章:

24. 图论 - 图的表示种类

Hi&#xff0c;你好。我是茶桁。 之前的一节课中&#xff0c;我们了解了图的来由和构成&#xff0c;简单的理解了一下图的一些相关概念。那么这节课&#xff0c;我们要了解一下图的表示&#xff0c;种类。相应的&#xff0c;我们中间需要穿插一些新的知识点用于更好的去理解图…...

C++ 读bin文件,部分代码。赚经验。

编号:1 Head: magicWord[0] 0x0102 magicWord[1] 0x0304 magicWord[2] 0x0506 magicWord[3] 0x0708 version 0x02010004 totalPacketLen 288 platform 0x000a1443 frameNumber 12 timeCpuCycles 172969774 numDetectedObj 99 numTLVs 2 subFrameNumber 0 TLV…...

vue3 父子组件传值

一&#xff0c;子传父 父组件 <script setup> import HelloWorld from ./components/HelloWorld.vue import { ref } from vue//直接赋值页面不会自动渲染&#xff0c;使用ref存储响应式数据 import { defineExpose } from "vue";父传子 let val ref(); con…...

【看懂MPLS LSP表项】

IP网络 R1根据路由表项去查FIB表 目的网络、出口、下一跳 MPLS网络 R1根据LFIB表现去查表&#xff0c; 路由&#xff0c;出口、(标签) 要实现MPLS网络全局可达性&#xff0c;R1应具有到每一个LSR、LSE的路由。 1、R1去FEC(转发等价类) /去往2.2.2.2的路由《路由方…...

代码随想录训练营 单调栈

代码随想录训练营 单调栈 84. 柱状图中最大的矩形&#x1f338; 最后一天~ 84. 柱状图中最大的矩形&#x1f338; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最…...

Android MQTT

MQTT Android MQTT连接,重新编译Service-1.1.1兼容Android高版本服务 Paho Android Service-1.1.1 Paho Client Mqtt3-1.1.0 资源 名字资源AAR下载GitHub查看Gitee查看 Maven 1.build.grade allprojects {repositories {...maven { url https://jitpack.io }} }2./app/bu…...

Codeforces Round 823 (Div. 2)C

更好的阅读体验 C. Minimum Notation 思路&#xff1a;我们可以进行的操作时将一个位置的数删除然后在任意位置处添加一个比当前数大1并且小于9的数&#xff0c;所以我们的操作只会让一个数变大&#xff0c;我们统计一个最大值的后缀&#xff0c;贪心的考虑如果当前数的后面有…...

npm发布vue3自定义组件库--方法一

npm发布vue3自定义组件库 创建项目 vue create test-ui自定义组件 创建自定义组件&#xff0c;组件名称根据你的需求来&#xff0c;最好一个组件一个文件夹&#xff0c;下图是我的示例。 src/components 组件和你写页面一样&#xff0c;所谓组件就是方便实用&#xff0c;不…...

Centos7原生hadoop环境,搭建Impala集群和负载均衡配置

Centos7原生hadoop环境&#xff0c;搭建Impala集群和负载均衡配置 impala介绍 Impala集群包含一个Catalog Server (Catalogd)、一个Statestore Server (Statestored) 和若干个Impala Daemon (Impalad)。Catalogd主要负责元数据的获取和DDL的执行&#xff0c;Statestored主要负…...

如何在macOS上安装Go并搭建本地编程环境

引言 Go是一种诞生于挫折中的编程语言。在谷歌&#xff0c;开发人员厌倦了在为新项目选择语言时必须做出权衡。有些语言执行效率很高&#xff0c;但需要很长时间编译&#xff0c;而另一些语言易于编写&#xff0c;但在生产环境中运行效率很低。因此&#xff0c;谷歌发明了Go语…...

postgresql-存储过程

postgresql-存储过程 简述PL/pgSQL 代码块结构示例嵌套子块 声明与赋值控制结构IF 语句CASE 语句简单case语句搜索 CASE 语句 循环语句continuewhilefor语句遍历查询结果 foreach 游标游标传参 错误处理报告错误和信息检查断言 捕获异常自定义函数重载VARIADIC 存储过程示例事务…...

改造user ,使得userId相同视为一个对象,user是Key,User的username做value

如果您想要将具有相同userId的用户视为一个对象&#xff0c;其中User对象是键&#xff0c;而User对象的username是值&#xff0c;您可以使用Java的Map<User, String>数据结构来实现。以下是示例代码&#xff1a; java import java.util.*;class User {private int userI…...

力扣刷题-数组-滑动窗口法相关题目总结

209. 长度最小的子数组&#xff08;最小滑窗&#xff09; 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&…...

Qt创建线程(线程池)

1.线程池可以创建线程统一的管理线程&#xff08;统一创建、释放线程&#xff09; 2.使用线程池方法实现点击开始按钮生成10000个随机数&#xff0c;然后分别使用冒泡排序和快速排序排序这10000个随机数&#xff0c;最后在窗口显示排序后的数字&#xff1a; mainwindow.h文件…...

【Java】泛型 之 使用泛型

使用ArrayList时&#xff0c;如果不定义泛型类型时&#xff0c;泛型类型实际上就是 Object&#xff1a; // 编译器警告: List list new ArrayList(); list.add("Hello"); list.add("World"); String first (String) list.get(0); String second (Strin…...

消费者NPS调查,帮您了解客户满意度!

随着市场竞争的日益激烈&#xff0c;了解消费者需求和对企业品牌的认知程度&#xff0c;对于企业的持续发展至关重要。您的客户对您的产品或服务有多满意?您是否想提升客户忠诚度&#xff0c;从而增加业务的持续增长?群狼调研(长沙产品包装测试)为您提供全新的消费者NPS调查服…...

Webpack监视文件修改,自动重新打包文件

方法一&#xff1a;使用watch监视文件变化 在终端中输入以下指令&#xff1a; npx webpack --watch 我们使用这种方法监听文件变化时只会监听我们计算机本地的文件变化&#xff0c;在开发场景中我们的项目是要部署到服务器中的&#xff0c;因此这种方式并不推荐。 方法二&…...

list容器排序案例

案例描述:将Perspn自定义数据类型进行排序&#xff0c;Person中属性有姓名、年龄、身高 排序规则:按照年龄进行升序&#xff0c;如果年龄相同按照身高进行降序 代码示例 #include <iostream> #include <string.h> #include <iterator> #include <vector…...

PHP使用Analysis中英文分词

1、下载Analysis&#xff0c;创建test.php测试 2、引入Analysis实现中文分词 <?php include "./Analysis/Analysis.php";$annew \WordAnalysis\Analysis(); $content"机器学习是一门重要的技术&#xff0c;可以用于数据分析和模式识别。"; //10分词数…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR录像存储功能如何优化?具体步骤是什么?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。视频监控系统EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…...

Web服务(Web Service)

简介 Web服务&#xff08;Web Service&#xff09;是一种Web应用开发技术&#xff0c;用XML描述、发布、发现Web服务。它可以跨平台、进行分布式部署。 Web服务包含了一套标准&#xff0c;例如SOAP、WSDL、UDDI&#xff0c;定义了应用程序如何在Web上实现互操作。 Web服务的服…...

Java第4章 类的继承

目录 内容说明 章节内容 一、继承的概念 二、继承的使用 extends关键字...

Linux网络和安全:配置、远程访问与防御指南

文章目录 Linux 网络和安全引言网络配置IP地址配置配置网络接口防火墙设置安全性加强 Linux网络配置及端口管理网络配置命令端口管理 防火墙和安全性设置防火墙管理工具安全性设置 Linux远程访问技术&#xff1a;SSH和VPNSSHVPN Linux软件和服务网络工具文件传输VPN技术安全审计…...

如何搭建Linux环境

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 当我们想要搭建一个Linux系统&#xff0c;我们应该怎么使用呢&#xff1f; 今天我就带领大家搭建Linux系统&#xff01;&#xff01;&#xff01; 目录 Linux环境安装 双系统&#xff08;不推荐&#xff09; poww…...

【解决方案】edge浏览器批量添加到集锦功能消失的解决方案

edge的集锦功能很好用&#xff0c;右键标签页会出现如下选项&#xff1a; 但在某次edge更新后&#xff0c;右键标签页不再出现该选项&#xff1a; 这里可以参考为什么我的Edge浏览器右键标签页没有“将所有标签页添加到集锦”功能&#xff1f; - Microsoft Community 一文提出…...

JS操作字符串方法学习系列(1)-每天学习10个方法

目录 **字符串连接 (Concatenation)**:**字符串长度 (Length)**:**字符串查找 (Search)**:**字符串替换 (Replace)**:**字符串分割 (Split)**:**字符串大小写转换 (Case Conversion)**:**字符串切片 (Slice)**:**字符串删除空白 (Trim)**:**字符串检查开头和结尾 (Starts/EndsW…...

iterator和generator

iterator和generator iterator es6: let/const ...展开 迭代器 是一种机制&#xff0c;比如在控制台输出Iterator是没有这个类的&#xff0c;为不同的数据结构提供迭代循环的机制。 迭代器对象&#xff1a;具备next方法&#xff0c;next能够对你指定的数据进行迭代循环&#x…...

ipv6笔记及总结

1、路由器请求消息Router Solicitation和路由器通告Router Advertisement消息主要用于无状态地址的情况下&#xff0c;有状态的情况使用的是dhcpv6 server分配&#xff08;例如&#xff1a;IPv6地址以及其他信息&#xff08;DNS、域名等&#xff09;&#xff09;。 2、关于IPv…...

64位Ubuntu20.04.5 LTS系统安装32位运行库

背景&#xff1a; 在ubutu&#xff08;版本为20.04.5 LTS&#xff09;中运行./arm-none-linux-gnueabi-gcc -v 后提示“no such device”。 经多方查证&#xff0c;是ubutu的版本是64位的&#xff0c;而需要运行的编译工具链是32位的&#xff0c;因此会不兼容。 解决方法就是在…...

关于vue.config.js

关于vue.config.js 简述 vue.config.js是一个可选的配置文件&#xff0c;如果项目的根目录中存在这个文件&#xff0c;那么它就会被vue/cli-service自动加载。你也可以使用package.json中的vue字段&#xff0c;但是注意这种写法需要你严格遵守JSON的格式来写。 这个文件应该…...

衡水注册公司流程和费用/自动app优化最新版

阅读目录 一&#xff1a;前言 二&#xff1a;多线程实现数组排序 一&#xff1a;前言 数组大小是计划对多少个数组元素进行排序&#xff0c;线程个数是你计划用多少个线程进行排序操作 二&#xff1a;多线程实现数组排序 private int[] array; private DateTime StartTi…...

自己的网站怎么和百度做友链/阳西网站seo

laravel 数据迁移实现订单列表 1,需要创建一个订单表表结构2,由于一个订单可能会包含多个商品,使用,需要一个从表3,创建订单控制器laravel 运行指定单个迁移文件1,需要创建一个订单表 在创建模型的时候再创建数据库迁移文件 php artisan make:model Order -m 完善数据…...

怎样做投资与理财网站/腾讯域名注册官网

运行内部类的main方法定义两个线程&#xff1a;一个线程的名字“thread1”,线程功能输出1~10的阶乘。另一个线程的名字“thread2”,线程功能输出线程的名字10次。public class T1 extends Thread {public T1(String s) {super(s);}public void run() {int sum1;for(int i1;i<…...

做网站设计要适配到手机端么/惠州seo代理计费

。反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题 解&#xff1a; 被绕晕了&#xff0c;最近少写代码&#xff0c;太垃圾了自己&#xff0c;后…...

wordpress主题代码框架/seo优化的技巧

这个作业属于哪个课程&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3341 团队名称&#xff1a;仰望星空 https://www.cnblogs.com/as…...

怎么用PS做珠宝网站/百度推广网址

拓扑排序 【任务】 对一个有向无环图拓扑排序 【说明】 用一个队列实现&#xff0c;先把入度为0的点放入队列。然后考虑不断在图中删除队列中的点&#xff0c;每次删除一个点都会产生一些新的入度为0的点&#xff0c;把这些点插入队列。 【接口】 bool toposort(); 复杂度&…...