图的顺序存储结构

news2024/11/16 13:30:29

目录

图的顺序存储结构

图的顺序存储结构C语言实现

图的邻接表存储结构详解

邻接表计算顶点的出度和入度

图的十字链表存储结构

图的邻接多重表存储结构


图的顺序存储结构

使用图结构表示的数据元素之间虽然具有“多对多”的关系,但是同样可以采用顺序存储,也就是使用数组有效地存储图。

使用数组存储图时,需要使用两个数组,一个数组存放图中顶点本身的数据(一维数组),另外一个数组用于存储各顶点之间的关系(二维数组)。

存储图中各顶点本身数据,使用一维数组就足够了;存储顶点之间的关系时,要记录每个顶点和其它所有顶点之间的关系,所以需要使用二维数组。

不同类型的图,存储的方式略有不同,根据图有无权,可以将图划分为两大类:图和网 。

图,包括无向图和有向图;

网,是指带权的图,包括无向网和有向网。

存储方式的不同,指的是:在使用二维数组存储图中顶点之间的关系时,如果顶点之间存在边或弧,在相应位置用 1 表示,反之用 0 表示;如果使用二维数组存储网中顶点之间的关系,顶点之间如果有边或者弧的存在,在数组的相应位置存储其权值;反之用 0 表示。

结构代码表示:

  1. #define MAX_VERtEX_NUM 20 //顶点的最大个数
  2. #define VRType int //表示顶点之间的关系的变量类型
  3. #define InfoType char //存储弧或者边额外信息的指针变量类型
  4. #define VertexType int //图中顶点的数据类型
  5. typedef enum{DG,DN,UDG,UDN}GraphKind; //枚举图的 4 种类型
  6. typedef struct {
  7. VRType adj; //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值。
  8. InfoType * info; //弧或边额外含有的信息指针
  9. }ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM];
  10. typedef struct {
  11. VertexType vexs[MAX_VERtEX_NUM]; //存储图中顶点数据
  12. AdjMatrix arcs; //二维数组,记录顶点之间的关系
  13. int vexnum,arcnum; //记录图的顶点数和弧(边)数
  14. GraphKind kind; //记录图的种类
  15. }MGraph;

有向图和无向图


图1 有向图和无向图


例如,存储图 1 中的无向图(B)时,除了存储图中各顶点本身具有的数据外,还需要使用二维数组存储任意两个顶点之间的关系。

由于 (B) 为无向图,各顶点没有权值,所以如果两顶点之间有关联,相应位置记为 1 ;反之记为 0 。构建的二维数组如图 2 所示。


 

无向图对应的二维数组arcs


图2 无向图对应的二维数组arcs


在此二维数组中,每一行代表一个顶点,依次从 V1 到 V5 ,每一列也是如此。比如 arcs[0][1] = 1 ,表示 V1 和 V2 之间有边存在;而 arcs[0][2] = 0,说明 V1 和 V3 之间没有边。

对于无向图来说,二维数组构建的二阶矩阵,实际上是对称矩阵,在存储时就可以采用压缩存储的方式存储下三角或者上三角。

通过二阶矩阵,可以直观地判断出各个顶点的度,为该行(或该列)非 0 值的和。例如,第一行有两个 1,说明 V1 有两个边,所以度为 2。

存储图 1 中的有向图(A)时,对应的二维数组如图 3 所示:


 

有向图对应的二维数组arcs


图 3 有向图对应的二维数组arcs


例如,arcs[0][1] = 1 ,证明从 V1 到 V2 有弧存在。且通过二阶矩阵,可以很轻松得知各顶点的出度和入度,出度为该行非 0 值的和,入度为该列非 0 值的和。例如,V1 的出度为第一行两个 1 的和,为 2 ; V1 的入度为第一列中 1 的和,为 1 。所以 V1 的出度为 2 ,入度为 1 ,度为两者的和 3 。

