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

【数据结构 -- AVL树】用golang实现AVL树

目录

  • 引言
  • 定义
  • 旋转方式
    • LL型
    • RR型
    • LR型
    • RL型
  • 实现
    • 结构
    • 获取结点高度
    • 平衡因子
    • 更新高度
    • 左旋
    • 右旋
    • 插入结点
    • 中序遍历

引言

AVL树,基于二叉搜索树通过平衡得到

前面我们知道,通过🔗二叉搜索树可以便捷快速地查找到数据,但是当序列有序时,就会退化成如下图所示的单链表,搜索效率降低为O(N),为了解决这个问题,引出了平衡二叉树(AVL树)

在这里插入图片描述

定义

平衡二叉树,简称AVL树,它可以是一颗空树
如果不是空树,则需要满足 任何一个结点的左子树与右子树高度之差的绝对值不超过1

在这里插入图片描述

图一是AVL树
图二不是AVL树,因为虚线内部分高度差大于1

如何让二叉树变成AVL树呢
答案是通过旋转(左旋、右旋)操作,在说左旋和右旋操作之前,了解一个概念——平衡因子

是否为AVL树需要根据结点的左右子树高度差来判断,所以引出平衡因子的概念
平衡因子:结点左子树高度减去右子树高度
之后我们还可以通过平衡因子来判断需要哪种旋转方式(左旋、右旋)

将二叉树分为四种类型,分别是LL(left)型、RR(right)型、
LR型、RL型
这几种类型是根据引起不平衡的结点的位置来分的,下面将引起不平衡的这个结点叫做unbalanceNode

旋转方式

判断右旋还是左旋,可以这样理解
向哪个方向旋转就是让哪边树更高。比如左旋,就是右子树高于左子树,要想平衡就要让左子树更高一点

LL型

unbalanceNode在根结点左孩子的左子树 – 根结点右旋

如图,插入结点5后导致二叉树失衡,插入的结点5在根结点左孩子14的左子树上,所以就是 LL 型

在这里插入图片描述

LL型二叉树的平衡因子满足:
根结点:2
根结点的左孩子:1(左孩子的左子树高度>右子树)

方法就是将根结点右旋,意思就是将根结点向右旋转到其左孩子的右孩子的位置

在这里插入图片描述

在根结点向右旋转的过程中,因为根结点的左孩子14原本有右孩子20,所以根结点就会和20发生冲突,这时需要将14的右孩子20变成根结点的左孩子

根结点25旋转完成后就是

在这里插入图片描述

再和14相连,最终结果:

在这里插入图片描述


如果出现了多个结点都失衡的情况,如下图
在这里插入图片描述

46、35、24都失衡了,那这时候就不是将根结点右旋了,而是将 与导致失衡的结点(15)最近的失衡结点右旋,在这个例子中也就是将24右旋
在这里插入图片描述

再与35相连,最终结果:
在这里插入图片描述


RR型

unbalanceNode在根结点右孩子的右子树 – 根结点左旋

RR 型与 LL 型方法一致,只是换汤不换药

如图,插入结点67后导致二叉树失衡,插入的结点67在根结点右孩子45的右子树上,所以就是 RR 型

在这里插入图片描述

RR型二叉树的平衡因子满足:
根结点:-2
根结点的左孩子:-1(左孩子的右子树高度>左子树)

方法就是将根结点左旋,意思就是将根结点向左旋转到其右孩子的左孩子的位置
在这里插入图片描述

在根结点向左旋转的过程中,因为根结点的右孩子45原本有左孩子34,所以根结点就会和34发生冲突,这时需要将45的左孩子34变成根结点的右孩子

根结点26旋转完成后就是
在这里插入图片描述

再和45相连,最终结果:
在这里插入图片描述


如果同时出现了多个失衡结点,和 LL 型一样,也是找到与导致失衡结点距离最近的失衡的结点,对该结点进行左旋操作


LR型

