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

【数据结构与算法】设计循环队列

文章目录

  • 👑前言
  • 如何设计循环队列
  • 设计循环队列
  • 整体的代码
  • 📯写在最后

👑前言

🚩前面我们 用队列实现了一个栈 ,用栈实现了一个队列 ,相信大家随随便便轻松拿捏,而本章将带大家上点难度,我们来 设计一个循环队列
🚩对于循环队列,重点就在一个 “ 循环 ”,意思也就是该队列首尾相连形成一个环,但其本质还是不变,队列 先进先出 的性质依旧存在,只不过环的大小有限定(限定放多少数据就只能放多少数据)。
🚩那么我们如何来设计这样的一个环,使它既能够像队列一样,又可以体现循环的性质?下面就带大家探讨一波。


如何设计循环队列

  • 那么该如何设计一个循环队列呢?首先第一步当然就是选取一个存储结构来存放数据,是选顺序表的数组呢还是链表呢?

  • 我们先来看看对循环队列的介绍:循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

由以上所说,既然是队尾被连接在队首之后形成一个循环,并且之前我们讲解的队列是选用的链式储存结构,那我们第一个想到的就是选用链式的储存结构来存储数据,因为只要链表的尾节点的next指向头节点就形成了循环,这是很容易想到的。那我们就先对链式这一储存结构进行分析,看到底合不合适。

抽象图:

在这里插入图片描述

  • 既然是队列,那就需要两个指针,一个命名为front指向头,一个命名为rear指向尾。由于是循环队列,刚开始就将空间开好(固定长度),那么此时frontrear都指向同一个节点,如下:

在这里插入图片描述

  • 那么此时入队列的操作过程如下:

在这里插入图片描述

  • 可以看到,rear指向有效数据节点的下一个位置。当队列入满的时候,rear指针此时又与front指针相等了,我们再来看看出队列的过程(出队列数据可以不用抹去,访问不到):

在这里插入图片描述

  • 由上面的两个操作我们不难发现,当队列为空的时候,front指针与rear指针相等,当队列满的时候,front指针与rear指针也相等,这不免就会出现冲突问题:判空和判满将如何判断呢?

  • 这里有两种方案:

    1. 第一个是多创建一个变量来统计数据的个数,当判空和判满的时候根据这个变量就可以实现;
    2. 第二个是多开一个空间(注意不是哨兵位节点),也就是规定长度为多少,开空间的时候开长度加一个空间,如下图:

在这里插入图片描述
可以看到,方案二当循环队列为空的时候,front == rear,当循环队列为满的时候,如下图:

在这里插入图片描述
由此图不难得出,当循环队列为满时,有rear->next == front,所以,方案二对于判空和判满的区分也是挺不错的。不过,大家有没有观察到,对于链式储存结构,无论是方案一还是方案二,都不好找队尾数据,因为它处在rear指针的前一个节点,实在是要找的话,就需要遍历一遍循环队列,或者在一开始就另外再定义一个prev指针,指向rear指针的前一个节点,这些都是比较麻烦的。那么根据此问题,由于数组存储形式支持随机访问,所以下面我们再来看看数组的存储形式怎么样。


  • 对于数组的存储形式,整体上来说与链式存储形式差不太多。由于循环队列的长度是固定的,因此数组的存储形式抛弃了扩容这一弱点。

数组存储形式图:
在这里插入图片描述

  • 有了链式存储的分析判断,不难得出,上图的数组存储形式也会出现判空和判满实现的冲突问题。因此这里也需要解决方案,而数组存储形式的解决方案与链式存储形式的解决方案是相同的,无非就是多定义一个变量来统计数据的个数,或者多开一个空间。多定义一个变量来统计数据的个数固然可以实现,但这里我们选取多开一个空间的形式来进行分析。

如果是多开一个空间,那么当循环队列满时,有以下情况:

在这里插入图片描述
2.
在这里插入图片描述

