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

C++分析AVL树

目录

AVL树介绍

AVL树平衡因子更新分析

AVL树插入时旋转与平衡因子更新

左单旋

右单旋

左右单旋

右左单旋

AVL旋转可行性

AVL树节点删除(待补充)

AVL树分析


AVL树介绍

二叉搜索树在某些极端情况下可能会退化,为了解决这个问题,引入了AVL树(平衡搜索二叉树中的一种)控制二叉搜索树的不平衡情况,插入一个新节点后,控制每一个节点的左右子树高度差的绝对值不超过1

之所以控制绝对值不超过1而不是不超过0是因为只有在满二叉树的情况下才可以满足每一个节点的左右子树高度差的绝对值不超过0,为了满足普遍性,选择绝对值不超过1

一棵AVL树具有以下的特点:

  1. 每一个节点的左右子树都是AVL树

  2. 左右子树高度差的绝对值(通过平衡因子判断)不超过1

绝对值不超过1,包括-1、1和0

以右子树高度减左子树高度为例,下面是含有每一个节点的高度的AVL树示意图:

AVL树平衡因子更新分析

在AVL树中,平衡因子更新只有两种情况:1. 增加 2. 减少,但是需要考虑什么时候增加什么时候减少

  1. 当插入节点在左子树时,平衡因子减少,例如插入在8节点的左子树

  2. 当插入节点在右子树时,平衡因子增加,例如插入在8的右子树

接着考虑插入新节点后,哪些节点的平衡因子需要改变。

  1. 如果插入节点在8的左子树,那么更新时只会更新8节点的平衡因子,因为8初始时是1,插入在左子树平衡因子减小,而对于节点7来说,并没有影响到其平衡因子,因为7的右子树总体的高度没有发生变化,而对于根节点的左子树以及7节点的左子树来说没有一点影响

  2. 如果按照下图的插入方式,插入节点为红色节点,此时会更新其所有祖先节点

  3. 如果插入节点在8的右子树,那么更新时8节点的平衡因子变为了2,因为8初始时是1,插入在右子树平衡因子增加,因为AVL树规定每一个节点的左右子树高度差的绝对值不能超过1,所以此时8节点需要进行额外处理使其恢复AVL树结构

综上所述,存在三种情况:

  1. 插入节点的父亲节点更新为0时:插入节点前父亲节点平衡因子为1或者-1(一边高一边矮),为1时,右子树高,插入位置为左子树;为-1时,左子树高,插入位置为右子树(插入在矮的一边),此时只需要更新父亲节点的平衡因子,因为总高度并没有发生变化。例如8节点的左子树插入节点,树的总高度还是4

  2. 插入节点的父亲节点更新为1或者-1时:插入节点前父亲节点平衡因子为0(左右子树高度相等),当更新为1时,插入位置为右子树,右子树变高,起始为-1时,插入位置为左子树,左子树变高(其中一方变高),此时需要更新所有祖先节点的平衡因子,因为插入的节点导致了树的总高度发生变化,例如例2插入红色节点树的总高度由4变为5

  3. 插入节点的父亲节点更新为2或者-2时:插入节点前父亲节点平衡因子为1或者-1(左右子树存在一方高一方矮),当更新为2时,原父亲节点平衡因子为1,并且插入位置在平衡因子为1的父亲节点的右子树,例如在节点8右子树插入新节点;当更新为-2时,原父亲节点平衡因子为-1,插入位置平衡因子为-1的父亲节点的右子树(高的一方继续变高,矮的一方没有改变),此时需要进行旋转处理将平衡因子为2或者-2的节点对应的树进行调整使其恢复AVL树结构

AVL树插入时旋转与平衡因子更新

左单旋

当插入的节点在平衡因子为1的父亲节点的右子树右子树上时,此时父亲节点的平衡因子更新为2,其右孩子节点的平衡因子分别为1和0时需要进行左单旋,例如下面的一种具体情况:

为了便于分析,将插入位置进行抽象化,a、b和c分别是高度h>=0的AVL子树,如下图所示:

此时因为父亲节点10的平衡因子变为了2,需要进行左旋,左旋需要进行的步骤如下:

平衡因子计算:

h+1(新增节点所在层数)-1=1为20节点的平衡因子

