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

基于二叉堆实现的 PriorityQueue

基于二叉堆实现的 PriorityQueue 是一种常见的数据结构,广泛用于任务调度、路径搜索、事件模拟等场景。下面我将用 Java 语言实现一个简单的基于最小堆PriorityQueue,即优先级最小的元素先出队。


✅ 实现目标

  • 使用数组实现二叉最小堆(即父节点 ≤ 子节点)
  • 支持以下基本操作:
    • add(E element)
    • peek()
    • poll()
    • size()
    • 自动扩容

🚀 实现代码(Java)

import java.util.Arrays;
import java.util.NoSuchElementException;public class MyPriorityQueue<E extends Comparable<E>> {private static final int DEFAULT_CAPACITY = 16;private Object[] heap;private int size;public MyPriorityQueue() {heap = new Object[DEFAULT_CAPACITY];size = 0;}public void add(E element) {if (element == null) throw new NullPointerException();ensureCapacity();heap[size] = element;siftUp(size);size++;}public E peek() {if (size == 0) throw new NoSuchElementException();return elementAt(0);}public E poll() {if (size == 0) throw new NoSuchElementException();E result = elementAt(0);heap[0] = heap[size - 1];heap[size - 1] = null;size--;siftDown(0);return result;}public int size() {return size;}private void ensureCapacity() {if (size >= heap.length) {heap = Arrays.copyOf(heap, heap.length * 2);}}private void siftUp(int index) {Object temp = heap[index];while (index > 0) {int parent = (index - 1) / 2;if (((E) temp).compareTo(elementAt(parent)) >= 0) break;heap[index] = heap[parent];index = parent;}heap[index] = temp;}private void siftDown(int index) {Object temp = heap[index];int half = size / 2;while (index < half) {int left = 2 * index + 1;int right = left + 1;int smallest = left;if (right < size && elementAt(right).compareTo(elementAt(left)) < 0) {smallest = right;}if (((E) temp).compareTo(elementAt(smallest)) <= 0) break;heap[index] = heap[smallest];index = smallest;}heap[index] = temp;}@SuppressWarnings("unchecked")private E elementAt(int index) {return (E) heap[index];}
}

📦 示例用法

public class Main {public static void main(String[] args) {MyPriorityQueue<Integer> pq = new MyPriorityQueue<>();pq.add(5);pq.add(2);pq.add(9);pq.add(1);while (pq.size() > 0) {System.out.println(pq.poll());}}
}

输出:

1
2
5
9

如果你需要最大堆版本,只需把比较逻辑反过来即可。

下面是对上面代码的扩展版本,支持传入自定义的 Comparator,从而实现更灵活的排序逻辑,比如最大堆、自定义字段排序等。


✅ 改造目标

  • 支持传入 Comparator<E>,代替 Comparable<E> 进行元素比较。
  • 如果未传入 Comparator,则默认使用元素的自然顺序(即要求 E implements Comparable<E>)。

🚀 改造后的 Java 实现:支持 Comparator 的 PriorityQueue

import java.util.Arrays;
import java.util.Comparator;
import java.util.NoSuchElementException;public class MyPriorityQueue<E> {private static final int DEFAULT_CAPACITY = 16;private Object[] heap;private int size;private final Comparator<? super E> comparator;public MyPriorityQueue() {this(null);}public MyPriorityQueue(Comparator<? super E> comparator) {this.comparator = comparator;this.heap = new Object[DEFAULT_CAPACITY];this.size = 0;}public void add(E element) {if (element == null) throw new NullPointerException();ensureCapacity();heap[size] = element;siftUp(size);size++;}public E peek() {if (size == 0) throw new NoSuchElementException();return elementAt(0);}public E poll() {if (size == 0) throw new NoSuchElementException();E result = elementAt(0);heap[0] = heap[size - 1];heap[size - 1] = null;size--;siftDown(0);return result;}public int size() {return size;}private void ensureCapacity() {if (size >= heap.length) {heap = Arrays.copyOf(heap, heap.length * 2);}}private void siftUp(int index) {Object temp = heap[index];while (index > 0) {int parent = (index - 1) / 2;if (compare((E) temp, elementAt(parent)) >= 0) break;heap[index] = heap[parent];index = parent;}heap[index] = temp;}private void siftDown(int index) {Object temp = heap[index];int half = size / 2;while (index < half) {int left = 2 * index + 1;int right = left + 1;int smallest = left;if (right < size && compare(elementAt(right), elementAt(left)) < 0) {smallest = right;}if (compare((E) temp, elementAt(smallest)) <= 0) break;heap[index] = heap[smallest];index = smallest;}heap[index] = temp;}@SuppressWarnings("unchecked")private E elementAt(int index) {return (E) heap[index];}private int compare(E a, E b) {if (comparator != null) {return comparator.compare(a, b);}return ((Comparable<? super E>) a).compareTo(b);}
}