unbalanceNode在根结点左孩子的右子树 – 先左旋再右旋(根结点的左孩子左旋,根结点右旋)

如图,插入结点40后导致二叉树失衡,插入的结点40在根结点左孩子25的右子树上,所以就是 LR 型
在这里插入图片描述

LR型的平衡因子满足:
根结点:2
根结点的左孩子:-1(左孩子的右子树高度>左子树)

方法就是

  1. 先将根结点的左孩子左旋
  2. 再将根结点右旋

对于这个二叉树,调整过程:

  1. 将根结点的左孩子左旋
    在这里插入图片描述
  2. 将根结点右旋后
    在这里插入图片描述

RL型

unbalanceNode在根结点右孩子的左子树 – 先右旋再左旋(根结点的右孩子右旋,根结点左旋)

如图,插入结点29后导致二叉树失衡,插入的结点29在根结点右孩子48的左子树上,所以就是 RL 型
在这里插入图片描述

LR型的平衡因子满足:
根结点:-2
根结点的右孩子:1(右孩子的左子树高度>右子树)

方法就是

  1. 先将根结点的右孩子右旋
  2. 再将根结点左旋

对于这个二叉树,调整过程:

  1. 将根结点的右孩子右旋
    在这里插入图片描述

  2. 将根结点左旋
    在这里插入图片描述

实现

结构

结构体中一定包含的是数据data 和左右孩子指针
又因为需要计算平衡因子,所以需要知道左右子树的高度,直接将高度height 包含在结构体中

// 定义树结构
type BTNode struct {data   int //数据left   *BTNoderight  *BTNodeheight int //树的高度
}

获取结点高度

首先判断结点 t 为不为 nil, 为 nil 直接返回0

// 获取结点高度
func (t *BTNode) GetHeight() int {if t == nil {return 0}return t.height
}

平衡因子

平衡因子 = 左子树高度 - 右子树高度
若结点 t 为 nil ,直接返回0

// 计算结点的平衡因子 -- 左子树高度-右子树高度
func (t *BTNode) GetBalanceFactor() int {if t == nil {return 0}return t.left.GetHeight() - t.right.GetHeight()
}

更新高度

在插入或删除数据后,根结点和其他结点的高度都有可能发生变化,所以在插入或删除结点后,需要更新节点的高度,否则在计算平衡因子会出错

// 更新高度
func (t *BTNode) UpdateHeight() {leftHeight := t.left.GetHeight()rightHeight := t.right.GetHeight()if leftHeight > rightHeight {t.height = leftHeight + 1} else {t.height = rightHeight + 1}
}

左旋

对 node 进行左旋 --> node连接在node.right 的左孩子,如果node.right 原本有左孩子leftChild,那让leftChild 连接到node 的右孩子

// 左旋
func (t *BTNode) LeftRotate() *BTNode {//新的根结点变为t的右孩子newT := t.right//判断newT有没有左孩子if newT.left == nil{  //newT原本没有左孩子,t为newt.T左孩子newT.left = t}else { //newT原本有左孩子,原本的左孩子变为t的右孩子,t为newT左孩子t.right = newT.leftnewT.left = t}//更新高度t.UpdateHeight()newT.UpdateHeight()return newT
}

对上面的代码,还可以再简化
如果newT没有左孩子,即为nil,也可以直接赋值给t.right

// 左旋
func (t *BTNode) LeftRotate() *BTNode {//新的根结点变为t的右孩子newT := t.rightt.right = newT.leftnewT.left = t//更新高度t.UpdateHeight()newT.UpdateHeight()return newT
}

右旋

对 node 进行右旋 --> node连接在node.left 的右孩子,如果node.left 原本有右孩子rightChild,那让rightChild 连接到node 的左孩子

// 右旋
func (t *BTNode) RightRotate() *BTNode {newT := t.leftt.left = newT.rightnewT.right = tt.UpdateHeight()newT.UpdateHeight()return newT
}

插入结点

按照二叉搜索树插入数据的方式插入,再根据平衡因子判断是否需要调整和调整的方式