图的顺序存储结构C语言实现

 
  1. #include <stdio.h>
  2. #define MAX_VERtEX_NUM 20 //顶点的最大个数
  3. #define VRType int //表示顶点之间的关系的变量类型
  4. #define InfoType char //存储弧或者边额外信息的指针变量类型
  5. #define VertexType int //图中顶点的数据类型
  6. typedef enum{DG,DN,UDG,UDN}GraphKind; //枚举图的 4 种类型
  7. typedef struct {
  8. VRType adj; //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值。
  9. InfoType * info; //弧或边额外含有的信息指针
  10. }ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM];
  11. typedef struct {
  12. VertexType vexs[MAX_VERtEX_NUM]; //存储图中顶点数据
  13. AdjMatrix arcs; //二维数组,记录顶点之间的关系
  14. int vexnum,arcnum; //记录图的顶点数和弧(边)数
  15. GraphKind kind; //记录图的种类
  16. }MGraph;
  17. //根据顶点本身数据,判断出顶点在二维数组中的位置
  18. int LocateVex(MGraph * G,VertexType v){
  19. int i=0;
  20. //遍历一维数组,找到变量v
  21. for (; i<G->vexnum; i++) {
  22. if (G->vexs[i]==v) {
  23. break;
  24. }
  25. }
  26. //如果找不到,输出提示语句,返回-1
  27. if (i>G->vexnum) {
  28. printf("no such vertex.\n");
  29. return -1;
  30. }
  31. return i;
  32. }
  33. //构造有向图
  34. void CreateDG(MGraph *G){
  35. //输入图含有的顶点数和弧的个数
  36. scanf("%d,%d",&(G->vexnum),&(G->arcnum));
  37. //依次输入顶点本身的数据
  38. for (int i=0; i<G->vexnum; i++) {
  39. scanf("%d",&(G->vexs[i]));
  40. }
  41. //初始化二维矩阵,全部归0,指针指向NULL
  42. for (int i=0; i<G->vexnum; i++) {
  43. for (int j=0; j<G->vexnum; j++) {
  44. G->arcs[i][j].adj=0;
  45. G->arcs[i][j].info=NULL;
  46. }
  47. }
  48. //在二维数组中添加弧的数据
  49. for (int i=0; i<G->arcnum; i++) {
  50. int v1,v2;
  51. //输入弧头和弧尾
  52. scanf("%d,%d",&v1,&v2);
  53. //确定顶点位置
  54. int n=LocateVex(G, v1);
  55. int m=LocateVex(G, v2);
  56. //排除错误数据
  57. if (m==-1 ||n==-1) {
  58. printf("no this vertex\n");
  59. return;
  60. }
  61. //将正确的弧的数据加入二维数组
  62. G->arcs[n][m].adj=1;
  63. }
  64. }
  65. //构造无向图
  66. void CreateDN(MGraph *G){
  67. scanf("%d,%d",&(G->vexnum),&(G->arcnum));
  68. for (int i=0; i<G->vexnum; i++) {
  69. scanf("%d",&(G->vexs[i]));
  70. }
  71. for (int i=0; i<G->vexnum; i++) {
  72. for (int j=0; j<G->vexnum; j++) {
  73. G->arcs[i][j].adj=0;
  74. G->arcs[i][j].info=NULL;
  75. }
  76. }
  77. for (int i=0; i<G->arcnum; i++) {
  78. int v1,v2;
  79. scanf("%d,%d",&v1,&v2);
  80. int n=LocateVex(G, v1);
  81. int m=LocateVex(G, v2);
  82. if (m==-1 ||n==-1) {
  83. printf("no this vertex\n");
  84. return;
  85. }
  86. G->arcs[n][m].adj=1;
  87. G->arcs[m][n].adj=1;//无向图的二阶矩阵沿主对角线对称
  88. }
  89. }
  90. //构造有向网,和有向图不同的是二阶矩阵中存储的是权值。
  91. void CreateUDG(MGraph *G){
  92. scanf("%d,%d",&(G->vexnum),&(G->arcnum));
  93. for (int i=0; i<G->vexnum; i++) {
  94. scanf("%d",&(G->vexs[i]));
  95. }
  96. for (int i=0; i<G->vexnum; i++) {
  97. for (int j=0; j<G->vexnum; j++) {
  98. G->arcs[i][j].adj=0;
  99. G->arcs[i][j].info=NULL;
  100. }
  101. }
  102. for (int i=0; i<G->arcnum; i++) {
  103. int v1,v2,w;
  104. scanf("%d,%d,%d",&v1,&v2,&w);
  105. int n=LocateVex(G, v1);
  106. int m=LocateVex(G, v2);
  107. if (m==-1 ||n==-1) {
  108. printf("no this vertex\n");
  109. return;
  110. }
  111. G->arcs[n][m].adj=w;
  112. }
  113. }
  114. //构造无向网。和无向图唯一的区别就是二阶矩阵中存储的是权值
  115. void CreateUDN(MGraph* G){
  116. scanf("%d,%d",&(G->vexnum),&(G->arcnum));
  117. for (int i=0; i<G->vexnum; i++) {
  118. scanf("%d",&(G->vexs[i]));
  119. }
  120. for (int i=0; i<G->vexnum; i++) {
  121. for (int j=0; j<G->vexnum; j++) {
  122. G->arcs[i][j].adj=0;
  123. G->arcs[i][j].info=NULL;
  124. }
  125. }
  126. for (int i=0; i<G->arcnum; i++) {
  127. int v1,v2,w;
  128. scanf("%d,%d,%d",&v1,&v2,&w);
  129. int m=LocateVex(G, v1);
  130. int n=LocateVex(G, v2);
  131. if (m==-1 ||n==-1) {
  132. printf("no this vertex\n");
  133. return;
  134. }
  135. G->arcs[n][m].adj=w;
  136. G->arcs[m][n].adj=w;//矩阵对称
  137. }
  138. }
  139. void CreateGraph(MGraph *G){
  140. //选择图的类型
  141. scanf("%d",&(G->kind));
  142. //根据所选类型,调用不同的函数实现构造图的功能
  143. switch (G->kind) {
  144. case DG:
  145. return CreateDG(G);
  146. break;
  147. case DN:
  148. return CreateDN(G);
  149. break;
  150. case UDG:
  151. return CreateUDG(G);
  152. break;
  153. case UDN:
  154. return CreateUDN(G);
  155. break;
  156. default:
  157. break;
  158. }
  159. }
  160. //输出函数
  161. void PrintGrapth(MGraph G)
  162. {
  163. for (int i = 0; i < G.vexnum; i++)
  164. {
  165. for (int j = 0; j < G.vexnum; j++)
  166. {
  167. printf("%d ", G.arcs[i][j].adj);
  168. }
  169. printf("\n");
  170. }
  171. }
  172. int main() {
  173. MGraph G;//建立一个图的变量
  174. CreateGraph(&G);//调用创建函数,传入地址参数
  175. PrintGrapth(G);//输出图的二阶矩阵
  176. return 0;
  177. }