📦 示例用法

✅ 默认最小堆

MyPriorityQueue<Integer> pq = new MyPriorityQueue<>();
pq.add(4);
pq.add(1);
pq.add(7);
System.out.println(pq.poll()); // 输出 1

✅ 最大堆(传入自定义 Comparator)

MyPriorityQueue<Integer> maxHeap = new MyPriorityQueue<>((a, b) -> b - a);
maxHeap.add(4);
maxHeap.add(1);
maxHeap.add(7);
System.out.println(maxHeap.poll()); // 输出 7

✅ 自定义对象排序(按年龄升序)

class Person {String name;int age;Person(String name, int age) { this.name = name; this.age = age; }public String toString() {return name + "(" + age + ")";}
}MyPriorityQueue<Person> peopleQueue = new MyPriorityQueue<>(Comparator.comparingInt(p -> p.age)
);peopleQueue.add(new Person("Alice", 30));
peopleQueue.add(new Person("Bob", 25));
peopleQueue.add(new Person("Carol", 35));System.out.println(peopleQueue.poll()); // 输出 Bob(25)

如果你还有其他定制需求,比如:

  • 支持删除任意元素
  • 支持更新某个元素的优先级
  • 支持构造函数初始化时传入一个集合

基于二叉堆实现的 PriorityQueue 因其高效的插入和删除最小(或最大)元素操作,在很多应用场景中都有着广泛的运用。下面我详细介绍几个常见的应用场景:


1. 图算法:路径搜索与最短路径

Dijkstra 算法

在 Dijkstra 算法中,优先队列用来维护从起点到各个节点的当前最短路径距离。每次从优先队列中选出距离最小的节点,然后根据这个节点更新其邻接点的距离。借助基于二叉堆的 PriorityQueue,其对插入和删除操作的平均时间复杂度为 O(log n),使得算法在稀疏图中的效率大为提升。

A* 搜索算法

类似于 Dijkstra 算法,A* 算法也需要一个优先队列来维护待搜索节点,并根据预估函数 f(n)=g(n)+h(n) 的值来排列节点的优先级。使用二叉堆实现的 PriorityQueue 能够快速选取当前估值最低的节点,从而提高搜索效率。


2. 事件调度和仿真系统

离散事件模拟

在离散事件仿真系统中,每个事件都有一个触发时间,需要按照时间顺序执行。使用二叉堆实现的 PriorityQueue,可以将所有待执行事件按照时间顺序排列,每次只取最早触发的事件进行处理。这样的调度机制保证了事件的正确时序,适用于物流调度、网络仿真、制造系统仿真等场景。

操作系统任务调度

操作系统调度程序中也经常用到优先队列。比如在多任务系统中,任务可能具有不同的优先级或者截止时间。基于二叉堆的 PriorityQueue 可以迅速确定下一个需要处理的任务,有助于实现实时性要求较高的调度算法。


3. 排序和 Top-K 问题

堆排序

堆排序算法就是利用堆这种数据结构实现的排序算法。首先将数据构成一个堆,然后不断取出堆顶元素(最小/最大),并将剩余元素重新调整成堆结构。堆排序的时间复杂度为 O(n log n),适合在部分特殊场景下使用。

查找 Top-K 元素

在海量数据中查找前 K 个最小或最大的元素,可以利用一个固定大小的 PriorityQueue。对每个新数据,和队列中的最值进行比较,若满足条件就进行替换操作,这样能够在 O(n log k) 的时间内找出前 K 个元素,非常适合实时数据处理与流式计算。