h+1+1(20节点所在层数)-h=2为10节点的平衡因子

  1. 将20的左孩子给10节点作为其右孩子

  2. 将10降下作为20的左孩子

  1. 20节点作为本棵子树的根节点

  2. 更新10和20节点的平衡因子为0

结合变量parentsubRsubRL

代码实现:

 // 左单旋void rotateLeft(node* parent){// 定义节点node* subR = parent->_right;node* subRL = subR->_left;​// 1. subRL变为parent的右孩子parent->_right = subRL;// 更新subRL的_parent为parent,需要注意当h=0时subRL节点不存在,所以需要进行判断subRL是否为空if (subRL){subRL->_parent = parent;}// 2. parent变为subR的左孩子subR->_left = parent;// 3. subR变为本棵子树的根节点// 记录parent的父亲节点node* parentParent = parent->_parent;// 更新parent节点的父亲节点为subRparent->_parent = subR;// 更新parent节点的父亲节点的孩子节点为subRif (parentParent == nullptr){// 父亲节点为空证明是根节点_root = subR;subR->_parent = nullptr;}else{if (parentParent->_left == parent){parentParent->_left = subR;}else{parentParent->_right = subR;}​// 更新subR的父亲节点subR->_parent = parentParent;}​// 4. 更新平衡因子parent->_bf = subR->_bf = 0;}

右单旋

当插入的节点在平衡因子为-1的父亲节点的左子树左子树上时,此时父亲节点的平衡因子更新为-2,其左孩子节点的平衡因子分别为-1和0时需要进行右单旋,例如下面的一种具体情况:

为了便于分析,将插入位置进行抽象化,a、b和c分别是高度h>=0的AVL子树,如下图所示:

此时因为父亲节点10的平衡因子变为了-2,需要进行右旋,右旋需要进行的步骤如下:

平衡因子计算:

h-(h+1(新增节点所在层数))=-1为20节点的平衡因子

h-(h+1+1(20节点所在层数))=-2为10节点的平衡因子

  1. 将20的右孩子作为10的左孩子

  1. 将10作为20的右孩子

  1. 将20作为本棵子树的根节点

  2. 更新10和20的平衡因子为0

结合变量parentsubLsubLR

代码实现:

 
// 右单旋void rotateRight(node* parent){node* subL = parent->_left;node* subLR = subL->_right;​// 1. 将subLR作为parent的左孩子parent->_left = subLR;// 更新subLR的parentif (subLR){subLR->_parent = parent;}// 2. 将parent作为subL的右孩子subL->_right = parent;// 3. 将subL作为本棵子树的根节点// 记录当前parent节点的父亲节点node* parentParent = parent->_parent;// 更新parent的_parent为subLparent->_parent = subL;if (parentParent == nullptr){_root = subL;subL->_parent = nullptr;}else{if (parentParent->_left == parent){parentParent->_left = subL;}else{parentParent->_right = subL;}​// 更新subL的父亲节点subL->_parent = parentParent;}​// 4. 更新平衡因子subL->_bf = parent->_bf = 0;}

左右单旋

当插入的节点在平衡因子为-1的父亲节点的左子树右子树上时,此时父亲节点的平衡因子更新为-2,其右孩子节点的平衡因子分别为1和0时需要先进行左单旋再进行右单旋,例如下面的一种具体情况:

为了便于分析,将插入位置进行抽象化

  1. a、b和c分别是高度h=0的AVL子树,如下图所示:

在当前情况下,b位置的节点即为新增节点,a和c位置此时均没有节点,10节点的平衡因子更新为-2,10节点的左孩子节点的平衡因子更新为1

平衡因子计算:

5节点的平衡因子:h+1(新增节点所在层数)-h=1

10节点的平衡因子:h-(h+1+1(5节点所在层数))=-2

  1. a、b、c和d分别是高度h>0的AVL子树,如下图所示:

h>0在上图的情况下代表已经至少存在一个节点,即5的右子树开始有一个节点存在,所以6位置没有节点时用h-1代替

此时插入节点的位置有两种:

(a) 在b位置插入,此时6节点的平衡因子变为-1,5节点的平衡因子变为1,10节点的平衡因子变为-2

平衡因子的计算:

6节点的平衡因子:h-1-h(新增节点所在层数)=-1

5节点的平衡因子:h+1(6节点所在层数)-h=1