注意:在此程序中,构建无向网和有向网时,对于之间没有边或弧的顶点,相应的二阶矩阵中存放的是 0。目的只是为了方便查看运行结果,而实际上如果顶点之间没有关联,它们之间的距离应该是无穷大(∞)。


例如,使用上述程序存储图 4(a)的有向网时,存储的两个数组如图 4(b)所示:


 

有向网


图 4 有向网


相应地运行结果为:

2
6,10
1
2
3
4
5
6
1,2,5
2,3,4
3,1,8
1,4,7
4,3,5
3,6,9
6,1,3
4,6,6
6,5,1
5,4,5
0 5 0 7 0 0
0 0 4 0 0 0
8 0 0 0 0 9
0 0 5 0 0 6
0 0 0 5 0 0
3 0 0 0 1 0


总结一下,本节主要详细介绍了使用数组存储图的方法,在实际操作中使用更多的是链式存储结构,例如邻接表、十字链表和邻接多重表

图的邻接表存储结构详解

通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表、邻接多重表和十字链表。

本节先讲解图的邻接表存储法。邻接表既适用于存储无向图,也适用于存储有向图。

在具体讲解邻接表存储图的实现方法之前,先普及一个"邻接点"的概念。在图中,如果两个点相互连通,即通过其中一个顶点,可直接找到另一个顶点,则称它们互为邻接点。