(注意:frontrear两个指针分别是对应数据的下标 | 设规定的长度为k)

  • 如果是2情况,判满可以判断 rear + 1 == front ? ,但还有1情况rear + 1不会等于front,并且会超出数组的下标范围,因此这里可以对rear + 1取模,也就是判断 (rear + 1) % (k + 1) == front ? 即可。有了这种判断方式,无论rear是否指向数组的最后一个位置,他都可以判断,因为:当rear不是指向数组的尾时,它加一模上一个(k + 1)完全不会受到影响,就相当于是判断 rear + 1 == front ? 一样。而rear指向数组的尾时,这样操作最终就是判断 front == 0 ? 一样。

  • 那数组的判满解决了,判空如何呢?其实判空很简单,只需要判断rear是否等于front即可。

由于是数组存储形式,因此支持下标的随机访问,所以这里获取队头和队尾元素都非常的方便。

  • 如果是获取队头元素,直接返回front指向的数据即可;如果是获取队尾元素,只需要返回rear的前一个位置的数据即可,但是,如果rear此时指向数组的开头又该怎么找队尾元素呢?

在这里插入图片描述

  • 这里我们将 rear + k 然后模上 k + 1 即可。因为,如果rear是指向数组开头,rear加上k后刚好指向数组的最后一个位置,也就是循环队列的队尾。如果rear不是指向数组开头, (rear + k) % (k + 1) 刚好是rear的前一个位置,所以,这样的取模的方式,完美的实现了取队尾的功能。

综上来看,链式储存结构与数组储存结构还是数组储存结构更胜一筹,因为在取队尾元素这一块数组储存结构碾压链式储存结构,所以,这里我们选择数组储存结构来实现循环队列。

  • 这里我们采用多开一个空间的方式来实现。

  • 确定了以数组存储结构来存储数据后,那么该如何实现数据的入队和出队呢?

首先来看看数据入队列示意图:

在这里插入图片描述
在这里插入图片描述

  • 对于第一张图的入队列,就是在当前rear位置插入,然后rear加加即可。但是对于第二张图,rear在最后位置的时候插入数据,此时rear加加就超过数组的长度了,因此我们每次在rear加加后需要执行一下 rear %= (k + 1) 这条语句,这样做,rear在数组的尾插入数据时,会将rear转算成0,也就是指向数组的开头位置,如果rear不在数组的尾插入数据,此时rear的位置不会受任何的影响。

然后再来看看数据出队列示意图:

在这里插入图片描述

在这里插入图片描述

  • 对于第一张图,每次删除其实只需要front加加即可,如果为空就不能删了。对于第二张图,当front指向数组的最后一个位置时,出队过后,front加加会越过数组,因此,每次出队列完成,都需要执行 front %= (k + 1) 这条语句,情况其实与上面入队列时的rear一样。

入队列与出队列介绍过了,后面就是一些队列基本的接口操作了。有取队头数据,取队尾数据,判空和判满,还有循环队列的销毁。

接下来就带大家来实现喽!


设计循环队列

  • 这里我们直接以题目的方式来实现,题目链接:-> 传送门 <-

题目描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
在这里插入图片描述
在这里插入图片描述

该题提供的需要我们实现的接口:

typedef struct {} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {}bool myCircularQueueDeQueue(MyCircularQueue* obj) {}int myCircularQueueFront(MyCircularQueue* obj) {}int myCircularQueueRear(MyCircularQueue* obj) {}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {}bool myCircularQueueIsFull(MyCircularQueue* obj) {}void myCircularQueueFree(MyCircularQueue* obj) {}

接下来,就是对循环队列的一系列功能接口的实现了:

1.

  • 首先当然是定义一个循环队列的结构体。

相关代码实现:

// 循环队列的结构
typedef struct {// 底层存储结构为数组int* a;// 指向队头int front;// 指向队尾int rear;// 规定的循环队列的长度// 这里存放一下规定的循环队列的长度是为了后面取模更方便int k;
} MyCircularQueue;