4. 网络和流量管理

网络路由与转发

在网络数据包调度和路由选择中,优先队列可以根据数据包的紧急程度、传输延迟等属性来决定数据包的传输顺序。使用基于二叉堆的实现,能够有效管理大量数据包,保证网络传输的高效和公平性。

服务质量(QoS)调控

在一些需要区分服务等级的场景(例如 VOIP、视频流处理等),采用 PriorityQueue 可以确保高优先级数据(如实时音视频数据)优先传输,从而改善用户体验。


5. 金融和交易系统

高频交易系统

金融领域中的高频交易系统通常需要实时处理大量订单,并保证订单按照某种优先级(如价格、时间等)进行匹配。PriorityQueue 能够高效维护待处理的订单列表,使得交易处理的响应时间尽可能低。

风险管理

在风险评估和管理场景中,不同投资组合或交易策略可能具有不同的风险度量值。利用 PriorityQueue,可以快速锁定风险较高的部分并及时采取措施,实现高效监控和决策。


总结

基于二叉堆实现的 PriorityQueue 以其简单、高效的特性,在图算法、事件调度、任务调度、排序以及网络、金融等众多领域都有重要应用。其对插入、删除操作时间复杂度为 O(log n) 的优势,使得在数据量较大、实时性要求较高的场景中表现优异。通过支持自定义比较器,PriorityQueue 更加灵活,可以方便地应用在各种复杂的业务场景中。

相关文章:

基于二叉堆实现的 PriorityQueue

基于二叉堆实现的 PriorityQueue 是一种常见的数据结构&#xff0c;广泛用于任务调度、路径搜索、事件模拟等场景。下面我将用 Java 语言实现一个简单的基于最小堆的 PriorityQueue&#xff0c;即优先级最小的元素先出队。 ✅ 实现目标 使用数组实现二叉最小堆&#xff08;即父…...

大模型分布式推理和量化部署

一、小常识 1、计算大模型占用多少显存 对于一个7B&#xff08;70亿&#xff09;参数的模型&#xff0c;每个参数使用16位浮点数&#xff08;等于 2个 Byte&#xff09;表示&#xff0c;则模型的权重大小约为&#xff1a; 7010^9 parameters2 Bytes/parameter14GB 70亿个参数…...

循环神经网络 - 长程依赖问题及改进方案

循环神经网络在学习过程中的主要问题是由于梯度消失或爆炸问题&#xff0c;很难建模长时间间隔(Long Range)的状态之间的依赖关系。 本文我们来学习长程依赖问题及其对应的改进方案&#xff0c;在这部分知识的学习过程中&#xff0c;我建议大家着重理解&#xff0c;对于数学公…...

点击抽奖功能总结

首先用户打开网页&#xff0c;映入眼帘的是一个输入框和一个提交按钮。当用户在输入框中输入自己的年龄并点击提交后&#xff0c;系统会根据输入的年龄给出相应提示。若年龄达到 60 岁&#xff0c;页面将显示一个新的抽奖区域&#xff0c;用户可以点击 “抽奖” 按钮开始抽奖。…...

AWS Bedrock生成视频详解:AI视频创作新时代已来临

💡 TL;DR: AWS Bedrock现已支持AI视频生成功能,让企业无需深厚AI专业知识即可创建高质量视频内容。本文详解Bedrock视频生成能力的工作原理、应用场景和实操指南,助你快速掌握这一革命性技术。 🎬 AWS Bedrock视频生成:改变内容创作的游戏规则 还记得几年前,制作一个专…...

理解 TOGAF®标准中的架构原则

原则是帮助组织实现其使命的基本规则和指南。它们旨在长期稳定且很少修改&#xff0c;在各个领域中充当决策和行动的指南针。在企业架构&#xff08;EA&#xff09;的背景下&#xff0c;原则在指导架构框架的开发和应用方面发挥着至关重要的作用。本文将探讨企业原则和架构原则…...

基于视觉密码的加密二值图像可逆数据隐藏