10节点的平衡因子:h-(h+1+1)=-2

(b) 在d位置插入,此时6节点的平衡因子变为-1,5节点的平衡因子变为1,10节点的平衡因子变为-2

平衡因子的计算:

6节点的平衡因子:h+1-h(新增节点所在层数)=1

5节点的平衡因子:h+1(6节点所在层数)-h=1

10节点的平衡因子:h-(h+1+1)=-2

尽管左右单旋有两种主要情况,但是实际上影响到的平衡因子的更新,主要思路还是先左旋再右旋,为了更好观察效果,以第二种情况中的第一种情况为例分析先左旋再右旋的步骤:

  1. 左旋(将多条路径更新化为一条路径更新)

    1. 将6节点的左孩子作为5节点的右孩子

    2. 将5节点作为6节点的左孩子

    3. 将6节点作为本棵树的根节点,链接到10节点的左孩子(因为开始的父亲节点5是10节点的左孩子)

  2. 右旋(更新单一路径)

    1. 将6节点的右孩子作为10节点的左孩子

    2. 将10节点作为6节点的右孩子

    3. 将6节点作为本棵树的根节点

    4. 更新平衡因子

当树旋转结束后需要更新对应的平衡因子,此时需要考虑到两种主要情况,即h=0h>0,结合变量parentsubLsubLR

  1. h=0,左右双旋结束后如下图所示:

  2. h>0

    1. 插入位置在b,左右双旋结束后如下图所示:

    2. 插入位置在d,左右双旋结束后如下图所示:

    代码实现:

    // 左右双旋void rotateLR(node* parent){// 记录旋转前的平衡因子node* subL = parent->_left;node* subLR = subL->_right;int bf = subLR->_bf;​// 1. 左右双旋// 左旋rotateLeft(parent->_left);// 右旋rotateRight(parent);​// 更新平衡因子if (bf == 0){subL->_bf = parent->_bf = 0;}else if (bf == -1)// 插入在d位置{subL->_bf = 0;subLR->_bf = 0;parent->_bf = 1;}else if (bf == 1){subL->_bf = -1;subLR->_bf = 0;parent->_bf = 0;}else{assert(false);}}

右左单旋

当插入的节点在平衡因子为1的父亲节点的右子树左子树上时,此时父亲节点的平衡因子更新为2,其右孩子节点的平衡因子分别为-1和0时需要先进行右单旋再进行左单旋,例如下面的一种具体情况:

为了便于分析,将插入位置进行抽象化

  1. a、b和c分别是高度h=0的AVL子树,如下图所示:

在当前情况下,c位置的节点即为新增节点,a和b位置此时均没有节点,10节点的平衡因子更新为-2,10节点的左孩子节点的平衡因子更新为1

  1. a、b、c和d分别是高度h>0的AVL子树,如下图所示:

h>0在上图的情况下代表已经至少存在一个节点,即20的左子树开始有一个节点存在,所以15位置没有节点时用h-1代替

此时插入节点的位置有两种:

(a)当插入在c位置时,15的平衡因子变为1,20的平衡因子变为-1,10的平衡因子变为2

(b)当插入在d位置时,15的平衡因子变为-1,20的平衡因子变为-1,10的平衡因子变为2

尽管右左单旋有两种主要情况,但是实际上影响到的平衡因子的更新,主要思路还是先右旋再左旋,为了更好观察效果,以第二种情况中的第一种情况为例分析先右旋再左旋的步骤:

  1. 右旋(将多条路径更新化为一条路径更新)

    1. 将15的右孩子作为20的左孩子

    2. 将20作为15的右孩子

    3. 15作为本棵子树的根节点,链接到10节点的右孩子位置

  2. 左旋(更新单一路径)

    1. 将15节点的左孩子作为10节点的右孩子

    2. 10节点作为15节点的左孩子

    3. 15作为本棵子树的根

    4. 更新平衡因子

当树旋转结束后需要更新对应的平衡因子,此时需要考虑到两种主要情况,即h=0h>0,结合变量parentsubRsubRL

  1. h=0,左右双旋结束后如下图所示:

  2. h>0

    1. 插入位置在c,左右双旋结束后如下图所示:

    2. 插入位置在d,左右双旋结束后如下图所示:

代码实现:

 // 右左双旋void rotateRL(node* parent){// 记录旋转前的平衡因子node* subR = parent->_right;node* subRL = subR->_left;int bf = subRL->_bf;​// 1. 右左双旋// 右旋rotateRight(parent->_right);// 左旋rotateLeft(parent);​// 更新平衡因子if (bf == 0){subR->_bf = parent->_bf = 0;}else if (bf == 1)// 插入在c位置{subR->_bf = 0;subRL->_bf = 0;parent->_bf = -1;}else if (bf == -1) // 插入在d位置{subR->_bf = 1;subRL->_bf = 0;parent->_bf = 0;}else{assert(false);}}

AVL旋转可行性

以左单旋为例,其余类比推理即可

在左单旋中,选择b子树作为10节点的右孩子节点是可行的,因为b子树的所有节点满足比10节点大,比20节点小,根据二叉搜索树的规则进行旋转

AVL树节点删除(待补充)

AVL树分析

AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度,即log_2 (N)。但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。因此如果需要一种查询高效且有序的数据结构,而且数 据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修改,就不太适合

相关文章:

C++分析AVL树

目录 AVL树介绍 AVL树平衡因子更新分析 AVL树插入时旋转与平衡因子更新 左单旋 右单旋 左右单旋 右左单旋 AVL旋转可行性 AVL树节点删除(待补充) AVL树分析 AVL树介绍 二叉搜索树在某些极端情况下可能会退化,为了解决这个问题&…...

aurora8b10b ip的使用(framing接口下的数据回环测试)

文章目录 一、Aurora8B/10B协议二、时钟、复位与状态指示1、时钟2、复位3、状态指示 三、数据发送、接受接口(1)AXI4-Stream位排序(2)Streaming接口(3)Framing接口(帧传输接口) 四、…...

如何通过OpenCV判断图片是否包含在视频内?

要判断图片是否包含在视频内,可以使用计算机视觉技术和图像处理方法。这通常涉及特征匹配或模板匹配。以下是一个基于OpenCV的解决方案,通过特征匹配的方法来实现这一目标。 步骤概述 读取视频和图片: 使用OpenCV读取视频文件和图片文件。 …...

大数据基础:Spark重要知识汇总

文章目录 Spark重要知识汇总 一、Spark 是什么 二、Spark 四大特点 三、Spark框架模块介绍 3.1、Spark Core的RDD详解 3.1.1、什么是RDD 3.1.2、RDD是怎么理解的 四、Spark 运行模式 4.1、Spark本地模式介绍 4.2、Spark集群模式 Standalone 4.3、Spark集群模式 Stan…...

Executable Code Actions Elicit Better LLM Agents

Executable Code Actions Elicit Better LLM Agents Github: https://github.com/xingyaoww/code-act 一、动机 大语言模型展现出很强的推理能力。但是现如今大模型作为Agent的时候,在执行Action时依然还是通过text-based(文本模态)后者JSO…...

循环结构(三)——do-while语句

目录 🍁引言 🍁一、语句格式 🚀格式1 🚀格式2 🍁二、语句执行过程 🍁三、实例 🚀【例1】 🚀【例2】 🚀【例3】 🍁总结 🍁备注 &am…...

pandas 或筛选

pandas 或筛选 在Pandas中,可以使用DataFrame.loc方法结合逻辑运算符来实现或筛选。这里提供一个简单的例子: import pandas as pd 创建示例DataFrame df pd.DataFrame({ ‘A’: [1, 2, 3, 4], ‘B’: [5, 6, 7, 8], ‘C’: [9, 10, 11, 12] }) 设定…...

工具(1)—截屏和贴图工具snipaste

演示和写代码文档的时候,总是需要用到截图。在之前的流程里面,一般是打开WX或者QQ,找到截图工具。但是尴尬的是,有时候,微信没登录,而你这个时候就在写文档。为了截个图,还需要启动微信&#xf…...

【从零开始一步步学习VSOA开发】快速体验SylixOS

快速体验SylixOS 安装完毕RealEvo-IDE 后,同时也安装了RealEvo-Simulator。RealEvo-Simulator 是一个虚拟运行环境,可以模拟各种体系结构并在其上运行 SylixOS。相比于物理板卡,在 RealEvo-Simulator 进行运行调测更加的方便快捷且成本低廉。…...