2.

  • 然后便是对一个循环队列的创造。

  • 这里开辟一段连续的空间,可以存放规定的长度加一个数据,但其实总有一个空间是用不上的。

  • 然后将frontrear都指向循环队列的队头,就是置为0

  • 最后将规定的长度存起来即可。

相关代码实现:

// 循环队列的创造(构造器),规定创造的循环队列的长度为k
MyCircularQueue* myCircularQueueCreate(int k) {// 先开辟一个循环队列的空间MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));// assert防止开辟空间失败assert(obj);// 多开一个空间,也就是开辟(k + 1)个数据空间obj->a = (int*)malloc(sizeof(int) * (k + 1));// 开始头指针和尾指针都指向0(也就是队头)obj->front = obj->rear = 0;// 存放规定的队列长度obj->k = k;return obj;
}

3.

  • 这里是入队列的实现。
  • 入队列就是在当前的rear位置插入数据,然后rear加加。
  • 根据前面的解析,入队列之后都需要取模一次,避免rear越过数组。(当然也可以通过判断的方式来处理特殊情况)
  • 当队列为满的时候就不能入队列了。

相关代码实现:

// 入队列插入数据,插入成功返回true,不成功(队列已满)那就返回false
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {// 如果此时循环队列已经满了,说明入队列不能进行,直接返回 falseif (myCircularQueueIsFull(obj)) return false;// 在rear位置上插入数据,然后rear加加obj->a[obj->rear ++ ] = value;// 每次都模上个 (k + 1)obj->rear %= (obj->k + 1);// 入队列成功返回truereturn true;
}

4.

  • 接下来是出队列操作。
  • 出队列就是front加加,根据前面的讲解,每次出队列后都要记得需模上(k + 1)。(当然也可以通过判断的方式来处理特殊情况)
  • 当队列为空的时候就不能出队列了。

相关代码实现:

// 出队列删除数据,删除成功返回true,不成功(队列为空)那就返回false
bool myCircularQueueDeQueue(MyCircularQueue* obj) {// 当循环队列为空,说明不能再出队列了,表明出队列失败,直接返回falseif (myCircularQueueIsEmpty(obj)) return false;// 出队列直接front加加obj->front ++ ;// 每次都模上个 (k + 1)obj->front %= (obj->k + 1);// 出队列成功返回truereturn true;
}

5.

  • 获取队头数据,直接返回front此时指向的那个位置上的数据即可。
  • 如果循环队列为空的话,就取不了了,依题目要求直接返回-1

相关代码实现:

// 获取队头元素,如果队列为空,返回-1
int myCircularQueueFront(MyCircularQueue* obj) {// 如果循环队列为空,说明没有数据,直接返回-1if (myCircularQueueIsEmpty(obj)) return -1;return obj->a[obj->front];
}

6.

  • 获取队尾数据,根据前面的分析,采用取模的方式获取。(当然也可以通过判断的方式)
  • 如果循环队列为空的话,就取不了了,依题目要求直接返回-1

相关代码实现:

// 获取队尾元素,如果队列为空,返回-1
int myCircularQueueRear(MyCircularQueue* obj) {// 如果循环队列此时为空,直接返回-1if (myCircularQueueIsEmpty(obj)) return -1;// 以取模的方式来获取return obj->a[(obj->rear + obj->k) % (obj->k + 1)];
}

7.

  • 对于判空,就是判断front是否等于rear即可。

相关代码实现:

// 判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->rear;
}

8.

  • 对于判满,根据前面的分析,也是通过取模的方式来实现的。(当然也可以通过判断的方式来处理特殊情况)

相关代码实现:

// 判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear + 1) % (obj->k + 1) == obj->front;
}

9.

  • 最后就是销毁循环链表,malloc了几次,就free(释放)几次。

相关代码实现:

// 销毁循环队列
void myCircularQueueFree(MyCircularQueue* obj) {// 有内到外依次释放空间// 释放数组free(obj->a);// 释放循环队列free(obj);
}

整体的代码

// 循环队列的结构
typedef struct {// 底层存储结构为数组int* a;// 指向队头int front;// 指向队尾int rear;// 规定的循环队列的长度int k;
} MyCircularQueue;// 在这声明一下判空和判满
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);// 循环队列的创造(构造器),规定创造的循环队列的长度为k
MyCircularQueue* myCircularQueueCreate(int k) {// 先开辟一个循环队列的空间MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));// assert防止开辟空间失败assert(obj);// 多开一个空间,也就是开辟(k + 1)个数据空间obj->a = (int*)malloc(sizeof(int) * (k + 1));// 开始头指针和尾指针都指向0(也就是队头)obj->front = obj->rear = 0;// 存放规定的队列长度obj->k = k;return obj;
}// 入队列插入数据,插入成功返回true,不成功(队列已满)那就返回false
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if (myCircularQueueIsFull(obj)) return false;obj->a[obj->rear ++ ] = value;obj->rear %= (obj->k + 1);return true;
}// 出队列删除数据,删除成功返回true,不成功(队列为空)那就返回false
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)) return false;obj->front ++ ;obj->front %= (obj->k + 1);return true;
}// 获取队头元素,如果队列为空,返回-1
int myCircularQueueFront(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)) return -1;return obj->a[obj->front];
}// 获取队尾元素,如果队列为空,返回-1
int myCircularQueueRear(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)) return -1;return obj->a[(obj->rear + obj->k) % (obj->k + 1)];
}// 判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->rear;
}// 判满
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear + 1) % (obj->k + 1) == obj->front;
}// 销毁循环队列
void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

📯写在最后

💝设计一个循环队列还是有些复杂的呢,不过看过本文章,相信大家也可以轻松拿捏。
❤️‍🔥后续将会持续输出有关数据结构与算法的文章,你们的支持就是我写作的最大动力!

感谢阅读本小白的博客,错误的地方请严厉指出噢~

相关文章:

【数据结构与算法】设计循环队列

文章目录&#x1f451;前言如何设计循环队列设计循环队列整体的代码&#x1f4ef;写在最后&#x1f451;前言 &#x1f6a9;前面我们 用队列实现了一个栈 &#xff0c;用栈实现了一个队列 &#xff0c;相信大家随随便便轻松拿捏&#xff0c;而本章将带大家上点难度&#xff0c;…...

最新版!国内IT软件外包公司汇总~

金三银四已经过去一半&#xff0c;再过几个月又将迎来毕业季&#xff0c;大家有没有找到心仪的工作机会呀&#xff1f;有很多同学说今年的金三银四似乎不存在了。小李&#xff1a;今年的金三银四变成了铜三铁四&#xff0c;不断地投递又不断地造拒。小王&#xff1a;大量已读不…...

MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?

关于数据库中行数统计&#xff0c;无论是MySQL还是Oracle&#xff0c;都有一个函数可以使用&#xff0c;那就是COUNT 但是&#xff0c;就是这个常用的COUNT函数&#xff0c;却暗藏着很多玄机&#xff0c;尤其是在面试的时候&#xff0c;一不小心就会被虐。不信的话请尝试回答下…...

数位DP 详解及其案例实战 [模板+技巧+案例]

零. 案例引入 1.案例引入 leetcode233. 数字 1 的个数 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 输入&#xff1a;n 13 输出&#xff1a;6 2.暴力解 对于上述的案例&#xff0c;暴力解肯定是可行的&#xff0c;但时间复杂度较高,对…...

并发编程(六)—AbstractExecutorService源码分析