接下来&#xff0c;分享一篇论文&#xff0c;标题为《Multi-Party Reversible Data Hiding in Ciphertext Binary Images Based on Visual Cryptography》&#xff0c;由Bing Chen等人发表在《IEEE Signal Processing Letters》上。该论文提出了一种基于视觉密码学的多方可逆数…...

ubuntu22.04 中 No module named ‘_bz2‘问题解决方案

前言 本篇是介绍ubuntu22.04中 No module named ‘_bz2‘问题解决方案 网上版本很多&#xff0c;比如安装libbz库什么的&#xff0c;可能别人有用&#xff0c;但是我自己这边出了一堆问题 一、流程 1.1 查看bz2.xx.so文件 看自己的python版本&#xff0c;我新安装了个pyth…...

什么是声波,声波的传播距离受哪些因素影响?

一、声波的定义&#xff1a; 声波是一种机械波&#xff0c;它是通过介质&#xff08;如空气、水、固体等&#xff09;传播的振动。以下是关于声波的详细介绍&#xff1a; 1、声波的产生 声波是由物体的振动产生的。例如&#xff0c;人说话时&#xff0c;声带振动产生声波&…...

用PHPExcel 封装的导出方法,支持导出无限列

用PHPExcel 封装的导出方法&#xff0c;支持导出无限列 避免PHPExcel_Exception Invalid cell coordinate [1 异常错误 /*** EXCEL导出* param [string] $file_name 保存的文件名及表格工作区名&#xff0c;不加excel后缀名* param [array] $fields 二维数组* param [array] $…...

STL-stack栈和queue队列

stack栈和queue队列 在STL中 stack 和 queue 设计为容器适配器,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一组特定的成员函数来访问其元素。 在我的STL系列中之前的容器 vector、list、deque 都是从底层类型一步步封装而来的,但是 stack 和 queue 没有…...

AI 提示词不会写?试试 PromptIDE

这段时间&#xff0c;AI 技术大爆炸 已经改变了我们的工作方式&#xff0c;而 会不会用 AI&#xff0c;已经成为区分工作能力的关键&#xff01; &#x1f4a1; 在这个AI重构工作方式的时代&#xff0c;会用和不会用AI的人正在拉开巨大差距&#xff1a; √ 高手用AI——效率飙…...

【python读取并显示遥感影像】

在Python中读取并显示遥感影像&#xff0c;可以使用rasterio库读取影像数据&#xff0c;并结合matplotlib进行可视化。以下是一个完整的示例代码&#xff1a; import rasterio import matplotlib.pyplot as plt import numpy as np# 打开遥感影像文件 with rasterio.open(path…...

代码随想录算法训练营第十三天

LeetCode题目: 110. 平衡二叉树257. 二叉树的所有路径404. 左叶子之和222. 完全二叉树的节点个数3375. 使数组的值全部为 K 的最少操作次数(每日一题) 其他: 今日总结 往期打卡 110. 平衡二叉树 跳转: 110. 平衡二叉树 学习: 代码随想录公开讲解 问题: 给定一个二叉树&#…...

TQTT_KU5P开发板教程---高速收发器之XDMA实现PCIE

文档功能介绍 本文档主要实现了通过一个叫做XDMA的IP&#xff0c;实现PCIE的测试例子。工程新建方法请参考文档《流水灯》。 Vivado创建项目 起始页&#xff08;或 file-->Project-->New 创建新工程(Create New Project) 向导起始页面 点击 Next--> Project Name(…...

蓝桥杯速成刷题清单(上)

一、1.排序 - 蓝桥云课 &#xff08;快速排序&#xff09;算法代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 5e5 10; int a[N];int main() {int n;cin >> n;for (int i 0; i < n; i) {cin >> a[i];}sort(a, a n);for …...

【FreeRTOS】二值信号量 是 消息队列 吗

在读FreeRTOS内核实现与应用开发实战指南的时候&#xff0c;书中第16章有这么一句话&#xff1a;可以将二值信号量看作只有一个消息的队列&#xff0c;incident这个队列只能为空或满&#xff08;因此称为二值&#xff09;&#xff0c;在运用时只需要之傲队列中是否由消息即可&a…...

BOTA六维力矩传感器在三层AI架构中的集成实践:从数据采集到力控闭环