邻接指的是图中顶点之间有边或者弧的存在。

邻接表存储图的实现方式是,给图中的各个顶点独自建立一个链表,用节点存储该顶点,用链表中其他节点存储各自的临界点。

与此同时,为了便于管理这些链表,通常会将所有链表的头节点存储到数组中(也可以用链表存储)。也正因为各个链表的头节点存储的是各个顶点,因此各链表在存储临界点数据时,仅需存储该邻接顶点位于数组中的位置下标即可。

例如,存储图 1a) 所示的有向图,其对应的邻接表如图 1b) 所示:


 

邻接表存储有向图


图 1 邻接表存储有向图


拿顶点 V1 来说,与其相关的邻接点分别为 V2 和 V3,因此存储 V1 的链表中存储的是 V2 和 V3 在数组中的位置下标 1 和 2。

从图 1 中可以看出,存储各顶点的节点结构分为两部分,数据域和指针域。数据域用于存储顶点数据信息,指针域用于链接下一个节点,如图 2 所示:


 

邻接表节点结构


图 2 邻接表节点结构


在实际应用中,除了图 2 这种节点结构外,对于用链接表存储网(边或弧存在权)结构,还需要节点存储权的值,因此需使用图 3 中的节点结构


 

邻接表存储网结构使用的节点


图 3 邻接表存储网结构使用的节点


图 1 中的链接表结构转化为对应 C 语言代码如下:

  1. #define MAX_VERTEX_NUM 20//最大顶点个数
  2. #define VertexType int//顶点数据的类型
  3. #define InfoType int//图中弧或者边包含的信息的类型
  4. typedef struct ArcNode{
  5. int adjvex;//邻接点在数组中的位置下标
  6. struct ArcNode * nextarc;//指向下一个邻接点的指针
  7. InfoType * info;//信息域
  8. }ArcNode;
  9. typedef struct VNode{
  10. VertexType data;//顶点的数据域
  11. ArcNode * firstarc;//指向邻接点的指针
  12. }VNode,AdjList[MAX_VERTEX_NUM];//存储各链表头结点的数组
  13. typedef struct {
  14. AdjList vertices;//图中顶点的数组
  15. int vexnum,arcnum;//记录图中顶点数和边或弧数
  16. int kind;//记录图的种类
  17. }ALGraph;

邻接表计算顶点的出度和入度

使用邻接表计算无向图中顶点的入度和出度会非常简单,只需从数组中找到该顶点然后统计此链表中节点的数量即可。

而使用邻接表存储有向图时,通常各个顶点的链表中存储的都是以该顶点为弧尾的邻接点,因此通过统计各顶点链表中的节点数量,只能计算出该顶点的出度,而无法计算该顶点的入度。

对于利用邻接表求某顶点的入度,有两种方式:

  1. 遍历整个邻接表中的节点,统计数据域与该顶点所在数组位置下标相同的节点数量,即为该顶点的入度;
  2. 建立一个逆邻接表,该表中的各顶点链表专门用于存储以此顶点为弧头的所有顶点在数组中的位置下标。比如说,建立一张图 1a) 对应的逆邻接表,如图 4 所示:


 

逆邻接表示意图


图 4 逆邻接表示意图


对于具有 n 个顶点和 e 条边的无向图,邻接表中需要存储 n 个头结点和 2e 个表结点。在图中边或者弧稀疏的时候,使用邻接表要比前一节介绍的邻接矩阵更加节省空间。

图的十字链表存储结构

与邻接表不同,十字链表法仅适用于存储有向图和有向网。不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题。