// 插入结点
func (t *BTNode) Insert(data int) *BTNode {if t == nil {return &BTNode{data,nil,nil,1,}}//递归查找插入位置if data < t.data {t.left = t.left.Insert(data)} else if data > t.data {t.right = t.right.Insert(data)} else {return t //不支持重复数据}//更新当前结点的高度t.UpdateHeight()//检查是否需要旋转balance := t.GetBalanceFactor()//左子树高if balance > 1 {if t.left.GetHeight() == 1 { //左孩子的左子树高 -- ll型//右旋return t.RightRotate()}if t.left.GetHeight() == -1 { //左孩子的右子树高 -- lr型//先对左孩子左旋,再对结点右旋t.left.LeftRotate()return t.RightRotate()}}//右子树高if balance < -1 {if t.right.GetHeight() == 1 { //右孩子的右子树高 -- rr型return t.LeftRotate()}if t.right.GetHeight() == -1 { //右孩子的左子树高 -- rl型先对右孩子右旋,再对结点左旋t.right.RightRotate()return t.LeftRotate()}}return t
}

中序遍历

// 中序遍历
func (t *BTNode) InOrder() {if t == nil {return}t.left.InOrder()fmt.Printf("%d ", t.data)t.right.InOrder()
}

相关文章:

【数据结构 -- AVL树】用golang实现AVL树

目录 引言定义旋转方式LL型RR型LR型RL型 实现结构获取结点高度平衡因子更新高度左旋右旋插入结点中序遍历 引言 AVL树&#xff0c;基于二叉搜索树通过平衡得到 前面我们知道&#xff0c;通过&#x1f517;二叉搜索树可以便捷快速地查找到数据&#xff0c;但是当序列有序时&am…...

matlab慕课学习3.5

于20250520 3.5 用while 语句实现循环结构 3.5.1while语句 多用于循环次数不确定的情况&#xff0c;循环次数确定的时候用for更为方便。 3.5.2break语句和continue语句 break用来跳出循环体&#xff0c;结束整个循环。 continue用来结束本次循环&#xff0c;接着执行下一次…...

【jmeter】base64加密

base64加密 执行的脚本&#xff1a; import java.io.*; import sun.misc.BASE64Encoder; String strvars.get("param") #设置了一个user paramBASE64Encoder encodernew BASE64Encoder() log.info("--------start----------") String resultencoder.encod…...

优化Hadoop性能:如何修改Block块大小

在处理大数据时&#xff0c;Hadoop的性能和资源管理是至关重要的。Hadoop的分布式文件系统&#xff08;HDFS&#xff09;将数据切割成多个块&#xff08;Block&#xff09;&#xff0c;并将这些块分布在集群中的不同节点上。在默认情况下&#xff0c;HDFS的块大小可能并不适合所…...

jmeter转义unicode变成中文

打开jmeter&#xff0c;添加后置处理器到接口请求后&#xff0c;在添加完成后将代码复制进入 &#xff08;注意&#xff1a;最后执行后需要到“察看结果树”里看&#xff0c;需要自行添加对应的监听器&#xff09; 按如下添加代码进入上图位置&#xff1a; //如下复制于链接&…...

ALSA 插件是什么? PortAudio 断言失败是什么意思?

下面用更简单的语言和图文形式帮你理解&#xff1a; 1. ALSA 插件是什么&#xff1f;为什么重要&#xff1f; 想象你电脑里的音频系统就像一个厨房&#xff0c;ALSA 是厨房里的厨师&#xff0c;负责做出声音&#xff08;做菜&#xff09;和收集声音&#xff08;收菜&#xff0…...

计算机科技笔记: 容错计算机设计05 n模冗余系统 双模冗余系统 Duplex Systems

接收测试 测试 &#xff08;HA服务器的方法&#xff09; HA系统 一、基本HA结构 当前常用的HA&#xff08;High Availability&#xff09;系统结构大体如下&#xff1a; 双机结构&#xff1a;两台主机&#xff08;可称为主机A和主机B&#xff09; 两种运行模式&#xff1a; A…...

