java数据结构--堆

目录

一.概念

二.堆中最重要三个方法

三.大顶堆

四.基于数组实现大顶堆

五.堆排序

六.小顶堆

七.基于数组实现小顶堆

八.ProiorityQueue和Heap

 示例:

九.求数组中第K大元素

十.求数据流中第K大元素

十一.求数据流的中位数


一.概念

  堆(Heap)在计算机科学中是一种数据结构,用于存储和管理动态分配的内存。堆的主要特点是它是一个有序的完全二叉树,每个节点的值都大于小于其子节点的值,称为最小堆最大堆

堆常用于实现优先队列堆排序图算法等。堆排序是一种基于堆数据结构的排序算法,它具有稳定性和不需要额外的内存空间的优点。优先队列是一种数据结构,支持插入和删除最大或最小元素的操作,并根据优先级对元素进行排序。堆可以用于高效地实现优先队列。

同时,堆还有其他用途,比如内存管理中的动态内存分配,垃圾回收算法中的对象分配

二.堆中最重要三个方法

 1.heapify() 调整堆

    通过调整堆,可以让不符合堆特性的节点转化为符合堆特性的序列

 2.up() 上浮

   在offer()向末尾添加元素时,通过上浮操作,插入到合适的位置

 3.down() 下潜 

   在poll()方法从堆顶取出元素后,通过下潜方法,下潜到合适的位置

三.大顶堆

大顶堆(Max Heap)是一种堆的实现方式,它满足以下性质:

  1. 每个节点的值都大于或等于其子节点的值。
  2. 堆顶元素(根节点)是整个堆中最大的元素。

在大顶堆中,任意节点的值都大于或等于其子节点的值,但是它们之间的顺序并没有固定的要求,即左右子节点之间的大小关系并不要求一定是有序的。

大顶堆可以通过数组完全二叉树来实现。在数组中,堆的根节点存储在索引为0的位置,而任意节点i的左子节点存储在索引为2i+1的位置,右子节点存储在索引为2i+2的位置。

大顶堆的常见操作包括:

  1. 插入元素:将元素插入堆的底部,然后通过调整堆的结构将其置于正确的位置上,以保持堆的性质。
  2. 删除堆顶元素:将堆顶元素与堆底元素交换,然后删除堆底元素,再通过调整堆的结构将堆顶元素置于正确的位置上

四.基于数组实现大顶堆

package 堆;import java.util.Arrays;
import java.util.Iterator;/*** 大顶堆*/
public class MaxHeap implements Iterable<Integer>{int[] array;int size;/*** 通过构造方法将任意数组调整为大顶堆* @param array*/public MaxHeap(int[] array){this.array = array;this.size = array.length;this.heapify();}public MaxHeap(int capacity){this.array = new int[capacity+1];size = 0;}/*** 调整堆*  从最后一个非叶子节点开始,以此向前开始调整堆*  使其符合大顶堆的特性*/public void heapify(){for (int i = size/2 -1 ; i>=0 ; i--) {down(i);}}/*** 添加元素,*  1.先添加到数组的末尾+1处 size处*  2.然后判断该处和他的父节点处元素大小,如果比他的父亲大,就交换二者,*     parent = (child-1) / 2*  3.然后将child置为parent,parent置为它的parent,以此往上走,*  4.两种情况:*     - (1)直到child为 0,这种是offered比所有的元素都大的情况*     - (2)直到child处元素不比parent处大,就是已经上浮到合适的位置了,*     退出循环*  5.将array[child]处赋值为offered** @param offered* @return*/public boolean offer(int offered){if(size == array.length){return false;}//上浮size++;up(offered);return true;}/*** 上浮* @param offered*/public void up(int offered){//先找到末尾位置int child = size;//如果child>0,就继续上浮while (child > 0){//找到父节点int parent = (child - 1) / 2;//比较child和parentif(offered > array[parent]){//交换child和parentarray[child] = array[parent];}else {break;}//交换完成一次之后,将child置为parentchild = parent;}//上浮完成后,为array[child]处赋值array[child] = offered;}/*** 获取堆顶元素* @return 堆顶元素*/public int peek(){if(size==0){return Integer.parseInt(null);}return array[0];}/*** 移除堆顶元素* @return 堆顶元素*/public int poll(){if(size==0){return Integer.parseInt(null);}int top = array[0];//先交换堆顶和最后一个元素swap(0,size-1);size--;//从堆顶开始下潜down(0);return top;}/*** 移除指定位置处的元素* @param index 指定位置* @return index处元素*/public int poll(int index){if(size==0){return Integer.parseInt(null);}int indexE = array[index];//先交换index处和最后一个元素swap(index,size-1);size--;//从index处开始下潜down(index);return indexE;}/*** 替换堆顶元素*/public void replace(int replaced){if(size==0){throw new RuntimeException("堆为空!");}array[0] = replaced;//下潜down(0);}/*** 下潜操作* @param parent 最后一个非叶子节点*/public void down(int parent){//找到该非叶子节点的左孩子和右孩子int left =  parent*2 + 1;int right = left + 1;//先假设parent是最大的int max = parent;//然后分别比较parent和left,right的大小if(left<size && array[max] < array[left]){max = left;}if(right<size && array[max] < array[right]){max = right;}/*** 如果max!=parent,说明孩子有比父亲大的,所以要交换二者,* 当交换后,堆结构可能会被破坏,所以要继续调整堆,使其所有节点* 都满足大顶堆的特性*/if(max != parent){swap(max,parent);down(max);}}public void swap(int i,int j){int temp = array[i];array[i] = array[j];array[j] = temp;}@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {int p = 0;@Overridepublic boolean hasNext() {return p != size;}@Overridepublic Integer next() {int res = array[p];p++;return res;}};}
}

测试一下:

    public static void main(String[] args) {int[] array = {1,2,3,4,5,6,7};MaxHeap maxHeap = new MaxHeap(array);System.out.println(Arrays.toString(maxHeap.array));maxHeap.poll();System.out.print("[");for (Integer num : maxHeap) {System.out.print(num+",");}System.out.print("]");}

运行:

[7, 5, 6, 4, 2, 1, 3]
[6,5,3,4,2,1,]
进程已结束,退出代码0

可以看到满足大顶堆特性

五.堆排序

  可以利用大顶堆的特性,堆顶元素最大,实现堆排序,将无序数组调整为从小到大排序

 /*** 堆排序*/@Testpublic void testHeapPaiXu(){int[] array = {3,1,6,2,7,4,9,1,3};MaxHeap heap = new MaxHeap(array);while (heap.size > 1){//先交换heap.swap(0,heap.size-1);//size减一heap.size--;//下潜调整堆heap.down(0);}System.out.println(Arrays.toString(heap.array));}

运行:


[1, 1, 2, 3, 3, 4, 6, 7, 9]

可以看到已经成功调整了排序

六.小顶堆

小顶堆(Min Heap)是一种堆的实现方式,它满足以下性质:

  1. 每个节点的值都小于或等于其子节点的值。
  2. 堆顶元素(根节点)是整个堆中最小的元素。

在小顶堆中,任意节点的值都小于或等于其子节点的值,但是它们之间的顺序并没有固定的要求,即左右子节点之间的大小关系并不要求一定是有序的。

小顶堆可以通过数组或完全二叉树来实现。在数组中,堆的根节点存储在索引为0的位置,而任意节点i的左子节点存储在索引为2i+1的位置,右子节点存储在索引为2i+2的位置。

小顶堆的常见操作包括:

  1. 插入元素:将元素插入堆的底部,然后通过调整堆的结构将其置于正确的位置上,以保持堆的性质。
  2. 删除堆顶元素:将堆顶元素与堆底元素交换,然后删除堆底元素,再通过调整堆的结构将堆顶元素置于正确的位置上。

小顶堆在各种算法和数据结构中也有广泛应用,和大顶堆类似。

七.基于数组实现小顶堆

  实现小顶堆和大顶堆类似,只需要把up和down中的比较符合改变即可:

package 堆;import java.util.Iterator;/*** 小顶堆*/
public class MinHeap implements Iterable<Integer> {int[] array;int size;/*** 通过构造方法将任意数组调整为大顶堆* @param array*/public MinHeap(int[] array){this.array = array;this.size = array.length;this.heapify();}public MinHeap(int capacity){this.array = new int[capacity+1];this.size = 0;}/*** 调整堆*  从最后一个非叶子节点开始,以此向前开始调整堆*  使其符合大顶堆的特性*/public void heapify(){for (int i = size/2 -1 ; i>=0 ; i--) {down(i);}}/*** 添加元素,*  1.先添加到数组的末尾+1处 size处*  2.然后判断该处和他的父节点处元素大小,如果比他的父亲小,就交换二者,*     parent = (child-1) / 2*  3.然后将child置为parent,parent置为它的parent,以此往上走,*  4.两种情况:*     - (1)直到child为 0,这种是offered比所有的元素都小的情况*     - (2)直到child处元素不比parent处小,就是已经上浮到合适的位置了,*     退出循环*  5.将array[child]处赋值为offered** @param offered* @return*/public boolean offer(int offered){if(size == array.length){return false;}//上浮size++;up(offered);return true;}/*** 上浮* @param offered*/public void up(int offered){//先找到末尾位置int child = size;//如果child>0,就继续上浮while (child > 0){//找到父节点int parent = (child - 1) / 2;//比较child和parentif(offered < array[parent]){//交换child和parentarray[child] = array[parent];}else {break;}//交换完成一次之后,将child置为parentchild = parent;}//上浮完成后,为array[child]处赋值array[child] = offered;}/*** 获取堆顶元素* @return 堆顶元素*/public int peek(){if(size==0){return Integer.parseInt(null);}return array[0];}/*** 移除堆顶元素* @return 堆顶元素*/public int poll(){if(size==0){return Integer.parseInt(null);}int top = array[0];//先交换堆顶和最后一个元素swap(0,size-1);size--;//从堆顶开始下潜down(0);return top;}/*** 移除指定位置处的元素* @param index 指定位置* @return index处元素*/public int poll(int index){if(size==0){return Integer.parseInt(null);}int indexE = array[index];//先交换index处和最后一个元素swap(index,size-1);size--;//从index处开始下潜down(index);return indexE;}/*** 替换堆顶元素*/public void replace(int replaced){if(size==0){throw new RuntimeException("堆为空!");}array[0] = replaced;//下潜down(0);}/*** 下潜操作* @param parent 最后一个非叶子节点*/public void down(int parent){//找到该非叶子节点的左孩子和右孩子int left =  parent*2 + 1;int right = left + 1;//先假设parent是最大的int min = parent;//然后分别比较parent和left,right的大小if(left<size && array[min] > array[left]){min = left;}if(right<size && array[min] > array[right]){min = right;}/*** 如果min!=parent,说明孩子有比父亲小的,所以要交换二者,* 当交换后,堆结构可能会被破坏,所以要继续调整堆,使其所有节点* 都满足小顶堆的特性*/if(min != parent){swap(min,parent);down(min);}}public void swap(int i,int j){int temp = array[i];array[i] = array[j];array[j] = temp;}@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {int p = 0;@Overridepublic boolean hasNext() {return p != size;}@Overridepublic Integer next() {int res = array[p];p++;return res;}};}}

八.ProiorityQueue和Heap

Java中自带的堆实现类包括PriorityQueueHeap,它们都是基于小顶堆的数据结构。

  1. PriorityQueue: PriorityQueue是Java中的优先队列类,它是通过小顶堆实现的。PriorityQueue可以自动将元素按照优先级进行排序,并保证每次操作的时间复杂度为O(logn)。
    PriorityQueue的常见方法包括:add(E e)、offer(E e):将元素插入队列;remove()、poll():删除并返回队列中的头元素;peek():返回队列中的头元素。

  2. Heap:Heap是Java中提供的用于实现堆数据结构的抽象类,它定义了一些基本的堆操作,如插入、删除元素,获取堆顶元素等。可以通过继承Heap类来实现自定义的堆。

 示例:

1.PriorityQueue的例子:

  

import java.util.PriorityQueue;public class PriorityQueueExample {public static void main(String[] args) {// 创建一个优先队列,默认是小顶堆PriorityQueue<Integer> pq = new PriorityQueue<>();// 使用offer方法插入元素到队列中pq.offer(5);pq.offer(3);pq.offer(8);pq.offer(1);pq.offer(9);// 使用poll方法获取并删除队列中的头元素while (!pq.isEmpty()) {System.out.print(pq.poll() + " ");}}
}

 输出结果:1 3 5 8 9

2.Heap的例子:

import java.util.Collections;
import java.util.Comparator;
import java.util.List;public class HeapExample {public static void main(String[] args) {// 创建一个堆List<Integer> heap = new Heap<>(Comparator.naturalOrder());// 使用offer方法插入元素到堆中heap.offer(5);heap.offer(3);heap.offer(8);heap.offer(1);heap.offer(9);// 使用poll方法获取并删除堆顶元素while (!heap.isEmpty()) {System.out.print(heap.poll() + " ");}}
}

 输出结果:1 3 5 8 9

请注意,Heap类并不是Java标准库中的一部分,它只是一个示例实现。在实际开发中,通常会使用PriorityQueue来实现堆的功能

九.求数组中第K大元素

package 堆;/*** 求数组中第k大的元素*/
public class L255_K_max {public static void main(String[] args) {int[] array = {1,4,2,6,3,9,5,10};int max = K_Max(array, 2);System.out.println(max);}/***  思路:*   1.首先将前 k 个元素添加到堆中,调整为小顶堆*   2.然后从 k 处向后依次遍历:*   ->(1)如果 元素比堆顶元素小,就跳过*   -> (2) 如果元素比堆顶元素大,则替换堆顶元素*   3.最后遍历完成,返回堆顶元素,该元素就是第 K 大的元素* @param array* @param k* @return*/public static int K_Max(int[] array,int k){MinHeap heap = new MinHeap(k);for (int i = 0; i < k; i++) {heap.offer(array[i]);}for(int i = k; i< array.length;i++){if(array[i] > heap.peek()){heap.replace(array[i]);}}return heap.peek();}}

 运行:

9进程已结束,退出代码0

十.求数据流中第K大元素

package 堆;/*** 求数据流中第K大的元素*/
public class L703_Stream_K_Max {private MinHeap heap;public L703_Stream_K_Max(int[] nums,int k){this.heap = new MinHeap(k);for (int num : nums) {add(num);}}public  int add(int val){//如果不满,先添加if(heap.size != heap.array.length-1){heap.offer(val);}else if( val > heap.peek() ){//满了,替换返回heap.replace(val);}return heap.peek();}public static void main(String[] args) {int nums[] = {1,2,6,3,11,5,9};L703_Stream_K_Max stream_k_max = new L703_Stream_K_Max(nums, 3);System.out.println(stream_k_max.add(2));System.out.println(stream_k_max.add(12));System.out.println(stream_k_max.add(1));}}

运行:

5
9
9进程已结束,退出代码0

十一.求数据流的中位数

/*** 求数据流的中位数*/
public class L295_Stream_Medin {/*** 实现思路:*   比如现在有一个数组: [1,2,3,4,5,6,7,8]*   那么它的中位数是 (4+5)/2 = 4.5*   如果是:[1,2,3,4,5,6,7,8,9]*   那么中位数是 5*   一般情况下,每次都先排序,然后找到中位数,这样效率不高,**   堆实现:*    将数组元素平均分为两份,左边和右边,然后两边分别建堆*    left 建立 MaxHeap, right 建立 MinHeap*    左边的堆顶是左边最大的,右边的堆顶是右边最小的,*    这样,相加除以 2 就可以得到,*    如果是奇数,只需要取左边的堆顶元素**    向数组中添加元素时:*    1.如果两边元素个数一样,向左边添加元素,*    2.如果两边个数不一样(左边比右边多一),向右边添加元素*     注意:添加元素是有技巧的:*      -》向左边添加元素时,先向右边添加元素,然后挤出右边最小的一个元素添加到左边*      -》向右边添加元素时,先向左边添加元素,然后挤出左边最大的一个元素添加到右边*/private MaxHeap leftMaxHeap = new MaxHeap(10);private MinHeap rightMinHeap = new MinHeap(10);public void add(int num){//如果左右两边个数相等if(leftMaxHeap.size == rightMinHeap.size){/*** 添加到左边去,但是要先向右添加,再挤出一个最小的到左边*/rightMinHeap.offer(num);leftMaxHeap.offer(rightMinHeap.poll());}else {//左边比右边多一个,同理,先向左添加,然后挤出一个最大的到右边leftMaxHeap.offer(num);rightMinHeap.offer(leftMaxHeap.poll());}}/*** 返回中位数* @return*/public double getMedNum(){//如果两边个数一样,返回二者堆顶元素平均值if(leftMaxHeap.size == rightMinHeap.size){return (leftMaxHeap.peek() + rightMinHeap.peek()) / 2.0;}else{//返回左边元素return leftMaxHeap.peek();}}public static void main(String[] args) {L295_Stream_Medin stream_medin = new L295_Stream_Medin();stream_medin.add(1);stream_medin.add(2);stream_medin.add(3);stream_medin.add(4);stream_medin.add(5);stream_medin.add(6);stream_medin.add(7);stream_medin.add(8);stream_medin.add(9);System.out.println(stream_medin.getMedNum());}}

运行:

5.0进程已结束,退出代码0

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

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

相关文章

软件开发项目文档系列之十六如何撰写系统运维方案

前言 项目运维方案是为了确保项目的稳定运行和可持续发展而制定的指导性文档。本文将详细介绍项目运维方案的各个方面&#xff0c;包括硬件和软件基础设施、监控和警报、备份和恢复、安全性、团队组织和沟通等方面。本博客将提供示例和最佳实践&#xff0c;以帮助您更好地理解…

什么是ajax,ajax有什么特点?

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于在后台与服务器进行异步通信的技术。它使用 JavaScript、XML&#xff08;或 JSON&#xff09;和 XMLHttpRequest 对象来实现在不刷新整个页面的情况下更新部分页面内容。 特点&#xff1a; 异步通信&a…

Ubuntu显示毫秒级时间

Ubuntu显示毫秒级时间 1. 打印当前时间 1. 打印当前时间 date 时间&#xff0c;转化成毫秒级 $ date # Mon 03 Apr 2023 11:09:47 PM CST$ echo -e "$(date %T).$((10#$(date %N)/1000000))" # 23:09:55.552谢谢

一些分享| 在线笔记、GIF图片生成方法

文章目录 在线笔记视频转GIF 本片博客旨在挖掘一些好用且免费的在线平台&#xff0c;持续更新中~ 正所谓科技解放双手&#xff0c;使用在线平台可以方便快捷地学习办公&#xff0c;节省时间。 在线笔记 语雀 https://www.yuque.com/dashboard 语雀是笔者用得最长最久的平台了…

maven: Cannot access nexus-all xxx in offline mode错误的解决

1. 絮絮叨叨 之前&#xff0c;同事告诉过一个加速编译的mvn命令 mvn -o -T 4C clean install -DskipTests -Dmaven.compile.forktrue 忽然&#xff0c;上周在公司的蛇口编译机器&#xff0c;执行这个命令就行不通了 错误信息&#xff0c;由于编以输出太多被淹没了&#xff0c…

Leetcode—102.二叉树的层序遍历【中等】

2023每日刷题&#xff08;二十四&#xff09; Leetcode—102.二叉树的层序遍历 C语言BFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Return an array of arr…

线性表——编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2,b3,...,bn)放在(a1,a2,a3,...,an)的前面。

题目&#xff1a;已知在一维数组A[mn]中依次存放两个线性表&#xff08;a1,a2,a3,...,an&#xff09;和&#xff08;b1,b2,b3,...,bn&#xff09;。编写一个函数&#xff0c;将数组中两个顺序表的位置互换&#xff0c;即将&#xff08;b1,b2,b3,...,bn&#xff09;放在&#xf…

ubuntu下载各个版本chrome方法

Ubuntu/debian 在这里面找版本 https://unix.stackexchange.com/a/612981然后添充进去 http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_[HERE_THE_FULL_VERSION]_amd64.deb比如&#xff1a;https://dl.google.com/linux/chro…

Springboot项目部署及多环境开发

一、项目部署 我们之前写的代码都是部署在本地的tomcat上&#xff0c;别人是无法访问我们写的程序的。在实际开发中&#xff0c;我们都要将开发完毕的项目部署到公司的服务器上。 我们的代码需要经过编译打包生成一个jar包&#xff0c;这个过程需要借助一个插件来实现。 创建sp…

【微软技术栈】C#.NET 如何使用本地化的异常消息创建用户定义的异常

本文内容 创建自定义异常创建本地化异常消息 在本文中&#xff0c;你将了解如何通过使用附属程序集的本地化异常消息创建从 Exception 基类继承的用户定义异常。 一、创建自定义异常 .NET 包含许多你可以使用的不同异常。 但是&#xff0c;在某些情况下&#xff0c;如果它们…

STL简介+浅浅了解string——“C++”

各位CSDN的uu们好呀&#xff0c;终于到小雅兰的STL的学习了&#xff0c;下面&#xff0c;让我们进入CSTL的世界吧&#xff01;&#xff01;&#xff01; 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的缺陷 7.为什么要学习string类 …

pinpoint监控tomcat应用,页面显示No data collected

pinpoint安装部署教程大家都可以搜到。这里就不说了。单说一下 页面没有数据的情况。 部署环境&#xff0c;pinpoint安装部署在A服务器上。现在是在C、D、E、F……linux机器上安装pinpoint-agnet 1. 将文件 pinpoint-agent-1.8.5.tar.gz 上传到 服务器C、D、E、F…… 2. 解压…

第十八章DOM操作控制

DOM操作分类&#xff1a; jQuery中的DOM操作 一。设置和获取样式值 1.追加样式 addClass&#xff1a;追加CSS效果 removeClass&#xff1a;去除CSS内容 2.切换样式 3.判断是否含有指定样式&#xff1a;判断的是布尔类型的值 二。内容操作&#xff1a; 1.HTML代码操作 2.TEXT代…

【算法与设计模式】

一、数据结构与算法 1、算法性能评估 时间复杂度、空间复杂度 2、数据结构 数组与列表 队列 堆栈 链表 二叉树 多叉树 递归算法 二、设计模式 1、单例 &#xff08;1&#xff09;GIL&#xff1a;线程互斥锁。保证同一时刻只有一个线程在进行。 &#xff08;2&#xff09…

Git GUI、SSH协议和IDEA中的Git使用详解

目录 前言 一、Git GUI的使用 1. 什么是Git GUI 2. 常见的Git GUI工具 3.使用 4.使用Git GUI工具的优缺点 优点&#xff1a; 缺点&#xff1a; 二、SSH协议 1.什么是SSH协议 2.SSH的主要特点和作用 3.SSH密钥认证的原理和流程 4. SSH协议的使用 三、IEDA使用git …

js随机生成颜色

封装一个函数 返回一个随机颜色 不传参数或者传true返回十六进制&#xff0c; 传false返回rgb模式 script>function Random(n, m) {if (n > m) {let temp nn mm temp}return Math.floor(Math.random() * (m - n 1)) n}function getRandomColor(flag true) {if (fl…

Linux常用命令——bzip2recover命令

在线Linux命令查询工具 bzip2recover 恢复被破坏的.bz2压缩包中的文件 补充说明 bzip2recover命令可用于恢复被破坏的“.bz2”压缩包中的文件。 bzip2是以区块的方式来压缩文件&#xff0c;每个区块视为独立的单位。因此&#xff0c;当某一区块损坏时&#xff0c;便可利用b…

桌面图标设置-将“我的电脑”、“控制面板”添加到桌面

桌面图标设置 1、将“我的电脑”、“控制面板”添加到桌面 桌面鼠标右键-个性化-主题-桌面图标设置-勾选”计算机“、”回收站“、”控制面板“-应用-确定-桌面鼠标右键-排序-名称

数据结构 队列(C语言实现)

目录 1.队列的概念及结构2.队列的代码实现 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 1.队列的概念及结构 队列&#xff1a;只允许在…

Ceph入门到精通-网络调优netstat -s

netstat -s 统计结果 每个指标含义及值是否正常 Tcp:66115434 active connection openings92137410 passive connection openings13925035 failed connection attempts28188907 connection resets received29397 connections established85972524908 segments received30324088…