【无标题】堆
@[TOC](优先级队列(堆))
【本节目标】
1. 掌握堆的概念及实现
2. 掌握 PriorityQueue 的使用
# 1. 优先级队列
## 1.1 概念
前面介绍过队列,**队列是一种先进先出(FIFO)的数据结构**,但有些情况下,**操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列**,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话;初中那会班主任排座位时可能会让成绩好的同学先挑座位。
在这种情况下,**数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象**。这种数据结构就是**优先级队列(Priority Queue)**。
# 2. 优先级队列的模拟实现
JDK1.8中的**PriorityQueue底层使用了堆这种数据结构**,而堆实际就是在完全二叉树的基础上进行了一些调整。
## 2.1 堆的概念
如果有一个**关键码的集合K = {k0,k1, k2,…,kn-1}**,把它的所有元素**按完全二叉树的顺序存储方式存储 在一个一维数组中**,并满足:**Ki <= K2i+1 且 Ki<= K2i+2** (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则**称为 小堆**(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
**堆的性质**:
+ 堆中某个节点的值总是不大于或不小于其父节点的值;
+ 堆总是一棵完全二叉树。

## 2.2 堆的存储方式
从堆的概念可知,**堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来高效存储**,

注意:对于**非完全二叉树,则不适合使用顺序方式进行存储**,因为为了能够还原二叉树,空间中必须要存储空节点,就会导致**空间利用率比较低**。

将元素存储到数组中后,可以根据二叉树章节的性质5对树进行还原。假设i为节点在数组中的下标,则有:
+ 如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为 (i - 1)/2
+ 如果2 * i + 1 小于节点个数,则节点i的左孩子下标为2 * i + 1,否则没有左孩子
+ 如果2 * i + 2 小于节点个数,则节点i的右孩子下标为2 * i + 2,否则没有右孩子
## 2.3 堆的创建
### 2.3.1 堆向下调整
对于集合{ 27,15,19,18,28,34,65,49,25,37 }中的数据,如果将其创建成堆呢?

仔细观察上图后发现:**根节点的左右子树已经完全满足堆的性质,因此只需将根节点向下调整好即可**。
**向下过程(以小堆为例)**:
1. 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子)
2. 如果parent的左孩子存在,即:child < size, 进行以下操作,直到parent的左孩子不存在
+ parent右孩子是否存在,存在找到左右孩子中最小的孩子,让child进行标
+ 将parent与较小的孩子child比较,如果:
+ parent小于较小的孩子child,调整结束
+ 否则:交换parent与较小的孩子child,交换完成之后,parent中大的元素向下移动,可能导致子树不满足对的性质,因此需要继续向下调整,即parent = child;child = parent*2+1; 然后继续2。

大根堆:



小根堆代码:
```java
public void shiftDown(int[] array, int parent) {
// child先标记parent的左孩子,因为parent可能右左没有右
int child = 2 * parent + 1;
int size = array.length;
while (child < size) {
// 如果右孩子存在,找到左右孩子中较小的孩子,用child进行标记
if(child+1 < size && array[child+1] < array[child]){
child += 1;
}
// 如果双亲比其最小的孩子还小,说明该结构已经满足堆的特性了
if (array[parent] <= array[child]) {
break;
}else{
// 将双亲与较小的孩子交换
int t = array[parent];
array[parent] = array[child];
array[child] = t;
// parent中大的元素往下移动,可能会造成子树不满足堆的性质,因此需要继续向下调整
parent = child;
child = parent * 2 + 1;
}
}
}
```
**注意:在调整以parent为根的二叉树时,必须要满足parent的左子树和右子树已经是堆了才可以向下调整。
时间复杂度分析**:
最坏的情况即图示的情况,**从根一路比较到叶子,比较的次数为完全二叉树的高度,即时间复杂度为O(log~2~ n)**
### 2.3.2 堆的创建
那对于普通的序列{ 1,5,3,8,7,6 },即根节点的左右子树不满足堆的特性,又该如何调整呢?

参考代码:
```java
public static void createHeap(int[] array) {
// 找倒数第一个非叶子节点,从该节点位置开始往前一直到根节点,遇到一个节点,应用向下调整
int root = ((array.length-2)>>1);
for (; root >= 0; root--) {
shiftDown(array, root);
}
}
```
### 2.3.3 建堆的时间复杂度
因为堆是完全二叉树,而满二叉树也是完全二叉树,此处为了简化使用满二叉树来证明(时间复杂度本来看的就是近似值,多几个节点不影响最终结果):


因此:当我们采用向下调整去建堆的时候,建堆的时间复杂度为O(N)。
## 2.4 堆的插入与删除
### 2.4.1 堆的插入
堆的插入总共需要两个步骤:
1. 先将元素放入到底层空间中(注意:空间不够时需要扩容)
2. 将最后新插入的节点向上调整,直到满足堆的性质




```java
public void shiftUp(int child) {
// 找到child的双亲
int parent = (child - 1) / 2;
while (child > 0) {
// 如果双亲比孩子大,parent满足堆的性质,调整结束
if (array[parent] > array[child]) {
break;
}
else{
// 将双亲与孩子节点进行交换
int t = array[parent];
array[parent] = array[child];
array[child] = t;
// 小的元素向下移动,可能到值子树不满足对的性质,因此需要继续向上调增
child = parent;
parent = (child - 1) / 1;
}
}
}
```
### 2.4.2 堆的删除
**注意:堆的删除一定删除的是堆顶元素**。具体如下:
1. 将堆顶元素对堆中最后一个元素交换
2. 将堆中有效数据个数减少一个
3. 对堆顶元素进行向下调整


## 2.5 用堆模拟实现优先级队列
```java
public class MyPriorityQueue {
// 演示作用,不再考虑扩容部分的代码
private int[] array = new int[100];
private int size = 0;
public void offer(int e) {
array[size++] = e;
shiftUp(size - 1);
}
public int poll() {
int oldValue = array[0];
array[0] = array[--size];
shiftDown(0);
return oldValue;
}
public int peek() {
return array[0];
}
}
```
**常见习题:**
>1. 下列关键字序列为堆的是:()
A: 100,60,70,50,32,65 B: 60,70,65,50,32,100 C: 65,100,70,32,50,60
D: 70,65,100,32,50,60 E: 32,50,100,70,65,60 F: 50,100,70,65,60,32
>2. 已知小根堆为8,15,10,21,34,16,12,删除关键字8之后需重建堆,在此过程中,关键字之间的比较次数是()
A: 1 B: 2 C: 3 D: 4
>3. 最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()
A: [3,2,5,7,4,6,8] B: [2,3,5,7,4,6,8]
C: [2,3,4,5,7,8,6] D: [2,3,4,5,6,7,8]
>[参考答案]
1.A 2.C 3.C
# 3.常用接口介绍
## 3.1 PriorityQueue的特性
Java集合框架中提供了**PriorityQueue**和**PriorityBlockingQueue**两种类型的优先级队列,**PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的**,本文主要介绍PriorityQueue。

关于PriorityQueue的使用要注意:
1. 使用时必须导入PriorityQueue所在的包,即:
```java
import java.util.PriorityQueue;
```
2. PriorityQueue中放置的**元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常**
3. **不能插入null对象,否则会抛出NullPointerException**
4. **没有容量限制,可以插入任意多个元素,其内部可以自动扩容**
5. **插入和删除元素的时间复杂度为O(log~2~N)**
6. **PriorityQueue底层使用了堆数据结构**
7. **PriorityQueue默认情况下是小堆**---即每次获取到的元素都是最小的元素
## 3.2 PriorityQueue常用接口介绍
1. 优先级队列的构造
此处只是列出了PriorityQueue中常见的几种构造方式,其他的学生们可以参考帮助文档

```java
static void TestPriorityQueue(){
// 创建一个空的优先级队列,底层默认容量是11
PriorityQueue<Integer> q1 = new PriorityQueue<>();
// 创建一个空的优先级队列,底层的容量为initialCapacity
PriorityQueue<Integer> q2 = new PriorityQueue<>(100);
ArrayList<Integer> list = new ArrayList<>();
list.add(4);
list.add(3);
list.add(2);
list.add(1);
// 用ArrayList对象来构造一个优先级队列的对象
// q3中已经包含了三个元素
PriorityQueue<Integer> q3 = new PriorityQueue<>(list);
System.out.println(q3.size());
System.out.println(q3.peek());
}
```
注意:默认情况下,PriorityQueue队列是小堆,如果需要大堆需要用户提供比较器
```java
// 用户自己定义的比较器:直接实现Comparator接口,然后重写该接口中的compare方法即可
class IntCmp implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
}
public class TestPriorityQueue {
public static void main(String[] args) {
PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp());
p.offer(4);
p.offer(3);
p.offer(2);
p.offer(1);
p.offer(5);
System.out.println(p.peek());
}
}
```
此时创建出来的就是一个大堆。
2. 插入/删除/获取优先级最高的元素

```java
static void TestPriorityQueue2(){
int[] arr = {4,1,9,2,8,0,7,3,6,5};
// 一般在创建优先级队列对象时,如果知道元素个数,建议就直接将底层容量给好
// 否则在插入时需要不多的扩容
// 扩容机制:开辟更大的空间,拷贝元素,这样效率会比较低
PriorityQueue<Integer> q = new PriorityQueue<>(arr.length);
for (int e: arr) {
q.offer(e);
}
System.out.println(q.size()); // 打印优先级队列中有效元素个数
System.out.println(q.peek()); // 获取优先级最高的元素
// 从优先级队列中删除两个元素之和,再次获取优先级最高的元素
q.poll();
q.poll();
System.out.println(q.size()); // 打印优先级队列中有效元素个数
System.out.println(q.peek()); // 获取优先级最高的元素
q.offer(0);
System.out.println(q.peek()); // 获取优先级最高的元素
// 将优先级队列中的有效元素删除掉,检测其是否为空
q.clear();
if(q.isEmpty()){
System.out.println("优先级队列已经为空!!!");
}
else{
System.out.println("优先级队列不为空");
}
}
```
注意:以下是JDK 1.8中,PriorityQueue的扩容方式:
```java
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
int oldCapacity = queue.length;
// Double size if small; else grow by 50%
int newCapacity = oldCapacity + ((oldCapacity < 64) ?
(oldCapacity + 2) :
(oldCapacity >> 1));
// overflow-conscious code
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
queue = Arrays.copyOf(queue, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
```
优先级队列的扩容说明:
+ 如果容量小于64时,是按照oldCapacity的2倍方式扩容的
+ 如果容量大于等于64,是按照oldCapacity的1.5倍方式扩容的
+ 如果容量超过MAX_ARRAY_SIZE,按照MAX_ARRAY_SIZE来进行扩容
## 3.3 oj练习
top-k问题:最大或者最小的前k个数据。比如:世界前500强公司
[top-k问题:最小的K个数](https://leetcode.cn/problems/smallest-k-lcci/description/)
```java
class Solution {
public int[] smallestK(int[] arr, int k) {
// 参数检测
if(null == arr || k <= 0)
return new int[0];
PriorityQueue<Integer> q = new PriorityQueue<>(arr.length);
// 将数组中的元素依次放到堆中
for(int i = 0; i < arr.length; ++i){
q.offer(arr[i]);
}
// 将优先级队列的前k个元素放到数组中
int[] ret = new int[k];
for(int i = 0; i < k; ++i){
ret[i] = q.poll();
}
return ret;
}
}
```
该解法只是PriorityQueue的简单使用,并不是topK最好的做法,那topk该如何实现?下面介绍:
# 4. 堆的应用
## 4.1 PriorityQueue的实现
用堆作为底层结构封装优先级队列
## 4.2 堆排序
堆排序即利用堆的思想来进行排序,总共分为两个步骤:
1. 建堆
升序:建大堆
降序:建小堆
2. 利用堆删除思想来进行排序
建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。
相关文章:
【无标题】堆
[TOC](优先级队列(堆)) 【本节目标】 1. 掌握堆的概念及实现 2. 掌握 PriorityQueue 的使用 # 1. 优先级队列 ## 1.1 概念 前面介绍过队列,**队列是一种先进先出(FIFO)的数据结构**,但有些情况下,**操作的数据可…...
【工具变量】上市公司企业绿色新闻数据(2013-2023年)
测算方式: 参考《中国工业经济》周泽将(2023)老师的做法,首先通过网络爬虫的方法检索并爬取上市公司相关新闻,并辅以人工检索补充校对;新闻文本清理,并通过公司相关性判定以及主题模型识别该新闻是否为上市公司环保主…...
【vue】高德地图AMap.Polyline动态更新画折线,逐步绘制
可以使用 setTimeout 或 setInterval 来逐个点绘制折线,确保每次添加新的点到 path 并更新 Polyline,如下所示: localPolyline(path) {console.log(逐点绘制 polyline...);let drawnPath []; // 用于存储当前绘制的点let index 0;let poly…...
Lecture8 | LPV VXGI SSAO SSDO
Review: Lecture 7 | Lecture 8 LPV (Light Propagation Volumes) Light Propagation Volumes(LPV)-孤岛惊魂CryEngine引进的技术 LPV做GI快|好 大体步骤: Step1.Generation of Radiance Point Set Scene Representation 生成辐射点集的场景表示:辐射…...
三种Excel文本连接方法!
大家好,我是小鱼。 在处理Excel表格数据时,有时需要对表格某些单元格中的文本进行连接组合。今天就跟大家分享3种Excel文本连接方法!学会后遇到Excel文本连接问题也不求人! 方法一、使用&符号连接 使用&符号连接文本的话…...
ubuntu 本地部署deepseek r1 蒸馏模型
本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署:基于docker安装,且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线操作。它支持各种 LLM…...
如何删除本地大模型
随着Deepseep模型的爆火,越来越多的用户尝试在本地安装并体验这一强大的AI工具。然而,许多人在安装过程中发现,模型默认会安装在C盘,而C盘的空间通常有限,尤其是对于那些系统盘容量较小的用户来说,这无疑是…...
【共享文件夹】使用Samba服务可在Ubuntu和Windows系统之间共享一个实际的文件夹
目标:在Ubuntu和Windows系统之间共享一个实际的文件夹,并能够共同编辑其中的文件 安装Samba创建共享文件夹配置Samba设置Samba密码重启Samba服务以应用更改:在Windows中访问共享文件夹如果客户机无法访问 Samba 服务器,解决方法①…...
用Llama Factory单机多卡微调Qwen2.5时报torch.OutOfMemoryError: CUDA out of memory的解决办法
接着上一篇博客:在Ubuntu上用Llama Factory命令行微调Qwen2.5的简单过程_llamafactory 微调qwen 2.5-CSDN博客 如果需要微调比较大的模型,例如Qwen2.5-32B,那么在两个3090上可能不够用,这里我用A60004的服务器。但如果仿照上篇博…...
第 26 场 蓝桥入门赛
3.电子舞龙【算法赛】 - 蓝桥云课 问题描述 话说这年头,连舞龙都得电子化!这不,蓝桥村的老程序员王大爷突发奇想,用LED灯带和一堆传感器鼓捣出了一条“电子舞龙”,它能根据程序指令在村里的广场上“翩翩起舞”。 广…...
文华财经期货支撑压力多空K线变色期货指标,博易大师指标公式大全
低线:25,DOT; 中线:55,DOT; 高线:85,DOT; LOWV:LLV(LOW,9); HIGHV:HHV(HIGH,9); RSV:EMA((CLOSE-LOWV)/(HIGHV-LOWV)*100,3); K:EMA(RSV,3); 趋势线:MA(K,3); DBA:K-趋势线; STICKLINE(DBA>0,(K-DBA*0.1),(K-DBA*0.75),2,0),COLORRED; STICKLINE(DBA<0,(趋势线DBA*0.1),…...
基于大模型的围术期脆弱性评估系统研究报告
一、引言 1.1 研究背景与意义 围术期是指从患者决定接受手术治疗开始,到手术治疗直至基本康复的全过程,包括术前、术中和术后三个阶段。围术期管理对于保障患者安全、提高治疗效果具有至关重要的意义。在术前阶段,全面准确的评估患者身体状况能够帮助医生提前发现潜在风险…...
星网锐捷 视频话机设备pwdsetting管理密码信息泄漏
星网锐捷 视频话机设备pwdsetting管理密码信息泄漏 漏洞描述 星网锐捷视频话机设备 泄露管理员密码,攻击者可利用密码直接进入后台配置页面,执行恶意操作,进行一步攻击。 威胁等级: 高危 漏洞分类: 信息泄露 涉及厂商及产品:…...
深入理解小波变换:信号处理的强大工具
引言 在科学与工程领域,信号处理一直是关键环节,傅里叶变换与小波变换作为重要的分析工具,在其中发挥着重要作用。本文将深入探讨小波变换,阐述其原理、优势以及与傅里叶变换的对比,并通过具体案例展示其应用价值。 一…...
Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)
一、协程 1.1、协程 协程,Coroutines,也叫作纤程(Fiber) 协程,全称是“协同程序”,用来实现任务协作。是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。 当出现IO阻塞时,…...
神经网络(Neural Network)
引言 神经网络,作为人工智能和机器学习领域的核心组成部分,近年来在诸多领域取得了显著的进展。受生物神经系统的启发,神经网络通过模拟人脑神经元的工作机制,能够从大量数据中学习复杂的模式和关系。其强大的非线性建模能力使其在图像识别、自然语言处理、语音识别和预测…...
AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...
A股level2高频数据分析20250205
A股level2高频数据分析20250205 通过Level2的逐笔成交与委托记录,这种高精度的毫秒级数据能够洞察诸多重要信息,包括庄家目的、误导性行为,使所有交易操作透明化。这对于分析高手的交易策略极为有益,对机器学习的研究也极具价值&…...
【Pytorch实战教程】PyTorch中的Dataset用法详解
PyTorch中的Dataset用法详解 在深度学习中,数据是模型训练的基石。PyTorch作为一个强大的深度学习框架,提供了丰富的工具来处理和加载数据。其中,Dataset类是PyTorch中用于处理数据的重要工具之一。本文将详细介绍Dataset的用法,帮助你更好地理解和使用它。 1. 什么是Dat…...
UIAbility 生命周期方法
生命周期流程图 UIAbility的生命周期官方文档地址https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/uiability-lifecycle-V13 1. onCreate(want: Want, launchParam: LaunchParam) 触发时机:Ability首次创建时 作用:初始化核心资源…...
UML学习
定义:UML是一种用于软件系统分析和设计的标准化建模语言。 作用:用于描述系统的结构、行为、交互等。共定义了10种,并分为4类 ①用例图 user case diagram : 从外部用户的角度描述系统的功能,并指出功能的执行者. 静态图(②类图 class diagram ③,对象…...
DeepSeek-R1 32B Windows+docker本地部署
最近国产大模型DeepSeek兴起,本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件:Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama,它可以在本地运行和管理大模型。 到Ollama官网 https://ol…...
界址点成果表批量生成(新增.docx格式)-附工具下载链接
界址点编号工具20250208更新(成果表新增.docx格式)。 【工具简介】工具可根据面图层,西北角顺时针批量生成界址点,可以设置角度、距离参数,来减少生成界址点的数量(不用全部节点生成界址点)。生…...
计算机组成原理(3)
计算机组成原理(3) 存储器层次结构存储器概述存储器分类存储器性能指标 半导体随机存储SRAM和DRAM 存储器层次结构 主存-辅存:实现了虚拟存储系统,解决了主存容量不足的问题; Cache-主存:解决了主存于CPU速…...
【新书速荐】《Information-Theoretic Radar Signal Processing(信息论雷达信号处理)》
引言 最近,由Yujie Gu 博士和 Yimin D. Zhang 教授主编的新书 Information-Theoretic Radar Signal Processing由 Wiley-IEEE Press 正式出版。 这是信息论雷达信号处理领域的首部专著,全书共分 14 章,汇集了来自学术界、工业界和政府机构的…...
ES冷热数据分离配置
冷热数据是根据索引创建时间来进行迁移的。一旦迁移到冷数据节点,则无法再恢复成热数据,因为热数据节点中该索引已经没有分片存在了。 基于Docker搭建ES集群,并设置冷热数据节点 配置冷热数据迁移策略 PUT https://192.168.x.xx:19200/_ilm/policy/my…...
Docker 构建镜像并搭建私人镜像仓库教程
构建镜像教程 步骤 1:安装 Docker #在安装 Docker 之前,建议先更新系统软件包。 sudo yum update -y # 移除旧的Docker版本和Podman、runc软件包及其相关依赖。 yum remove -y docker docker-client docker-client-latest docker-ce-cli docker-commo…...
蓝牙耳机降噪进化:从物理阻隔到声波抵消的跨越
目录 一、降噪技术的核心分类(一)被动降噪:物理屏障的“静音盾”(二)主动降噪:声波抵消的“黑科技”(三)混合降噪:双重技术的“强强联合” 二、细分技术及应用场景&#…...
23.PPT:校摄影社团-摄影比赛作品【5】
目录 NO12345 NO6 NO7/8/9/10 单元格背景填充表格背景填充文本框背景填充幻灯片背景格式设置添加考生文件夹下的版式 NO12345 插入幻灯片和放入图片☞快速:插入→相册→新建相册→文件→图片版式→相框形状→调整边框宽度左下角背景图片:视图→…...
systemverilog的program和module的区别
1. 设计目的 module 硬件建模:用于描述数字电路的结构和行为(如组合逻辑、时序逻辑、连线等)。 层次化设计:支持模块化设计,可嵌套其他模块或接口(interface)。 仿真周期内持续存在࿱…...
AI大模型零基础学习(2):提示词工程进阶——让AI听懂你的“弦外之音“
从“基础对话”到“精准操控”的思维跃迁 一、为什么你的提问总被AI“误解”? 1.1 大模型的“思维盲区” 知识边界:ChatGPT等模型的训练数据截止于特定时间(如2023年1月),无法主动获取最新资讯 文化差异:…...
如今物联网的快速发展对hmi的更新有哪些积极影响
一、功能更加丰富 物联网的快速发展使得 HMI(人机界面)能够连接更多的设备和系统,从而实现更加丰富的功能。例如,通过与传感器网络的连接,HMI 可以实时显示设备的运行状态、环境参数等信息,为用户提供更加…...
基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv11的阿尔兹海默症严重程度检测系统是一种创新的医疗辅助工具,旨在通过先进的计算机视觉技术提高阿尔兹海默症的早期诊断和病情监测效率。阿尔兹海默症是一种渐进性的神经退行性疾病,通常表现为认知障碍、记忆丧失和语言障碍等症状…...
redis之GEO 模块
文章目录 背景GeoHash 算法redis中的GeoHash 算法基本使用增加距离获取元素位置获取元素的 hash 值附近的元素 注意事项原理 背景 如果我们有需求需要存储地理坐标,为了满足高性能的矩形区域算法,数据表需要在经纬度坐标加上双向复合索引 (x, y)&#x…...
Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用
概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案,包括 DTO语言 更全面更强大的缓存机制,以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力,包括Jimmer独创的远程异常 …...
如何修改DNS解析?
DNS(域名系统)就像互联网的“电话簿”,负责将我们输入的网址转换为计算机能够理解的IP地址。如果DNS解析出现问题,访问网站就会受到影响。那我们该如何修改DNS解析呢?接下来,我们就来介绍一下这个话题。 为什么要修改DNS解析? 使用默认的…...
使用 POI-TL 和 JFreeChart 动态生成 Word 报告
文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中,我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart,实现动态生成 W…...
Python的那些事第十五篇:数据分析中的“三剑客”NumPy、Pandas与Matplotlib
数据分析中的“三剑客”:NumPy、Pandas与Matplotlib 在数据分析的世界里,有三位“大侠”常常携手并肩,共同应对各种复杂的数据挑战。它们就是NumPy、Pandas和Matplotlib。这三位“大侠”各怀绝技,相互配合,让数据分析…...
25/2/7 <机器人基础> 牛顿-欧拉递推公式,开闭环
牛顿-欧拉递推公式是用于计算刚体动力学中,刚体的角速度和角加速度的递推关系。这个公式是牛顿第二定律和欧拉旋转定理的结合,适用于描述刚体在空间中的旋转运动。 对于一个刚体,设其在某时刻的角速度为 ω,角加速度为 α…...
vue3父子组件传值方式
父子组件传值方式 在 Vue 3 中,父子组件之间传值主要有以下几种常见方式,下面将详细介绍并给出演示代码。 1. 父组件向子组件传值:使用 props 原理 props 是 Vue 中用于在父组件向子组件传递数据的机制。父组件通过在子组件标签上绑定属性…...
树和二叉树_6
树和二叉树_6 一、leetcode-105二、题解1.引库2.代码 一、leetcode-105 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节…...
使用wpa_supplicant和wpa_cli 扫描wifi热点及配网
一:简要说明 交叉编译wpa_supplicant工具后会有wpa_supplicant和wpa_cli两个程序生产,如果知道需要连接的wifi热点及密码的话不需要遍历及查询所有wifi热点的名字及信号强度等信息的话,使用wpa_supplicant即可,否则还需要使用wpa_…...
个人职业发展——效率为王:AI赋能前端开发
在竞争激烈的IT行业,个人职业发展至关重要。而提升工作效率,无疑是加速职业发展的关键引擎。对于前端开发者而言,面对日益复杂的项目需求、不断变化的技术栈以及大量重复性的工作,如何提升效率,成为一个亟待解决的难题…...
【Android】Android开发应用如何开启任务栏消息通知
Android开发应用如何开启任务栏消息通知 1. 获取通知权限2.编写通知工具类3. 进行任务栏消息通知 1. 获取通知权限 在 AndroidManifest.xml 里加上权限配置,如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…...
c语言:取绝对值
假设我们有一个 long 类型的变量 l,我们希望恢复其绝对值。以下是两种方法的对比: 方法1:使用条件语句 这个很好理解,负数时取负运算 ,用于数值的符号反转。 long abs_value(long l) {if (l < 0) {return -l;} e…...
HTML应用指南:利用GET请求获取全国盒马门店位置信息
随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应…...
MongoDB 深度教程:当 NoSQL 遇上幽默
MongoDB 深度教程:当 NoSQL 遇上幽默 欢迎来到这个 MongoDB 的奇妙冒险!如果你已经了解了 MongoDB 的基础知识,比如 CRUD 操作、数据库和集合的概念,但总觉得自己只是停留在门口徘徊,那么今天这篇教程就是为你量身定做…...
windows安装linux子系统【ubuntu】操作步骤
1.在windows系统中开启【适用于Linux的Windows子系统】 控制面板—程序—程序和功能—启用或关闭Windows功能—勾选适用于Linux的Windows子系统–确定 2.下载安装Linux Ubuntu 22.04.5 LTS系统 Ununtu下载链接 3.安装完Ununtu系统后更新系统 sudo apt update4.进入/usr/l…...
通过k8s请求selfsubjectrulesreviews查询权限
当前是通过kubelet进行查询 curl --cacert /etc/kubernetes/pki/ca.crt \ --cert /var/lib/kubelet/pki/kubelet-client-current.pem \ --key /var/lib/kubelet/pki/kubelet-client-current.pem \ -d - \ -H "Content-Type: application/json" \ -H Accept: applicat…...
如何参与开源项目
目的 就是说一下如何参与开源的项目,通过参与QXlsx来说明开源项目是如何参与的,其它的github上的开源项目,也是这样的流程。 关于GitHub: GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行…...