Java 数据结构篇-用数组、堆实现优先级队列

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
  

文章目录

        1.0 优先级队列说明

        2.0 用数组实现优先级队列

        3.0 无序数组实现优先级队列

        3.1 无序数组实现优先级队列 - 入队列 offer(E value)

        3.2 无序数组实现优先级队列 - 出队列 poll()

        3.3 无序数组实现优先级队列 - 查看队列中优先级最大的元素 peek() 

        3.4 无序数组实现优先级队列 - 判断是否为空队列

        3.5 无序数组实现优先级队列 - 判断是否为满队列

        3.6 无序数组实现优先级队列完整代码

        4.0 有序数组实现优先级队列

        4.1 有序数组实现优先级队列 - 入队列 offer(E value)

        4.2 有序数组实现有序队列 - 出队列 poll()

        4.3 有序数组实现有序队列 - 查看优先级最大的元素 peek()

        4.4 有序数组实现优先级队列 - 判断队列是否为空

        4.5 有序数组实现优先级队列 - 判断队列是否为满队列

        4.6 有序数组实现优先级队列完整代码

        5.0 大顶堆实现优先级队列

        5.1 堆实现优先级队列 - 入队列 offer(E value)

        5.2 堆实现优先级队列 - 出队列 poll()

        5.3 堆实现优先级队列 - 查看优先级最大的元素 peek()

        5.4 堆实现优先级队列 - 判断该队列是否为空

        5.5 堆实现优先级队列 - 判断该队列是否为满队列

        5.6 堆实现优先级队列完整代码


        1.0 优先级队列说明

        优先级队列是一种特殊的队列,其中每个元素都有一个优先级。在优先级队列中,具有最高优先级的元素首先被移除。这与普通队列不同,普通队列是先进先出(FIFO)的,而优先级队列则是按照优先级来确定元素的出队顺序

        优先级队列通常用于需要按照优先级处理元素的场景,比如任务调度、事件处理等。它可以使用不同的数据结构来实现,最常见的是使用堆(heap)来实现优先队列。堆是一种特殊的树形数据结构,它可以快速找到并移除具有最高(或最低)优先级的元素。

        优先级队列的常见操作包括插入元素、移除具有最高优先级的元素、查看具有最高优先级的元素等。实现优先级队列的常见算法包括插入时的堆调整、移除最高优先级元素后的堆调整等。

        2.0 用数组实现优先级队列

        可以使用数组来实现优先级队列,一种简单的实现方式是使用数组来存储元素,并且按照优先级顺序来维护数组。

        用数组实现优先级队列可分为两种:无序数组实现有序数组实现。

        3.0 无序数组实现优先级队列

        可以直接简单粗暴来说,无序数组就是插入元素的时候不按照优先级进行排序,而出队列的时候,严格按照优先级大小进行出队列

        首先,需要实现队列中的接口。比如:入队列、出队列等。

接口代码如下:

public interface Queue<E> {/*** 入队操作*/boolean offer(E value);/*** 出队操作*/E poll();/*** 查看队头元素*/E peek();/*** 判断是否为空队列*/boolean isEmpty();/*** 判断是否为满队列*/boolean isFull();
}

        再接着,设置优先级元素

代码如下:

public interface Priority {int priority();}
public class Entry implements  Priority{String string;int priority;public Entry(String string, int priority) {this.string = string;this.priority = priority;}@Overridepublic int priority() {return priority;}@Overridepublic String toString() {return "Entry{" +"string='" + string + '\'' +", priority=" + priority +'}';}
}

        该设置的优先级元素需要实现 priority 接口,返回当前优先级的大小。

        成员变量有 Priority[] arr 自定义大小的数组、size 标记当前元素的个数。

代码如下:

public class UnorderedPriorityQueue<E extends Priority> implements Queue<E> {private Priority[] arr;private int size;public UnorderedPriorityQueue(int capacity) {arr = new Priority[capacity];}}

        3.1 无序数组实现优先级队列 - 入队列 offer(E value)

        由于用无序数组实现,元素可直接在数组尾部入队列

代码如下:

    @Overridepublic boolean offer(E value) {if (isFull()) {return false;}arr[size++] = value;return true;}

        注意:在入队前,需要判断是否为满队列。入队完后,需要进行 size++

        3.2 无序数组实现优先级队列 - 出队列 poll()

        根据元素的优先级大小进行出队列,首先需要遍历数组找到索引为 i 处优先级最大的元素。一般有两种情况:

        第一种情况:在索引为 i == size - 1 处找到优先级最大的元素,此时只需要将 size-- ,然后将其引用置为空 arr[size] = null

        第二种情况:不在索引为 i !=  size - 1 处找到优先级最大的元素。那么需要将索引为 i 的元素被 i + 1 处的元素进行覆盖,长度为:size - 1 - i