十字链表存储有向图(网)的方式与邻接表有一些相同,都以图(网)中各顶点为首元节点建立多条链表,同时为了便于管理,还将所有链表的首元节点存储到同一数组(或链表)中。

其中,建立个各个链表中用于存储顶点的首元节点结构如图 1 所示:


 

十字链表中首元节点结构示意图


图 1 十字链表中首元节点结构示意图


从图 1 可以看出,首元节点中有一个数据域和两个指针域(分别用 firstin 和 firstout 表示):

  • firstin 指针用于连接以当前顶点为弧头的其他顶点构成的链表;
  • firstout 指针用于连接以当前顶点为弧尾的其他顶点构成的链表;
  • data 用于存储该顶点中的数据;

由此可以看出,十字链表实质上就是为每个顶点建立两个链表,分别存储以该顶点为弧头的所有顶点和以该顶点为弧尾的所有顶点。


注意,存储图的十字链表中,各链表中首元节点与其他节点的结构并不相同,图 1 所示仅是十字链表中首元节点的结构,链表中其他普通节点的结构如图 2 所示:


 

十字链表中普通节点的结构示意图


图 2 十字链表中普通节点的结构示意图


从图 2 中可以看出,十字链表中普通节点的存储分为 5 部分内容,它们各自的作用是:

  • tailvex 用于存储以首元节点为弧尾的顶点位于数组中的位置下标;
  • headvex 用于存储以首元节点为弧头的顶点位于数组中的位置下标;
  • hlink 指针:用于链接下一个存储以首元节点为弧头的顶点的节点;
  • tlink 指针:用于链接下一个存储以首元节点为弧尾的顶点的节点;
  • info 指针:用于存储与该顶点相关的信息,例如量顶点之间的权值;


比如说,用十字链表存储图 3a) 中的有向图,存储状态如图 3b) 所示:


 

十字链表存储有向图示意图


图 3 十字链表存储有向图示意图


拿图 3 中的顶点 V1 来说,通过构建好的十字链表得知,以该顶点为弧头的顶点只有存储在数组中第 3 位置的 V4(因此该顶点的入度为 1),而以该顶点为弧尾的顶点有两个,分别为存储数组第 1 位置的 V2 和第 2 位置的 V3(因此该顶点的出度为 2)。

对于图 3 各个链表中节点来说,由于表示的都是该顶点的出度或者入度,因此没有先后次序之分。

图的邻接多重表存储结构

为了提高在无向图中操作顶点的效率,本节学习一种新的适用于存储无向图的方法——邻接多重表。

注意,邻接多重表仅适用于存储无向图或无向网。

邻接多重表存储无向图的方式,可看作是邻接表和十字链表的结合。同邻接表和十字链表存储图的方法相同,都是独自为图中各顶点建立一张链表,存储各顶点的节点作为各链表的首元节点,同时为了便于管理将各个首元节点存储到一个数组中。各首元节点结构如图 1 所示:


 

邻接多重表各首元节点的结构示意图


图 1 邻接多重表各首元节点的结构示意图


图 1 中各区域及其功能为:

  • data:存储此顶点的数据;
  • firstedge:指针域,用于指向同该顶点有直接关联的存储其他顶点的节点。


从图 1 可以看到,邻接多重表采用与邻接表相同的首元节点结构。但各链表中其他节点的结构与十字链表中相同,如图 2 所示:


 

邻接多重表中其他节点结构


图 2 邻接多重表中其他节点结构


图 2 节点中各区域及功能如下:

  • mark:标志域,用于标记此节点是否被操作过,例如在对图中顶点做遍历操作时,为了防止多次操作同一节点,mark 域为 0 表示还未被遍历;mark 为 1 表示该节点已被遍历;
  • ivex 和 jvex:数据域,分别存储图中各边两端的顶点所在数组中的位置下标;
  • ilink:指针域,指向下一个存储与 ivex 有直接关联顶点的节点;
  • jlink:指针域,指向下一个存储与 jvex 有直接关联顶点的节点;
  • info:指针域,用于存储与该顶点有关的其他信息,比如无向网中各边的权;