Translational Psychiatry | 注意缺陷多动障碍儿童延迟厌恶的行为与神经功能特征茗创科技茗创科技

摘要 尽管已有大量研究致力于解析注意缺陷多动障碍(ADHD)中的认知异质性&#xff0c;但对其动机变化(尤其是延迟厌恶)的探索仍相对有限。本研究旨在通过识别ADHD儿童的同质性延迟厌恶特征来理解其动机缺陷&#xff0c;采用体验式延迟贴现任务对43名ADHD儿童和47名对照参与者(经…...

MYSQL备份恢复知识:第四章:备份锁

为了获得备份数据的一致性&#xff0c;需要在数据库中加锁&#xff0c;保证在备份期间没有数据变化。早期版本的MySQL仅支持表级锁&#xff0c;在加锁期间不允许访问数据库&#xff0c;这对生产环境是极大的挑战。因此&#xff0c;在后续版本中引入了实例级锁&#xff0c;使得备…...

寻找最优美做题曲线

题目描述 一个有趣的评测功能&#xff0c;就是系统自动绘制出用户的“做题曲线”。所谓做题曲线就是一条曲线&#xff0c;或者说是折线&#xff0c;是这样定义的&#xff1a;假设某用户在第 bi​ 天 AC 了 ci​ 道题&#xff0c;并且 bi​ 严格递增&#xff0c;那么该用户的做…...

DeepSeek-V3 vs GPT-4:技术对比与性能评测

DeepSeek-V3 vs GPT-4&#xff1a;技术对比与性能评测 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 DeepSeek-V3 vs GPT-4&#xff1a;技术对比与性能评测摘要引言技术架构对比1. 模型结构&#xff1a;稠密模型 …...

【Fifty Project - D29】

今日完成记录 TimePlan完成情况7&#xff1a;30 - 9&#xff1a;00大论文修改以及小论文修改√9&#xff1a;00 - 9&#xff1a;30整理近期购置物品项√9&#xff1a;30 - 10&#xff1a;00约了个画稿做个毕业冰箱贴&#xff01;√10&#xff1a;00 - 11&#xff1a;30Leetcod…...

创建一个使用 GPT-4o 和 SERP 数据的 RAG 聊天机器人

亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据&#xff1a;网络数据平台领航者https://www.bright.cn/?promogithub15?utm_sourceorganic-social-cn&utm_campaigncsdn 本指南将解释如何使用 Python、GPT-4…...

安装PostgresSQL

目录 安装postgressql所需的依赖环境 编译安装 解压源码包 切换目录 --prefix指定安装目录 编译以及安装 配置环境创建用户 创建数据存储目录 更改数据存储目录的归属用户 配置环境变量 登录数据库 Dnf安装 安装postgresql 初始化数据库 登录数据库 postgresql…...

PL/SQL 安装配置与使用

目录 一、安装与配置 &#xff08;一&#xff09;下载PLSQL Developer &#xff08;二&#xff09;下载并配置免安装Oracle客户端 1. 下载Instantclient_11_2 2. 配置环境 &#xff08;1&#xff09;配置电脑的环境变量 &#xff08;2&#xff09;配置PLSQL Developer的…...

Oracle RAC ADG备库版本降级方案(19.20 → 19.7)

Oracle RAC ADG备库版本降级方案&#xff08;19.20 → 19.7&#xff09; 一、前期准备 1.1环境验证 主库版本&#xff1a;19.7 备库版本&#xff1a;19.20 检查兼容性&#xff1a;确认Oracle 19.20补丁是否支持回滚至19.7 1.2备份与快照 对备库数据库进行全量备份&#…...

SpringBoot-4-Spring Boot项目配置文件和日志配置