一、AbstractExecutorService简介AbstractExecutorService是一个抽象类&#xff0c;实现了ExecutorService接口&#xff0c;提供了线程池的基本实现。它是Java Executor框架的核心类&#xff0c;提供了线程池的基本操作&#xff0c;如提交任务、管理线程池、执行任务等。自定义…...

015行为型-职责链模式

目录定义标准模式实现&#xff1a;职责链变体使用链表实现使用数组实现应用场景日志输出spring过滤器spirng 拦截器mybatis动态sql定义 责链模式是一种设计模式&#xff0c;其目的是使多个对象能够处理同一请求&#xff0c;但是并不知道下一个处理请求的对象是谁。它能够解耦请…...

python例程:五子棋(控制台版)程序

目录《五子棋&#xff08;控制台版&#xff09;》程序使用说明程序示例代码可执行程序及源码下载路径《五子棋&#xff08;控制台版&#xff09;》程序使用说明 在PyCharm中运行《五子棋&#xff08;控制台版&#xff09;》即可进入如图1所示的系统主界面。 图1 游戏主界面 具…...

leveldb的Compaction线程

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 1. leveldb的Compaction全局线程 在leveldb中&#xff0c;有一个全局的后台线程BGThread&#xff0c;用于数据库的MinorCompact与MajorCompact。 重点关注“全局线程”&#xff1a; 这个标识着无论一个进程打开…...

邪恶的想法冒出,立马启动python实现美女通通下

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 完整源码、python资料: 点击此处跳转文末名片获取 当我在首页刷到这些的时候~ 我的心里逐渐浮现一个邪念&#xff1a;我把这些小姐姐全都采集&#xff0c;可以嘛&#xff1f; 答案当然是可以的~毕竟就我这技术&#xff0c…...

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…...

经典算法面试题——Java篇-附带赠书活动,评论区随机选取一人赠书

目录 一.图书推荐 二.说一下什么是二分法&#xff1f;使用二分法时需要注意什么&#xff1f;如何用代码实现&#xff1f; 三.什么是插入排序&#xff1f;用代码如何实现&#xff1f; 四.什么是冒泡排序&#xff1f;用代码如何实现&#xff1f; 五.什么是斐波那契数列&#…...

支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了

支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了 熟悉RT-Thread和瑞萨MCU的朋友都知道&#xff0c;当前RT-Thread仓库的主线代码是不支持RA2E1这个BSP的。刚好&#xff0c;最近我在联合瑞萨推广一个叫《致敬未来的攻城狮计划》&#xff0c;使用的就是RA2E1开发板&…...

【C语言进阶】 12. 假期测评①

day01 1. 转义字符的判断 以下不正确的定义语句是&#xff08; &#xff09; A: double x[5] {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] {‘\x10’, ‘\xa’, ‘\8’}; C: char c1[] {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[53]{0, 1, 3, 5, 7, 9}; 【答案解析】 B 本…...

给程序加个进度条吧,1行Python代码,快速添加~

大家好&#xff0c;这里是程序员晚枫。 你在写代码的过程中&#xff0c;有没有遇到过以下问题&#xff1f; 已经写好的程序&#xff0c;想看看程序执行的进度&#xff1f; 在写代码批量处理文件的时候&#xff0c;如何显示现在处理到第几个文件了&#xff1f; &#x1f446…...

常见的Keil5编译报错及其原因和解决方法

以下是几种常见的Keil5编译报错及其原因和解决方法&#xff1a; "Error: L6218E: Undefined symbol"&#xff08;未定义符号错误&#xff09; 这通常是由于缺少对应的库文件或者代码中有未声明的变量或函数引起的。解决方法是检查相应的库文件是否已正确添加到工程中…...

Django 实现瀑布流

需求分析 现在是 "图片为王"的时代&#xff0c;在浏览一些网站时&#xff0c;经常会看到类似于这种满屏都是图片。图片大小不一&#xff0c;却按空间排列&#xff0c;就这是瀑布流布局。 以瀑布流形式布局&#xff0c;从数据库中取出图片每次取出等量&#xff08;7 …...