综合以上信息,如果我们想使用邻接多重表存储图 3a) 中的无向图,则与之对应的邻接多重表如图 3b) 所示:


 

无向图及其对应的邻接多重表


图 3 无向图及其对应的邻接多重表


从图 3 中,可直接找到与各顶点有直接关联的其他顶点。比如说,与顶点 V1 有关联的顶点为存储在数组下标 1 处的 V2 和数组下标 3 处的 V4,而与顶点 V2 有关联的顶点有 3 个,分别是 V1、V3 和 V5。

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

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

相关文章

网络通信原理总结(第五十二课)

网络通信原理 结构目录 1 TCP/IP协议追层分析物理层(第三十九课)_IHOPEDREAM的博客-CSDN博客 2 网络通信TCP/IP协议逐层分析数据链路层(第四十课)_IHOPEDREAM的博客-CSDN博客 3 网络通信原理数据链路层&数制转换(第四十一课)_IHOPEDREAM的博客-CSDN博客 4 网络通信原理…

[LeetCode]矩阵对角线元素的和

解题 思路 1: 循环,找到主对角线的下标和副对角线的下标,如果矩阵长或宽为奇数的时候,需要减去中间公共的那一个值,中间公共的那个数的下标为mat[mat.size()/2][mat.size()/2]副对角线的下标为 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

一文读懂|Linux 虚拟文件系统(VFS)

前言 虚拟文件系统是一个很庞大的架构&#xff0c;如果要分析的面面俱到&#xff0c;会显得特别复杂而笨拙&#xff0c;让人看着看着&#xff0c;就不知所云了&#xff08;当然主要还是笔者太菜&#xff09;&#xff0c;所以这篇博客&#xff0c;以 open() 函数为切入点&#…

2020年3月全国计算机等级考试真题(C语言二级)

2020年3月全国计算机等级考试真题&#xff08;C语言二级&#xff09; 第1题 有以下程序 void fun1 (char*p) { char*q; qp; while(*q!\0) { (*Q); q&#xff1b; } } main() { char a[]{"Program"},*p; p&a[3]; fun1(p); print…

英语学习 Eudic欧路词典 for Mac

欧路词典是一款功能强大的英语学习工具&#xff0c;其多语种支持、海量词库、强大的翻译功能、听力训练和生词本和笔记等特点&#xff0c;使得用户可以方便地进行英语学习和提高英语水平&#xff0c;适用于各种英语学习人员和文化交流人员等不同人群。 1 、全面支持最新Retina…

Salesforce Winter ‘24即将发布!亮点功能抢先看

随着Winter 24脚步的临近&#xff0c;一波增强功能即将面世&#xff0c;Trailblazers的期望值越来越高。在这片云计算的海洋里&#xff0c;一些亮点功能总能在生态系统中引起巨大轰动。 Winter 24发布日期 Winter 24发布的具体日期取决于您的Salesforce实例&#xff0c;主要日…

vue echarts macd指标 完整代码

1 逻辑 给指定的series两个对象 两个对象有相同的xAxisIndex: 2,yAxisIndex: 2, 不同的data {name: "",type: "line",data: data1,xAxisIndex: 2,yAxisIndex: 2,},{name: "",type: "bar",data: data2,xAxisIndex: 2,yAxisIndex: 2,},…

爱荷华州的一个学区正在使用ChatGPT来决定禁止哪些书籍

为了响应爱荷华州最近颁布的立法&#xff0c;管理员们正在从梅森市学校图书馆移除禁书&#xff0c;官员们正在使用ChatGPT帮助他们挑选书籍&#xff0c;根据公报和大众科学. 由州长金雷诺兹签署的禁令背后的新法律是教育改革浪潮的一部分&#xff0c;共和党立法者认为这是保护…

滑块验证码-接口返回base64数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言所需包图片示例使用方法提示前言 滑动验证码在实际爬虫开发过程中会遇到很多,不同网站返回的数据也是千奇百怪。这里分享一种接口返回base64格式的情况以及处理方式 所需包 opencv-python、…