Ansible自动化:简化IT基础设施管理的艺术

目录 一.前言 二.Ansible简介 2.1什么是Ansible? 2.2Ansible的主要特点 2.3Ansible的应用场景 三.探索Ansible的高级功能 3.1 高级Playbook特性 3.2 Ansible Vault 3.3 动态Inventory 3.4Ansible Tower(AWX) 3.5模块开发 3.6 Ans…...

【Rust光年纪】探索Rust语言中的WebSocket库和框架:优劣一览

Rust语言中的实时通信利器:WebSocket库与框架全面解析 前言 随着Rust语言的不断发展,其在Web开发领域也变得越来越受欢迎。WebSocket作为实现实时通信的重要技术,在Rust的生态系统中也有多个库和框架提供了支持。本文将介绍几个主流的Rust …...

HTML 基础结构

目录 1. 文档声明 2. 根标签 3. 头部元素 4. 主题元素 5. 注释 6. 演示 1. 文档声明 <!DOCTYPE html>&#xff1a;声明文档类型&#xff0c;表示该文档是 html 文档&#xff0c; 2. 根标签 &#xff08;1&#xff09;所有的其他标签都要放在一对根标签中&#…...

多页合同怎么盖骑缝章_电子合同怎么盖骑缝章?

多页合同怎么盖骑缝章&#xff1f;电子合同怎么盖骑缝章&#xff1f; 对于纸质多页合同&#xff0c;盖骑缝章是一种常见的做法&#xff0c;用于确保合同的完整性&#xff0c;防止任何页面被替换或篡改。以下是盖骑缝章的基本步骤&#xff1a; 将所有合同页面平铺在桌面上。用…...

GD 32 IIC通信协议

前言&#xff1a; ... 通信方式 通信方式分为串行通信和并行通信。常见的串口就是串行通信的方式 常用的串行通信接口 常用的串行通信方式有USART,IIC,USB,CAN总线 同步与异步 同步通信&#xff1a;IIC是同步通信&#xff0c;有两个线一个是时钟信号线&#xff0c;一个数数据…...

Spring Task初学

介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑 为什么要在Java程序中使用Spring Task? 运行效果 cron表达式&#xff1a;一般日和周不会同时出现 入门案例 启动类添加注解EnableScheduling开始任务调度 创建MyTask类…...

决策树可解释性分析

决策树可解释性分析 决策树是一种广泛使用的机器学习算法&#xff0c;以其直观的结构和可解释性而闻名。在许多应用场景中&#xff0c;尤其是金融、医疗等领域&#xff0c;模型的可解释性至关重要。本文将从决策路径、节点信息、特征重要性等多个方面分析决策树的可解释性&…...

BUGKU-WEB never_give_up

解题思路 F12查看请求和响应&#xff0c;查找线索 相关工具 base64解码URL解码Burp Suit抓包 页面源码提示 <!--1p.html--> 2. 去访问这个文件&#xff0c;发现直接跳转到BUGKU首页&#xff0c;有猫腻那就下载看看这个文件内容吧 爬虫下载这个文件 import requests …...

hive自动安装脚本

使用该脚本注意事项 安装hive之前确定机子有网络。或者yum 更改为本地源&#xff0c;因为会使用epel仓库下载一个pv的软件使用该脚本前提是自行安装好mysql数据库准备好tomcat软件包&#xff0c;该脚本使用tomcat9.x版本测试过能正常执行安装成功&#xff0c;其他版本没有测试…...

unix 用户态 内核态

在UNIX操作系统中&#xff0c;"用户态"和"内核态"是两种不同的运行模式&#xff0c;它们定义了程序在执行时的权限级别&#xff1a; 用户态&#xff08;User Mode&#xff09;&#xff1a; 用户态是程序运行的常规状态&#xff0c;大多数应用程序在执行时…...

GD32 IAP升级——boot和app相互切换

GD32 IAP升级——boot和app相互切换 目录 GD32 IAP升级——boot和app相互切换1 Keil工程设置1.1 修改ROM1.2 Keil烧录配置 2 代码编写2.1 app跳转2.2 软件重启2.3 app中断向量表偏移 结束语 1 Keil工程设置 1.1 修改ROM GD32内部Flash是一整块连续的内存&#xff0c;但是因为…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...