传输层协议----UDP/TCP

文章目录前言一、再谈端口号端口号的划分认识知名端口号(Well-Know Port Number)两个问题nestatpidof二、UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议二、TCP协议TCP协议段格式可靠性问题确认应答(ACK)机制流量控制六个标志位PSHUG…...

教你如何快速在Linux中找到某个目录中最大的文件

工作中经常会有查看某个目录下最大的文件的需求&#xff0c;比如在运维工作中&#xff0c;发现某个系统或功能不工作了&#xff0c;经排查发现是服务器空间满了…那么接下来就需要清理一下临时文件或者日志文件&#xff0c;或者其他不需要的文件&#xff0c;那么就会想要查看一…...

Java二叉树面试题讲解

Java二叉树面试题讲解&#x1f697;1.检查两颗树是否相同&#x1f695;2.另一颗树的子树&#x1f699;3.二叉树最大深度&#x1f68c;4.判断一颗二叉树是否是平衡二叉树&#x1f68e;5.对称二叉树&#x1f693;6.获取树中结点个数&#x1f691;7.判断一个树是不是完全二叉树&am…...

rancher2.6进阶之nfs动态创建pv配置

添加NFS client provisioner 动态提供K8s后端存储卷 1.1.前提说明 1.1.1.说明 NFS client provisioner 利用 NFS Server 给 Kubernetes 作为持久存储的后端,并且动态提供PV。 默认 rancher 2 的存储类中的提供者不包含NFS,需要手动添加;添加方式有两种: 1)从应用商店直接安…...

快速上手vue elementUI好看的登录界面

这是一个非常非常适合新手的vue登录界面&#xff0c;总体来说美观大气&#xff0c;axios那部分没有发&#xff0c;有需要的大家可以自己进行二次开发&#xff0c;继续编写。 用到了技术栈有 vue/cli 5.07 element-ui 2.15.9 适合入门级新手&#xff0c;展示下页面 emmm验证码…...

Vue趣味【Vue3+Element Plus+Canvas实现一个简易画板;支持导出为图片】

目录&#x1f31f;前言&#x1f31f;粉丝先看&#x1f31f;创建Vue3项目&#x1f31f;引入Element Plus&#x1f31f;实现代码&#xff08;详细注释&#xff09;&#x1f31f;写在最后&#x1f31f;JSON包里写函数&#xff0c;关注博主不迷路&#x1f31f;前言 哈喽小伙伴们&a…...

【Spring Cloud Alibaba】2.服务注册与发现(Nacos安装)

文章目录环境要求简介安装Nacos源码安装Docker安装数据库配置访问服务我们要搭建一个Spring Cloud Alibaba项目就绕不开Nacos&#xff0c;阿里巴巴提供的Nacos组件&#xff0c;可以提供服务注册与发现和分布式配置服务&#xff0c;拥有着淘宝双十一十几年的流量经验&#xff0c…...

深度学习 Day28——利用Pytorch实现好莱坞明星识别

深度学习 Day28——利用Pytorch实现好莱坞明星识别 文章目录深度学习 Day28——利用Pytorch实现好莱坞明星识别一、前言二、我的环境三、前期工作1、导入依赖项设置GPU2、导入数据集3、划分数据集四、调用官方的VGG16模型五、训练模型1、编写训练函数2、编写测试函数3、设置动态…...

Android中使用FCM进行消息推送

Firebase Cloud Message 的介绍 Firebase Cloud Message(FCM)是由Google推出的一种云端消息推送服务,它是由Google推出的Google Cloud Messaging(GCM)服务的升级版。在2016年5月,Google宣布将Google Cloud Messaging重命名为Firebase Cloud Message,作为Firebase的一部…...

从 X 入门Pytorch——BN、LN、IN、GN 四种归一化层的代码使用和原理