【LangChain】Feature Store 特征库 一种新型存储方式 —— 功能存储

Feature Store 特征库 特征库的主要目的是什么&#xff1f;特征库的五个主要组件组成一&#xff1a;Serving 服务组成二&#xff1a;Storage 存储组成三&#xff1a;Transform 转换组成四&#xff1a;Monitoring 监控组成五&#xff1a;Feature Registry 功能注册表 Feature St…

简单学习MySQL

最近&#xff0c;再看数据库相关的知识&#xff0c;用不着学太深&#xff0c;先学一些基本知识&#xff0c;以后需要的时候有个基础&#xff0c;不至于像个无头苍蝇&#xff0c;我学习的网站如下&#xff08;MySQL 教程 | 菜鸟教程 (runoob.com)&#xff09; 对MySQL的介绍 My…

[oneAPI] 手写数字识别-VAE

[oneAPI] 手写数字识别-VAE oneAPIVAE模型实现手写数字识别任务定义使用包定义参数加载数据VAE模型与介绍训练过程结果 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&#xff1a;https://devcloud.intel.com/one…

go 中自定义包以及import

目录结构如下 注意ellis这个文件夹是在工作区的src目录下 testpackage.go package testpackageimport ("fmt" )func Test() {fmt.Println("test") }main.go package mainimport ("ellis/testpackage""fmt" )type Name struct {Fir…

电脑PDF转换成PPT?这篇文章给你答案

随着科技的不断发展和进步&#xff0c;电子文档已经成为我们日常工作和学习中不可或缺的一部分。PDF作为一种跨平台的文件格式&#xff0c;以其可靠性和易读性而备受推崇。然而&#xff0c;在某些情况下&#xff0c;我们可能需要电脑PDF转换成PPT&#xff0c;以便更好地展示和编…

塑料玩具en71检测标准

塑料玩具原材料大部是从一些油类中提炼出来的,熟悉的部分pc料是从石油中提炼出来的&#xff0c;pc料在烧的时候有一股汽油味, abs是从煤炭中提炼出来的, abs在烧完灭掉的时候会呈烟灰状&#xff0c;pom是从天然气提炼出来的, pom在烧完的时候会有一股非常臭的瓦斯味,塑料玩具是…

php+echarts实现数据可视化实例

效果&#xff1a; 代码&#xff1a; php <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv&quo…

Azure存储账户

存储账户的概念 Azure存储账户是Azure提供的一种云存储解决方案&#xff0c;用于存储和访问各种类型的数据&#xff0c;包括文件、磁盘、队列、表格和Blob&#xff08;二进制大对象&#xff09;数据。存储账户可以基于访问模式和冗余需求来选择不同的类型&#xff0c;以满足应…

网络通信原理应用层(第五十一课)

1)DNS:域名解析系统,端口号TCP或UDP的53 2)域名注册网站 -新网 www.xinnet.com -万网-阿里云 www.net.cn -中国互联 hulian.top 配置通过域名访问网站(NETBASE第七课)_IHOPEDREAM的博客-CSDN博客 2、FTP 1)FTP概述 -文件传输协议 -控制连接:TCP 21 <

.NET6 System.Drawing.Common 通用解决办法

最近有不少小伙伴在升级 .NET 6 时遇到了 System.Drawing.Common 的问题&#xff0c;同时很多库的依赖还都是 System.Drawing.Common &#xff0c;而 .NET 6 默认情况下只在 Windows 上支持使用&#xff0c;Linux 上默认不支持这就导致在 Linux 环境上使用会有问题&#xff0c;…

【校招VIP】测试类型之兼容性测试分析

考点介绍&#xff1a; 兼容性是测试工作里面比较复杂的一种情况&#xff0c;也是校招里面考察的一个重点&#xff0c;需要从屏幕功能&#xff0c;数据&#xff0c;操作系统等多个维度进行分析。 『测试类型之兼容性测试分析』相关题目及解析内容可点击文章末尾链接查看&#x…