文章目录 1 项目全局配置文件1.1 配置示例1.2 配置文件加载顺序2 通过配置文件注入配置项2.1 使用@Value注解注入属性2.2 使用@ConfigurationProperties注入2.3 配置注入的注意事项2.4 配置文件中引用已定义值3 Spring Boot的日志配置3.1 引入日志依赖器3.2 自定义日志格式3.3 …...

mac上安装 Rust 开发环境

1.你可以按照提示在终端中执行以下命令&#xff08;安全、官方支持&#xff09;&#xff1a; curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh然后按提示继续安装即可。 注意&#xff1a;安装过程中建议选择默认配置&#xff08;按 1 即可&#xff09;。 如果遇…...

微软押注“代理式AI网络”:一场重塑软件开发与工作方式的技术革命

在 2025 年 Build 开发者大会上&#xff0c;微软正式发布了其面向“开放代理式网络&#xff08;Open Agentic Web&#xff09;”的宏大战略&#xff0c;推出超过 50 项 AI 相关技术更新&#xff0c;涵盖 GitHub、Azure、Windows 和 Microsoft 365 全线产品。这一系列更新的核心…...

鸿蒙HarmonyOS多设备流转:分布式的智能协同技术介绍

随着物联网和智能设备的普及&#xff0c;多设备间的无缝协作变得越来越重要。鸿蒙&#xff08;HarmonyOS&#xff09;作为华为推出的新一代操作系统&#xff0c;其分布式技术为实现多设备流转提供了强大的支持。本文将详细介绍鸿蒙多设备流转的技术原理、实现方式和应用场景。 …...

精益数据分析(71/126):从移情到黏性——创业阶段的关键跨越与数据驱动策略

精益数据分析&#xff08;71/126&#xff09;&#xff1a;从移情到黏性——创业阶段的关键跨越与数据驱动策略 在创业的旅程中&#xff0c;从需求验证的“移情阶段”过渡到产品黏性构建的“黏性阶段”&#xff0c;是决定创业成败的关键转折。今天&#xff0c;我们结合《精益数…...

21. 自动化测试框架开发之Excel配置文件的测试用例改造

21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…...

学习vue3:监听器

目录 一&#xff0c;关于监听的概述 二&#xff0c;手动监听器&#xff08;watch函数) watch&#xff08;&#xff09;函数语法 监听基本数据类型 监听对象&#xff0c;对象属性 三&#xff0c;自动监听器&#xff08;watchEffect函数&#xff09; watchEffect()函数语法…...

十大排序算法--快速排序

目录 原理 第一步 第二步 代码 递归实现快速排序 原理 分治法核心步骤 选择基准值&#xff08;Pivot&#xff09; 从数组中选一个元素作为基准值&#xff08;如最右侧元素、中间元素或随机元素&#xff09;。 分区&#xff08;Partition&#xff09; 将数组分为两部分…...

基于Docker搭建Harbor私有镜像仓库

Harbor 是 VMware 开源的企业级 Docker 容器镜像仓库&#xff0c;支持镜像存储、访问控制、镜像复制、安全扫描、审计日志等功能&#xff0c;适合企业级私有化部署。 1.前置环境说明 Harbor的部署依赖于Docker和Docker Compose环境。鉴于Docker已在系统中完成安装&#xff0c;…...

CentOS 7上搭建高可用BIND9集群指南

在 CentOS 7 上搭建一个高可用的 BIND9 集群通常涉及以下几种关键技术和策略的组合&#xff1a;主从复制 (Master-Slave Replication)、负载均衡 (Load Balancing) 以及可能的浮动 IP (Floating IP) 或 Anycast。 我们将主要关注主从复制和负载均衡的实现&#xff0c;这是构成高…...

使用SQLite Studio导出/导入SQL修复损坏的数据库

使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏&#xff0c;在软件中寸步难行&#xff0c;遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具&#xff0c;支持Windows/macOS/Linux。相较于其…...

Liquid Wire 柔性应变传感器:金属凝胶导体 | 仿生肌肉长度监测 | 高精度动作控制