Pytorch中四种归一化层的原理和代码使用前言1 Batch Normalization&#xff08;2015年提出&#xff09;Pytorch官网解释原理Pytorch代码示例2 Layer Normalization&#xff08;2016年提出&#xff09;Pytorch官网解释原理Pytorch代码示例3 Instance Normalization&#xff08;2…...

Windows环境下实施域名访问的一些小知识

文章目录 前言一、windows域名访问流程二、网络域名访问配置设置DNS未正确设置DNS的结果三、本地hosts设置本地hosts本地hosts的优先机制本地hosts的内部访问次序示例一示例二总结前言 作为一种常见的操作系统,windows系统具有其特殊的域名访问管理机制。了解其访问机制,将有…...

78.qt QCustomPlot介绍

参考https://www.qcustomplot.com/index.php/tutorials/settingup 下载地址: https://www.qcustomplot.com/index.php/download 1.添加帮助文档 在QtCreator ——>工具——>选项——>帮助——>文档——>添加,选择qcustomplot.qch文件,确定,以后按F1就能跳转到…...

win32api之文件系统管理(七)

什么是文件系统 文件系统是一种用于管理计算机存储设备上文件和目录的机制。文件系统为文件和目录分配磁盘空间&#xff0c;管理文件和目录的存储和检索&#xff0c;以及提供对它们的访问和共享&#xff0c;以下是常见的两种文件系统&#xff1a; NTFSFAT32磁盘分区容量2T32G…...

点云规则格网化,且保存原始的点云索引

点云规则格网化&#xff0c;且保存原始的点云索引 点云深度学习Voxelize规则&#xff0c;参考PTV2&#xff1a;https://github.com/Gofinge/PointTransformerV2 1总执行文件 import numpy as np import torch from pcr.utils.registry import Registry TRANSFORMS Registry…...

贵阳做网站的大公司有哪些/引流黑科技app

ls /etc/sysconfig/network-scripts/ifcfg-* 列出所有的设备配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 打开配置文件进行编辑&#xff0c;BOOTPROTO默认情况是dhcp动态获取的&#xff0c;改成static静态&#xff0c;再添加网关信息 BROADCAST192.168.1.255IPAD…...

做愛視頻网站/seo流量的提升的软件

前段时间配置Java环境 将Path配置错误了 计算机 右键点击属性 高级系统设置 ->环境变量 系统变量 编辑Path 添加语句 ;C:\Windows\System32 重新打开cmd ping www.baidu.com netstat -a 出现上图 表示配置成功...

上海行业网站建设/宁波网络营销有哪些

玩叠骰子 时间限制(普通/Java):3000MS/10000MS 运行内存限制:65536KByte描述 大家都玩过骰子吧&#xff0c;骰子一般都被用来赌博的工具&#xff0c;但是我们ACM的成员不一样。我们可以用骰子来编写出各种各样的题目&#xff0c;给广大爱好ACM的人锻炼思考问题的能力。…...

怎样做网站备份/高手优化网站

.loading{background-color: #387ef5 !important;} 只需要在自定义css文件中设置即可转载于:https://www.cnblogs.com/fanhq/p/5261870.html...

专业的移动网站建设公司价格/南宁seo结算

描述lcd1602显示程序代码前些天弄了最小系统板后就想着学习1602的显示程序&#xff0c;可惜坛子里的或网上的&#xff0c;都没有简单的1602显示程序&#xff0c;无柰在网上下载了一段经过反复修改测试&#xff0c;终于有了下面一段代码&#xff1a;// - - - - - - - - - - - - …...

兰州做网站/青岛谷歌优化

2015-01-06在cass9.0中如何标高程1。使用南方cass软件“工程应用”菜单下的“等高线生成数据文件”命令&#xff0c;提取原始地形等高线上的坐标和高程数据&#xff0c;保存为原始地形数据。dat 文件。2。将各点设计平均高程也保存为cass格式的坐标高程数据文件&#xff0c;保存…...