代码如下:

    @Overridepublic E poll() {if (isEmpty()) {return null;}//先找到优先级大的点int j = 0;for (int i = 1; i < size; i++) {if (arr[j].priority() < arr[i].priority()) {j = i;}}E ret = (E)arr[j];if (j < size - 1) {System.arraycopy(arr,j+1,arr,j,size - 1 - j);}size--;arr[size] = null;return ret;}

        最后需要返回优先级最大的元素,在被置为 null 之前将其进行保存。每次出队完毕,后需要进行 size-- 、置为 null

        3.3 无序数组实现优先级队列 - 查看队列中优先级最大的元素 peek() 

        相比与出队列,找到了优先级最大的元素后,不需要进行删除该优先级最大的元素

代码如下:

    @Overridepublic E peek() {if (isEmpty()) {return null;}//先找到优先级大的点int j = 0;for (int i = 1; i < size; i++) {if (arr[j].priority() < arr[i].priority()) {j = i;}}E ret = (E)arr[j];return ret;}

        注意:在查看元素之前需要先判断是否为空队列。

        3.4 无序数组实现优先级队列 - 判断是否为空队列

        若 size == 0 ,则为空队列;若不是,则不为空。

代码如下:

    @Overridepublic boolean isEmpty() {return size == 0;}

        3.5 无序数组实现优先级队列 - 判断是否为满队列

        若 size == arr.length 时,则为满队列;若不相等,则不为满。

代码如下:

    @Overridepublic boolean isFull() {return size == arr.length;}

        3.6 无序数组实现优先级队列完整代码

public class UnorderedPriorityQueue<E extends Priority> implements Queue<E> {private Priority[] arr;private int size;public UnorderedPriorityQueue(int capacity) {arr = new Priority[capacity];}@Overridepublic boolean offer(E value) {if (isFull()) {return false;}arr[size++] = value;return true;}@Overridepublic E poll() {if (isEmpty()) {return null;}//先找到优先级大的点int j = 0;for (int i = 1; i < size; i++) {if (arr[j].priority() < arr[i].priority()) {j = i;}}E ret = (E)arr[j];if (j < size - 1) {System.arraycopy(arr,j+1,arr,j,size - 1 - j);}size--;arr[size] = null;return ret;}@Overridepublic E peek() {if (isEmpty()) {return null;}//先找到优先级大的点int j = 0;for (int i = 1; i < size; i++) {if (arr[j].priority() < arr[i].priority()) {j = i;}}E ret = (E)arr[j];return ret;}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic boolean isFull() {return size == arr.length;}
}

        4.0 有序数组实现优先级队列

        相对于无序数组优先级队列来说,有序数组实现优先级队列入队列操作需要按照优先级大小进行插入,而出队列操作直接在索引为 size - 1 处直接获取该最大优先级元素

        首先,同样的,需要实现队列中的接口。比如:入队列、出队列等。

接口代码如下:

public interface Queue<E> {/*** 入队操作*/boolean offer(E value);/*** 出队操作*/E poll();/*** 查看队头元素*/E peek();/*** 判断是否为空队列*/boolean isEmpty();/*** 判断是否为满队列*/boolean isFull();
}

        再接着,设置优先级元素。

代码如下:

public class Entry implements  Priority{String string;int priority;public Entry(String string, int priority) {this.string = string;this.priority = priority;}@Overridepublic int priority() {return priority;}@Overridepublic String toString() {return "Entry{" +"string='" + string + '\'' +", priority=" + priority +'}';}
}

        成员变量有 Priority[] arr 自定义大小的数组、size 标记当前元素的个数。

代码如下:

public class OrderedPriorityQueue<E extends Priority> implements Queue<E>{private Priority[] arr;private int size;public OrderedPriorityQueue(int capacity) {arr = new Priority[capacity];}}

        4.1 有序数组实现优先级队列 - 入队列 offer(E value)

        使用有序数组实现优先级入队列,在入队列之前从后往前遍历数组,找到优先级小于入队列的元素优先级,找到即可插入其中

代码如下:

    @Overridepublic boolean offer(E value) {if (isFull()) {return false;}//先找到优先级比value的优先级大的索引int i = size - 1;while (i >= 0 && arr[i].priority() > value.priority()) {arr[i+1] = arr[i];i--;}arr[i+1] = value;size++;return true;}

        考虑一种情况,若 size == 0 时,为空队列的时候,该代码有无错误?

                答案是:没有问题的,当 size == 0 时, 则 i = 0 - 1,i = -1 , 此时不会进入循环直接跳到 arr[i + 1] 处,所以,在这种情况下,该代码没有问题

        4.2 有序数组实现有序队列 - 出队列 poll()

        这就相对于有序数组入队列来说比较简单了,直接在索引为 i = size - 1 处,得到优先级最大的元素,然后将 size-- ,再接着 arr[size] 置为 null

代码如下:

    @Overridepublic E poll() {if (isEmpty()) {return null;}E str = (E)arr[size - 1];size--;arr[size] = null;return str;}

        注意:需要记录优先级最大的元素并且返回。在出队列之前需要判断该队列是否为空队列。

        4.3 有序数组实现有序队列 - 查看优先级最大的元素 peek()

        先判断该队列是否为空队列,若不是,直接返回该数组索引为 size - 1 处的元素即可

代码如下:

    @Overridepublic E peek() {if (isEmpty()) {return null;}E str = (E)arr[size - 1];return str;}

        4.4 有序数组实现优先级队列 - 判断队列是否为空

        若 size == 0 ,则为空;若不为,则为不空。

代码如下:

    @Overridepublic boolean isEmpty() {return size == 0;}

        4.5 有序数组实现优先级队列 - 判断队列是否为满队列

        若 size == arr.length 时,则为满队列;若不是,则为不满队列。

代码如下:

    @Overridepublic boolean isFull() {return size == arr.length;}

        4.6 有序数组实现优先级队列完整代码

public class OrderedPriorityQueue<E extends Priority> implements Queue<E>{private Priority[] arr;private int size;public OrderedPriorityQueue(int capacity) {arr = new Priority[capacity];}@Overridepublic boolean offer(E value) {if (isFull()) {return false;}//先找到优先级比value的优先级大的索引int i = size - 1;while (i >= 0 && arr[i].priority() > value.priority()) {arr[i+1] = arr[i];i--;}arr[i+1] = value;size++;return true;}@Overridepublic E poll() {if (isEmpty()) {return null;}E str = (E)arr[size - 1];size--;arr[size] = null;return str;}@Overridepublic E peek() {if (isEmpty()) {return null;}E str = (E)arr[size - 1];return str;}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic boolean isFull() {return size == arr.length;}
}

        5.0 大顶堆实现优先级队列

        大顶堆说明:

        大顶堆是一种特殊的堆,它是一种完全二叉树,其中每个父节点的值都大于或等于其左右子节点的值。在大顶堆中,根节点的值是整个堆中最大的。

        大顶堆可以使用数组来实现,其中堆的根节点存储在数组的第一个位置,然后按照完全二叉树的性质依次存储其他节点。这种实现方式使得大顶堆的父节点和子节点之间可以通过简单的数学关系来计算,从而方便进行堆调整操作。假设 i 不为 0 ,该双亲索引为:(i - 1)/ 2 ;该左孩子为:2 * i + 1;该右孩子为:2 * i  + 2 。

        首先,需要实现队列中的接口。比如:入队列、出队列等。

接口代码如下:

public interface Queue<E> {/*** 入队操作*/boolean offer(E value);/*** 出队操作*/E poll();/*** 查看队头元素*/E peek();/*** 判断是否为空队列*/boolean isEmpty();/*** 判断是否为满队列* */boolean isFull();
}

         再接着,设置优先级元素。

代码如下:

public class Entry implements  Priority{String string;int priority;public Entry(String string, int priority) {this.string = string;this.priority = priority;}@Overridepublic int priority() {return priority;}@Overridepublic String toString() {return "Entry{" +"string='" + string + '\'' +", priority=" + priority +'}';}
}

        成员变量有 Priority[] arr 自定义大小的数组、size 标记当前元素的个数。

代码如下:

public class BigTopPile<E extends Priority> implements Queue<E> {private Priority[] arr;private int size;public BigTopPile(int capacity) {arr = new Priority[capacity];}}

        5.1 堆实现优先级队列 - 入队列 offer(E value)

        具体思路为:由于是按照优先级大小来存放元素的,所以,需要先比较优先级大小,在适合的位置插入。现在已知 i = size,该双亲为:(i - 1)/ 2 。接下来,需要判断 arr[(i - 1)/ 2] 的优先级于入队列的元素优先级大小,若 arr[(i - 1)/ 2] 的优先级较大,此时该入队列的元素存放的位置为 arr[i] = value ;若 value 的优先级大于当前 arr[(i - 1)/ 2] 时,先将当前 arr[(i - 1)/ 2] 往后放,即 arr[i] = arr[(i - 1)/ 2] 。之后需要继续往上找双亲,将 i = (i - 1) / 2 ,直到 i == 0 或者 value 的优先级小于当前 arr[(i - 1)/ 2] 时,则为 arr[i] = value

代码如下:

    @Overridepublic boolean offer(E value) {if (isFull()) {return false;}int i = size;int j = (i - 1) / 2;while (i > 0 && arr[j].priority() < value.priority()) {arr[i] = arr[j];i = j;j = (i - 1) / 2;}arr[i] = value;size++;return true;}

        只要 i == 0 时, j 不能继续往上走了,否则为抛空指针异常。

        5.2 堆实现优先级队列 - 出队列 poll()

        具体思路为:分为两步。

        第一步,将 arr[size - 1] 处的元素交换到 arr[0] 处

        第二步,由于根处的优先级永远都要大于该孩子的优先级,所以,将交换之后的元素进行下潜,即先找到该左右孩子优先级最大的元素,于根元素进行交换,一直往下进行下潜。直到该根元素没有左右孩子或者根元素的优先级都大于该左右孩子的优先级

代码实现:

非递归实现:

    @Overridepublic E poll() {if (isEmpty()) {return null;}E top = (E)arr[0];arr[0] = arr[size - 1];size--;arr[size] = null;int i = 0;while ( (i * 2 + 1) < size && (i * 2 + 2) < size && (arr[i].priority() < arr[i * 2 + 1].priority() || arr[i].priority() < arr[i * 2 + 2].priority() ) ) {int j = 0;if (arr[i * 2 + 1].priority() > arr[i * 2 + 2].priority()) {j = i * 2 + 1;}else if (arr[i * 2 + 1].priority() <= arr[i * 2 + 2].priority()) {j = i * 2 + 2;}E temp = (E)arr[j];arr[j] = arr[i];arr[i] = temp;i = j;}return top;}

         (i * 2 + 1) < size && (i * 2 + 2) < size 该代码判断的是有无左右孩子元素。

递归实现:

    public E poll1() {if (isEmpty()) {return null;}//交换头尾swap(0,size - 1);size--;//置为 nullE ret = (E)arr[size];arr[size] = null;//下潜down(0);return ret;}private void swap(int i, int j) {E t = (E)arr[i];arr[i] = arr[j];arr[j] = t;}private void down(int i) {int left = 2 * i + 1;int right = 2 * i + 2;int max = i;if ( left < size && arr[max].priority() < arr[left].priority()) {max = left;}if (right < size && arr[max].priority() < arr[right].priority()) {max = right;}if (max != i) {swap(max,i);down(max);}}

        

        5.3 堆实现优先级队列 - 查看优先级最大的元素 peek()

        先判断该队列是否为空,若不为空,则直接返回堆顶元素即可。

代码如下:

    @Overridepublic E peek() {if (isEmpty()) {return null;}return (E)arr[0];}

         5.4 堆实现优先级队列 - 判断该队列是否为空

        当 size == 0 时,则为空队列。

代码实现:

    @Overridepublic boolean isEmpty() {return size == 0;}

        5.5 堆实现优先级队列 - 判断该队列是否为满队列

        当 size == arr.length 时,则为满队列。

代码实现:

    @Overridepublic boolean isFull() {return size == arr.length;}

        5.6 堆实现优先级队列完整代码

public class BigTopPile<E extends Priority> implements Queue<E> {private Priority[] arr;private int size;public BigTopPile(int capacity) {arr = new Priority[capacity];}@Overridepublic boolean offer(E value) {if (isFull()) {return false;}int i = size;int j = (i - 1) / 2;while (i > 0 && arr[j].priority() < value.priority()) {arr[i] = arr[j];i = j;j = (i - 1) / 2;}arr[i] = value;size++;return true;}@Overridepublic E poll() {if (isEmpty()) {return null;}E top = (E)arr[0];arr[0] = arr[size - 1];size--;arr[size] = null;int i = 0;while ( (i * 2 + 1) < size && (i * 2 + 2) < size && (arr[i].priority() < arr[i * 2 + 1].priority() || arr[i].priority() < arr[i * 2 + 2].priority() ) ) {int j = 0;if (arr[i * 2 + 1].priority() > arr[i * 2 + 2].priority()) {j = i * 2 + 1;}else if (arr[i * 2 + 1].priority() <= arr[i * 2 + 2].priority()) {j = i * 2 + 2;}E temp = (E)arr[j];arr[j] = arr[i];arr[i] = temp;i = j;}return top;}public E poll1() {if (isEmpty()) {return null;}//交换头尾swap(0,size - 1);size--;//置为 nullE ret = (E)arr[size];arr[size] = null;//下潜down(0);return ret;}private void swap(int i, int j) {E t = (E)arr[i];arr[i] = arr[j];arr[j] = t;}private void down(int i) {int left = 2 * i + 1;int right = 2 * i + 2;int max = i;if ( left < size && arr[max].priority() < arr[left].priority()) {max = left;}if (right < size && arr[max].priority() < arr[right].priority()) {max = right;}if (max != i) {swap(max,i);down(max);}}@Overridepublic E peek() {if (isEmpty()) {return null;}return (E)arr[0];}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic boolean isFull() {return size == arr.length;}
}

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

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

相关文章

山西电力市场日前价格预测【2023-12-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-14&#xff09;山西电力市场全天平均日前电价为491.16元/MWh。其中&#xff0c;最高日前电价为804.44元/MWh&#xff0c;预计出现在16:15。最低日前电价为336.28元/MWh&#xff0c;预计…

作业11.27

1. 2. def methods(m, n):#创建一个二维数组cp&#xff0c;用于存储到到每个位置的不同走法数量&#xff1b;cp [[0] * n for _ in range(m)]#从第一行和第一列的格子上的走法数量都为1for i in range(m):cp[i][0] 1for j in range(n):cp [0][j] 1#从第二行和第二列开始&…

smartKettle离线部署及问题记录

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 部署&#x1f4d7;源码下载&#x1f4d7;后端部署&#x1f4d5;导入后端项目&#x1f4d5;修改settings.xml(自动下载相关jar包)&#x1f4d5; 编译&#x1f4d5; …

python+selenium截图方法

1.截图网页全部 截全屏的&#xff0c;用到的内置方法为save_screenshot(“test.png”) from selenium import webdriver from time import sleepclass test:driver webdriver.Chrome()driver.maximize_window()driver.get(https://www.baidu.com/)sleep(2)# 截取全屏driver.…

数据结构:双链表

由于双链表中大部分操作其实和单链表操作类似&#xff0c;所以这里只挑关键的一些函数 1、定义与初始化 typedef struct DNode {ElementType data;struct DNode *prior,*next; }DNode,*DLinkList;bool InitialDLinkList(DLinkList &L){L (DNode *)malloc(sizeof(DNode));…

不与最大数相同的数字之和

题目描述 输出一个整数数列中不与最大数相同的数字之和。 输入格式 输入分为两行&#xff1a; 第一行为 (N 为接下来数的个数&#xff0c;N≤100)&#xff1b; 第二行为 N 个整数&#xff0c;数与数之间以一个空格分开&#xff0c;每个整数的范围是 −1000,000 到 1000,00…

高精度电压源的作用是什么

高精度电压源是一种用于提供稳定和精确电压输出的电子设备。它们在实验室研究、工业生产和医疗器械等各种应用中发挥着重要作用。下面西安安泰来为大家详细介绍高精度电压源的作用和用途等内容。 一、高精度电压源的作用 提供准确的电压值&#xff1a;高精度电压源可以提供非常…

直流电、交流电、电磁波、光之间的联系

直流电、恒定磁场、交流电、交变磁场、电磁波、光之间的联系 频率为0Hz的直流电及恒定磁场 从频率的角度上看&#xff0c;直流电与恒定磁场的方向不变&#xff0c;频率为0Hz. 如可充电锂离子电池的电压3.7V, 干电池的电压1.5V. 磁铁的磁场方向从N极到S极&#xff0c;始终保持…

Failed to connect to huggingface.co

在国内huggingface.co被墙了。可以使用Huggingface 镜像站https://hf-mirror.com/来解决这个问题。 解决方法&#xff1a; # vim ~/.bashrc export HF_ENDPOINThttps://hf-mirror.com然后再source ~/.bashrc 当访问 huggingface.co 时&#xff0c;将会直接替换为本站域名hf-m…

[Django-05 ]自定义sql查询

自定义sql查询 settings.py 设置数据库自定义sql查询 settings.py 设置数据库 DATABASES {# default: {# ENGINE: django.db.backends.sqlite3,# NAME: BASE_DIR / db.sqlite3,# }default: {ENGINE: django.db.backends.mysql, # 数据库引擎NAME: study, # 数据库名…

mac切换node版本

Mac 上切换 node 版本总结 背景 在做项目的时候&#xff0c;往往会遇到老项目没有升级的问题&#xff0c;node环境版本比较低&#xff0c;自己电脑安装或者新项目安装了最新版本的 node 环境&#xff0c;那么既要支持老版本的使用也要支持新版本那么怎么办呢&#xff1f; Mac 提…

AnimateAnything:Fine-grained open domain image animation with motion guidance

1.Introduction 本文旨在借助视频扩散模型的motion prior来解决开放领域图像动画问题&#xff0c;提出了一种可控扩散图像动画方法&#xff0c;能够在保留细节的同时对图像中的任意对象进行动画处理。为了增强用户对动画过程的控制能力&#xff0c;引入了motion area guidance和…

vue3 添加编辑页使用 cron 表达式生成

示例效果图 1、添加组件 <template><div class"v3c"><ul class"v3c-tab"><li class"v3c-tab-item" :class"{ v3c-active: tabActive 1 }" click"onHandleTab(1)">秒</li><li class&qu…

小航助学2023年9月电子学会Scratch三级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 单选题2.00分 删除编辑附件图文 答案:C 第1题运行下面程序后&#xff0c;角色的x坐标值是&#xff1f;&#xff08; &#xff09; A、100B、90C、110D、120 答…

【前端学习记录】记一次分片上传逻辑的调试过程

前言 在项目开发的过程中&#xff0c;经常会遇到上传和下载&#xff0c;对于上传来说&#xff0c;如果是小文件的话&#xff0c;接口响应会比较快&#xff0c;但是对于大文件&#xff0c;则需要对其分片以减少请求体的大小和上传时间。 小文件上传 以Vue框架使用<el-uplo…

官宣 鸿雁成为2023汇丰世界羽联世界巡回赛总决赛官方供应商

全屋智能和羽毛球运动能擦出怎样的火花&#xff1f; 鸿雁给你答案&#xff01; 12月13日&#xff0c;2023汇丰世界羽联世界巡回赛总决赛将在杭州举行。 鸿雁签约成为2023汇丰世界羽联世界巡回赛总决赛官方供应商&#xff0c;将携手世界羽联&#xff0c;为广大羽毛球爱好者们…

Yolov5双目测距-双目相机计数及测距教程(附代码)

引言 在计算机视觉领域&#xff0c;Yolov5-Binocular相机距离计数及测距是一个引人注目的研究方向。本教程将为小白用户提供一个简明扼要的学习指南&#xff0c;涵盖了关键步骤&#xff0c;包括标定、公示推倒以及重要的代码片段。 第一步&#xff1a;环境搭建 首先&#x…

【Geoserver】将geoserver迁移到jetty的发行包中

之前讲了在Geosever的二进制发行包中升级jetty的内容&#xff0c;我测试之后发现有些问题&#xff0c;本地运行可能没有问题&#xff0c;但是在linux上运行报错了。 于是我想着换个思路好了&#xff0c;总是想着将Geosever中的jetty包替换掉&#xff0c;干脆反过来&#xff0c;…

2023_Spark_实验二十六:编写Shell模拟生成点击实时数据

引言&#xff1a;流式数据处理主要处理实时数据&#xff0c;由于实验教学过程中&#xff0c;每个同学无法拿到实时数据&#xff0c;因此我们开发shell脚本模拟实时数据生成&#xff0c;支持后续实验。 实验目的&#xff1a;通过开发模拟实时点击流shell脚本&#xff0c;模拟实时…

【Database】什么是数据库?常见的数据库类型有哪些?

什么是数据库&#xff1f;常见的数据库类型有哪些&#xff1f; 首先&#xff0c;什么是数据库&#xff1f;把它想象成一个数字游乐场&#xff0c;我们以结构化的方式组织和存储大量信息。现在&#xff0c;让我们来谈谈数据库的主要类型。 关系型数据库&#xff1a; 想象一下…