柔性应变传感器通过模拟生物系统反馈机制&#xff0c;为软体机器人提供高精度动作控制能力。研究显示&#xff0c;基于液态导电金属的柔性传感纤维可精准测量仿生手指触觉力&#xff08;约 1600 kPa&#xff09;和关节角度变化&#xff08;约 60&#xff09;&#xff0c;实现特…...

Java IO流操作

Java IO流操作是处理文件和数据流的基础。通过FileInputStream和FileOutputStream&#xff0c;可以读写二进制文件&#xff1b;通过FileReader和FileWriter&#xff0c;可以处理文本文件。BufferedReader提高字符读取效率&#xff0c;InputStreamReader实现字节流到字符流的转换…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3)

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3) 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)受身形(1)两要素时,使用【に】(2)三要素时,使用【を】或其他(3)(4)(5) によって(6)から VS で(2)復習(ふくしゅう):3、单词(…...

BPMN.js编辑器设计器与属性面板数据交互

以下是基于提供的Vue组件代码生成的类图&#xff0c;结合BPMN设计器特性与Vue组件封装规范绘制&#xff1a; #mermaid-svg-B6PK7fjqLLTHqh8B {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-B6PK7fjqLLTHqh8B .error…...

os agent智能体软件 - 第三弹 - 纯语音交互

前两期期我们发布了产品的初级形态&#xff0c;那时候还只能是“软件开发者”在本地配置使用&#xff0c;或者运行起来有个大黑框&#xff0c;使用起来美观度太差。 到今天大概20天&#xff0c;我们的第3版已经出来了&#xff0c;不仅做成了电脑端的exe软件&#xff08;任何人…...

PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理、 目录 前言 1.二极管 1.发光…...

python打卡训练营打卡记录day31

知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目ipynb&#xff0c;将他按照今天的示例项目整理成规范的形式&#xff0c;思考下哪些部分可以未来复用。 心脏病项目目录 目录结构:heart/ ├── conf…...

Python列表推导式和生成器表达式详解

Python列表推导式和生成器表达式详解 引言 Python以其简洁优雅的语法而闻名&#xff0c;其中列表推导式&#xff08;List Comprehensions&#xff09;和生成器表达式&#xff08;Generator Expressions&#xff09;就是这种优雅性的典型代表。本文将深入浅出地介绍这两种强大的…...

Redis 命令大全

Redis 是一个开源的内存数据结构存储系统,支持多种数据结构。以下是 Redis 的常用命令分类总结: 一、Key(键)相关命令 命令描述示例DEL key删除键DEL nameEXISTS key检查键是否存在EXISTS nameEXPIRE key seconds设置键的过期时间(秒)EXPIRE name 60TTL key查看键剩余过期…...

Wan2.1 图生视频 支持批量生成

Wan2.1 图生视频 支持批量生成 flyfish 综合效果 实现基于 Wan2.1 模型的配置化批量生成功能&#xff0c;支持从prompt.json读取多个 “图像 - 文本提示” 组合&#xff08;每个任务可关联多图像&#xff09;&#xff0c;通过config.json集中管理模型路径、分辨率、帧数、引…...

Git 删除大文件教程

&#x1f9f9; Git 删除大文件完整教程 &#x1f9e9; 适用场景 不小心将大文件&#xff08;如视频、压缩包、模型文件等&#xff09;提交到了 Git 仓库想彻底从仓库和提交历史中删除这个文件希望远程仓库体积减小&#xff08;如 GitHub 上传失败&#xff09; &#x1f6e0;️…...

题海拾贝:P2285 [HNOI2004] 打鼹鼠

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 1、题目 P2285 [HNOI2004] 打…...

第40天-Python开发音乐播放器完整指南

一、技术选型与工具准备 核心库: Pyqt5:Python标准GUI库,构建用户界面 os / sys:文件系统操作 开发环境: bash 复制 下载 pip install pyqt5 二、功能设计 功能模块描述播放控制播放/暂停/停止/上一曲/下一曲播放列表管理添加/删除/保存/加载歌曲音频可视化进度条显示与拖…...

【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite

在 Quill 日志库中,safe_fwrite 函数的封装是为了解决直接使用系统 fwrite 时可能存在的 可靠性 和 错误处理 问题,同时兼顾性能优化。以下从多个维度详细分析其设计动机和实现原理: 一、代码功能解析 QUILL_ATTRIBUTE_HOT static void safe_fwrite(void const* ptr, size_…...

UE(虚幻)学习(六)插件打包在UE5.3.2下Value cannot be null的错误

自己写的插件打包出现了Unhandled exception: System.ArgumentNullException: Value cannot be null.的错误&#xff0c;发现只有UE5.3会报出。 D:\UE_5.3\Engine\Build\BatchFiles>Runuat.bat BuildPlugin -PluginF:\UEProjects\DQSDK5_3\Plugins\DQSDK\DQSDK.uplugin -Pa…...

JDBC在Java项目开发中的核心作用与实战应用

一、JDBC概述及其在项目开发中的重要性 JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口(API)&#xff0c;它为Java开发者提供了与各种关系型数据库进行交互的统一方式。 JDBC的核心价值&#xff1a; 提供与数据库无关的标准接…...

为 Jenkins添加 Windows Slave远程执行 python项目脚本

测试环境 JAVA JDK 1.7.0_13 (jdk-7u13-windows-i586.exe) Jenkins Win11 64 python项目环境 实践操作 1、新建与配置结点 【系统管理】-> 【管理结点】-> 【新建结点】, 如上&#xff0c;输入结点名称&#xff0c;勾选 【Dumb Slave】&#xff0c;点击【OK】 说明&am…...

深入解析Spring Boot与Redis的缓存集成实践

深入解析Spring Boot与Redis的缓存集成实践 引言 在现代Web应用中&#xff0c;缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存场景。本文将详细介绍如何在Spring Boot项目中集成Redis&#xff0c;并探讨其在实际开发中的…...

硬件工程师笔记——三极管Multisim电路仿真实验汇总

目录 1 三极管基础 更多电子器件基础知识汇总链接 1.1 工作原理 NPN型三极管的工作原理 PNP型三极管的工作原理 1.2 三极管的特性曲线 输入特性曲线 理想和现实输出特性 三极管的主要参数包括&#xff1a; 2 三极管伏安特性 2.1 伏安特性仿真 Multisim使用说明链接…...

基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战

&#x1f9e0; 基于 ABP vNext CQRS MediatR 构建高可用与高性能微服务系统&#xff1a;从架构设计到落地实战 目录 &#x1f9e0; 基于 ABP vNext CQRS MediatR 构建高可用与高性能微服务系统&#xff1a;从架构设计到落地实战&#x1f9f0; 模块结构概览&#x1f4e6; 各…...

java云原生实战之graalvm 环境安装

windows环境安装 在Windows环境下安装GraalVM并启用原生镜像功能时&#xff0c;需要Visual Studio的组件支持。具体要点如下&#xff1a; 核心依赖&#xff1a; 需要安装Visual Studio 2022或更新版本&#xff0c;并确保勾选以下组件&#xff1a; "使用C的桌面开发"…...

Python 包管理工具uv依赖分组概念解析

在 Python 包管理工具 uv 中&#xff0c;依赖分组&#xff08;如 dev、prod&#xff09;是一种将项目的不同依赖按用途分类管理的机制。通过分组&#xff0c;开发者可以清晰地分离生产环境&#xff08;运行项目所需的核心依赖&#xff09;和开发环境&#xff08;仅在开发阶段使…...

C语言-9.指针

9.1指针 9.1-1取地址运算:&运算符取得变量的地址 运算符& scanf(“%d”,&i);里的&获取变量的地址,它们操作数必须是变量int i;printf(“%x”,&i);地址的大小是否与int相同取决于编译器int i;printf(“%p”,&i); &不能取的地址不能对没有地址的…...