随着机器人技术的迅猛发展&#xff0c;Bota六维力矩传感器成为三层AI架构中的核心组件。它通过高精度的力与力矩感知能力&#xff0c;为感知层提供实时数据支持&#xff0c;优化了决策层的判断效率&#xff0c;并确保执行层操作的精确性和安全性。 Bota贯通式力矩传感器PixOne&…...

UE5 matcap学习笔记

没难度节点&#xff0c;但是要记住这种思维&#xff0c;移动端常用&#xff1a; 原视频&#xff1a;(美学阿姨)MatCap材质原理讲解与UE5中的实现方法_哔哩哔哩_bilibili...

神经网络 - 关于简单的激活函数的思考总结

最近一直在学习神经网络&#xff0c;有一些收获&#xff0c;也有一些迷惑&#xff0c;所以驻足思考&#xff1a;为什么简单的激活函数如sigmoid函数、ReLU函数&#xff0c;当应用在神经网络的模型中&#xff0c;却可以实现对现实世界复杂的非线性关系的模拟呢&#xff1f;本文我…...

pig 权限管理开源项目学习

pig 源码 https://github.com/pig-mesh/pig 文档在其中&#xff0c;前端在文档中&#xff0c;官方视频教学也在文档中有。 第一次搭建&#xff0c;建议直接去看单体视频&#xff0c;照着做即可。 文章目录 项目结构Maven 多模块项目pig-boot 启动核心模块pig-auth 实现认证和…...

excel中的VBA指令示例(二)

。。。接上篇。 Range("D1").Select ’选择D1单元格 ActiveCell.FormulaR1C1 "装配数量" ‘单元格内容为装配数量 Range("D1").Select Selection.AutoFilter …...

基于vue3与supabase系统认证机制

1. 认证框架概述 系统采用 Supabase 作为认证和数据服务提供商&#xff0c;实现了完整的用户身份验证流程。系统使用基于 JWT (JSON Web Token) 的认证方式&#xff0c;提供了安全可靠的用户身份管理机制。 1.1 技术栈 前端: Vue 3 TypeScript状态管理: Pinia认证服务: Sup…...

【算法笔记】并查集详解

&#x1f680; 并查集&#xff08;Union-Find&#xff09;详解&#xff1a;原理、实现与优化 并查集&#xff08;Union-Find&#xff09;是一种非常高效的数据结构&#xff0c;用于处理动态连通性问题&#xff0c;即判断若干个元素是否属于同一个集合&#xff0c;并支持集合合…...

基于Redis实现短信防轰炸的Java解决方案

基于Redis实现短信防轰炸的Java解决方案 前言 在当今互联网应用中&#xff0c;短信验证码已成为身份验证的重要手段。然而&#xff0c;这也带来了"短信轰炸"的安全风险 - 恶意用户利用程序自动化发送大量短信请求&#xff0c;导致用户被骚扰和企业短信成本激增。本…...

编程中,!! 双感叹号的理解

在编程中&#xff0c;!! 双感叹号的含义取决于上下文。通常情况下&#xff0c;!! 是逻辑非操作符的双重使用&#xff0c;用来将一个值强制转换为布尔类型。 1. 逻辑非操作符 在 JavaScript 中&#xff0c;! 是逻辑非操作符&#xff0c;它会将一个值转换为布尔类型&#xff1a…...

ARM内核与寄存器

ARM内核与寄存器详解 目录 ARM架构概述ARM处理器模式 Cortex-M3内核的处理器模式Cortex-A系列处理器模式 ARM寄存器集 通用寄存器程序计数器(PC)链接寄存器(LR)堆栈指针(SP)状态寄存器(CPSR/SPSR) 协处理器寄存器NEON和VFP寄存器寄存器使用规范常见ARM指令与寄存器操作 ARM架…...

【C++进阶】关联容器:set类型

目录 一、set 基本概念 1.1 定义与特点 1.2 头文件与声明 1.3 核心特性解析 二、set 底层实现 2.1 红黑树简介 2.2 红黑树在 set 中的应用 三、set 常用操作 3.1 插入元素 3.2 删除元素 3.3 查找元素 3.4 遍历元素 3.5 性能特征 四、set 高级应用 4.1 自定义比较…...

Linux内核——X86分页机制

X86分页机制 x86的分页单元支持两种分页模式&#xff1a;常规分页与扩展分页。 常规分页采用两级结构&#xff0c;固定页大小为4KB。线性地址被划分为三个字段&#xff1a; 页目录索引&#xff08;最高10位&#xff09;页表索引&#xff08;中间10位&#xff09;页内偏移&am…...

重温Java - Java基础二

工作中常见的6中OOM 问题 堆内存OOM 堆内存OOM 是最常见的OOM了。出现堆内存OOM 问题的异常信息如下 java.lang.OutOfMemoryError: Java heap space此OOM是由于Java中的heap的最大值&#xff0c;已经不能满足需求了。 举个例子 Test public void test01(){List<OOMTest…...

回溯算法+对称剪枝——从八皇后问题到数独问题(二)

引入&#xff1a; 本节我们进一步完善八皇后问题&#xff0c;学习剪枝、八皇后残局问题 进一步领会逻辑编程的概念&#xff0c;深入体会回溯算法&#xff0c;回顾上一节提到的启发搜索策略。 回顾&#xff1a; 八皇后问题&#xff1a;我们需要在一个空棋盘上放置 n 个皇后&a…...

基于 Spring Boot 瑞吉外卖系统开发(三)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;三&#xff09; 分类列表 静态页面 实现功能所需要的接口 定义Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定义Service接口 public interface CategoryService extends ISe…...

Pascal VOC 2012 数据集格式与文件结构

Pascal VOC 2012 1 Pascal VOC 2012 数据集1.1 数据集概述1.2 文件结构1.3 关键文件和内容格式(1) Annotations/ 目录(2) ImageSets/ 目录(3) JPEGImages/ 目录(4) SegmentationClass/ 和 SegmentationObject/ 目录 1.4 标注格式说明(1) 目标检测标注(2) 语义分割标注(3)实例分…...

11:00开始面试,11:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

MySQL与Oracle字段类型对比及迁移指南

文章目录 MySQL与Oracle字段类型对比及迁移指南1. 核心字段类型对照表2. 常见函数对照表2.1 字符串函数2.2 日期函数2.3 数值函数2.4 类型转换函数2.5 空值处理函数2.6 其他常用函数3. 迁移配置细则4. 迁移工具推荐5. 常见问题解决方案6. 性能优化建议MySQL与Oracle字段类型对比…...

Spring MVC 处理 HTTP 状态码、响应头和异常的完整示例

Spring MVC 处理 HTTP 状态码、响应头和异常的完整示例 1. 正常响应处理 通过 ResponseEntity 可以灵活控制 HTTP 状态码、响应头和响应体。 代码示例&#xff1a;创建资源返回 201 并设置 Location 头 import org.springframework.http.HttpHeaders; import org.springfram…...

http页面的加载过程

HTTP/2 核心概念 1.1 流&#xff08;Stream&#xff09; • 定义&#xff1a;HTTP/2 连接中的逻辑通道&#xff0c;用于传输数据&#xff0c;每个流有唯一标识符&#xff08;Stream ID&#xff09;。 • 特点&#xff1a; ◦ 支持多路复用&#xff08;多个流并行传输&#…...

动手人形机器人(RL)

1 PPO的讲解 核心步骤&#xff0c;如策略网络和价值网络的定义、优势估计、策略更新、价值更新等基础功能的实现 2 代码构成 可能涉及 初始化&#xff0c;Behavior Clone 3 动手强化学习 import pytorch as torch class actorcritic ##等待补充 4 PD Gains 在机器人学中&…...

使用RabbitMQ实现异步秒杀

搭建RabbitMQ 在虚拟机上用docker搭建RabbitMQ&#xff0c;首先拉取镜像 docker run --privilegedtrue -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management mkdir -p /usr/local/docker/rabbitmq再创建rabbitmq容器&#xff0c;下面的命令已经能够创建之后…...

基于PyQt5的企业级生日提醒系统设计与实现

在企业人力资源管理场景中,员工生日提醒是一项重要的关怀功能。本文将以一个基于PyQt5开发的生日提醒系统为例,深入解析桌面应用程序开发中的关键技术实现,涵盖GUI设计、数据持久化、系统集成、动画效果等核心模块。 一、技术选型分析 1.1 PyQt5框架优势 跨平台特性:支持W…...

蓝桥杯嵌入式第16届——ADC模数转化部分

将外部的模拟信号转换为数字信号 &#xff08; ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 &#xff09; STM32 - ADC 笔记_stm32 adc电容-CSDN博客 引脚状况 STM32cubemx配置 ADC1配置 ADC2配置 代码部分 …...

拜特科技签约天津城投集团,携手共建司库管理系统

近日&#xff0c;拜特科技成功签约天津城市基础设施建设投资集团有限公司&#xff08;以下简称“天津城投集团”&#xff09;&#xff0c;携手共建司库管理系统。 自2015年结缘以来&#xff0c;拜特科技与天津城投集团已携手并进十年&#xff0c;构建了稳固且高效的合作桥梁。…...

Spring Boot 中集成 Knife4j:解决文件上传不显示文件域的问题

Spring Boot 中集成 Knife4j&#xff1a;解决文件上传不显示文件域的问题 在使用 Knife4j 为 Spring Boot 项目生成 API 文档时&#xff0c;开发者可能会遇到文件上传功能不显示文件域的问题。本文将详细介绍如何解决这一问题&#xff0c;并提供完整的解决方案。 Knife4j官网…...

Nuxt.js的useHead有哪些对象

在Nuxt.js框架中&#xff0c;useHead是一个用于操作页面<head>部分的辅助函数。它返回一个包含多个对象的集合&#xff0c;允许你轻松地在组件中修改或添加 HTML 的<head>内容。 具体来说&#xff0c;useHead 返回的对象集合包括&#xff1a; title: 用于设置页面…...

JavaScript的可选链操作符 ?.

JavaScript的可选链操作符&#xff08;Optional Chaining Operator&#xff09;是 ES2020&#xff08;ES11&#xff09; 引入的新特性&#xff0c;通过语法 ?. 简化对深层嵌套对象属性、方法或数组元素的访问&#xff0c;避免因中间值为 null 或 undefined 而引发的错误。 核…...

增长黑客:激活实验助力增长

激活实验是推动用户增长的重要手段。下面为大家详细介绍激活实验的关键步骤与重点解决问题 激活实验的三个关键步骤 1. 明晰 “啊哈时刻” 路径 “啊哈时刻” 指用户瞬间领悟产品价值的瞬间。要达成这一点&#xff0c;需明确用户体验到 “啊哈时刻” 的所有路径。以在线绘图工具…...

STM32低功耗

设置不同位来配置是哪种低功耗模式 WAKEUP引脚可以唤醒任何睡眠状态,但是只有待机模式是属于WAKEUP唤醒&#xff0c;其他模式都是属于中断唤醒&#xff0c;所以待机模式要使能EWUP引脚&#xff0c;还要手动清除唤醒标志位&#xff08;在进入待机模式前就要清除标志位&#xff…...

【精品PPT】2025固态电池知识体系及最佳实践PPT合集(36份).zip

精品推荐&#xff0c;2025固态电池知识体系及最佳实践PPT合集&#xff0c;共36份。供大家学习参考。 1、中科院化学所郭玉国研究员&#xff1a;固态金属锂电池及其关键材料.pdf 2、中科院物理所-李泓固态电池.pdf 3、全固态电池技术研究进展.pdf 4、全固态电池生产工艺.pdf 5、…...

头歌数据库【数据库概论】第10-11章 故障恢复与并发控制

第1关&#xff1a;数据库恢复技术 1、事务的&#xff08; A&#xff09;特性要求事务必须被视为一个不可分割的最小工作单元 A、原子性 B、一致性 C、隔离性 D、持久性 2、事务的&#xff08;C &#xff09;特性要求一个事务在执行时&#xff0c;不会受到其他事务的影响。 A、原…...

qt之opengl使用

使用qt中的openglWidget绘制一个三角形。自定义的类继承关系sunOpengl : public QOpenGLWidget,QOpenGLFunctions_3_3_Core 代码如下 /*----MainWindow.cpp----------------------------------------------*/ #include "mainwindow.h" #include "./ui_mainwin…...