如何在AVL树中高效插入并保持平衡:一步步掌握旋转与平衡因子 —— 旋转篇
文章目录
- AVL树种旋转的规则
- 右单旋
- 右单旋代码
- 左单旋
- 左单旋代码
- 左右双旋
- 左右单旋的代码
- 右左单旋
- 右左单旋的代码
AVL树种旋转的规则
在AVL树中,旋转是为了保持树的平衡性。AVL树是一种自平衡的二叉搜索树,它要求每个节点的左右子树的高度差不能超过1。当插入或删除节点后,可能会导致树的平衡因子(左右子树的高度差)超出允许的范围(-1、0、1)。为了恢复平衡,AVL树会使用旋转来调整树的结构。
旋转类型
根据不平衡的类型,AVL树有四种基本的旋转方式:
- 单右旋转(Right Rotation) - 适用于左子树过高的情况。
- 单左旋转(Left Rotation) - 适用于右子树过高的情况。
- 左-右双旋转(Left-Right Rotation) - 适用于左子树的右子树过高的情况。
- 右-左双旋转(Right-Left Rotation) - 适用于右子树的左子树过高的情况。
在上一篇文章当中,我们已经知道了关于AVL树的结构
下面重新展示出来:
template<class K, class V>
struct AVLTreeNode
{// 每个节点包含的元素和指针pair<K, V> _kv; // 存储键值对AVLTreeNode<K, V>* _left; // 左子树指针AVLTreeNode<K, V>* _right; // 右子树指针AVLTreeNode<K, V>* _parent; // 父节点指针int _bf; // 平衡因子// 构造函数AVLTreeNode(const pair<K, V>& kv): _kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0){}
};template<class K, class V>
class AVLTree
{typedef AVLTreeNode<K, V> Node; // 节点类型
public:// 其他操作(插入、删除、查找等)可以在此添加private:Node* _root; // 根节点指针
};
右单旋
抽象的来看右单旋的图(我们可以在最后在看这个图,先有一个大概印象)
- 最基础的情况
我们肉眼看到的是在 5 结点插入了一个左子树 1 结点,原先平衡的树,在新插入一个节点之后就不平衡了,其grandfather的平衡因子由-1变为了-2, 不满足AVL树的平衡条件,所以这种情况下,我们就需要通过旋转,以此达到让插入之后形成的这颗树平衡,可以看见,这颗树是左边高,所以需要向右进行旋转,即左高往右旋转,所以旋转之后的图形即是上图的最右侧图形,而且,5 变成了 10的父节点,10变成了 5 的右子树
- 情况1上增加一个高度的情况
同样的,在左子树叶子结点插入左子树,也是通过右旋转,以此达到平衡
-
再次添加难度
-
最复杂的情况
右单旋代码
根据上面图片理解下面的代码
void RotateR(Node* parent)
{// 获取父节点的左子节点Node* subL = parent->_left;// 获取左子节点的右子节点Node* subLR = subL->_right;// 修改父节点的左子节点为 subLRparent->_left = subLR;// 如果 subLR 不为空,更新 subLR 的父节点为 parentif (subLR)subLR->_parent = parent;// 获取 parent 的父节点,方便之后修改,这个地方因为parent可能不是根节点,所以可能会继续向上进行平衡调整Node* parentParent = parent->_parent;// 将左子节点 subL 的右子节点指向 parent,parent 的父节点指向 subLsubL->_right = parent;parent->_parent = subL;// 如果 parent 是根节点,则需要修改树的根// 如果 parent 是子树的一部分,则只需修改父节点的指向if (parentParent == nullptr){// 如果 parent 没有父节点(即 parent 是树的根节点),修改根节点_root = subL;subL->_parent = nullptr; // subL 的父节点应为 null}else{// 如果 parent 有父节点(即 parent 只是子树的一部分),更新父节点的左/右指针if (parent == parentParent->_left){parentParent->_left = subL;}else{parentParent->_right = subL;}// 更新 subL 的父节点为 parent 的父节点subL->_parent = parentParent;}// 将 parent 和 subL 的平衡因子都设置为 0// 因为旋转后,两个节点的平衡因子应该都变为 0parent->_bf = subL->_bf = 0;
}
衷心希望读者,可以拿起笔来画图进行思考
左单旋
在分析完右单旋之后,左单旋的思考过程也是如此,当你弄清楚右单旋的过程,左单旋就是轻轻松松,举一反三!!!
左单旋代码
void RotateL(Node* parent)
{// 获取父节点的右子节点Node* subR = parent->_right;// 获取右子节点的左子节点Node* subRL = subR->_left;// 修改父节点的右子节点为 subRLparent->_right = subRL;// 如果 subRL 不为空,更新 subRL 的父节点为 parentif(subRL)subRL->_parent = parent;// 获取 parent 的父节点,方便之后修改Node* parentParent = parent->_parent;// 将右子节点 subR 的左子节点指向 parent,parent 的父节点指向 subRsubR->_left = parent;parent->_parent = subR;// 如果 parent 是根节点,则需要修改树的根// 如果 parent 是子树的一部分,则只需修改父节点的指向if (parentParent == nullptr){// 如果 parent 没有父节点(即 parent 是树的根节点),修改根节点_root = subR;subR->_parent = nullptr; // subR 的父节点应为 null}else{// 如果 parent 有父节点(即 parent 只是子树的一部分),更新父节点的左/右指针if (parent == parentParent->_left){parentParent->_left = subR;}else{parentParent->_right = subR;}// 更新 subR 的父节点为 parent 的父节点subR->_parent = parentParent;}// 将 parent 和 subR 的平衡因子都设置为 0// 因为旋转后,两个节点的平衡因子应该都变为 0parent->_bf = subR->_bf = 0;
}
左右双旋
左右双旋的情况——即左边高(子树在右子树),所以单独一次左旋或者右旋都是无法处理的,所以需要两者配合进行,才能让平衡因子平衡。
- 最基础情况
- 情况1增加一些难度
3.抽象的描述
左右单旋的代码
void RotateLR(Node* parent)
{// 获取父节点的左子节点Node* subL = parent->_left;// 获取左子节点的右子节点Node* subLR = subL->_right;// 获取 subLR 的平衡因子,用于调整旋转后的平衡因子int bf = subLR->_bf;// 先对左子节点进行左单旋 (RotateL)RotateL(parent->_left);// 然后对 parent 进行右单旋 (RotateR)RotateR(parent);// 根据 subLR 的平衡因子调整旋转后节点的平衡因子if (bf == 0){// 如果 subLR 的平衡因子是 0,旋转后所有节点的平衡因子都设置为 0subL->_bf = 0;subLR->_bf = 0;parent->_bf = 0;}else if (bf == -1){// 如果 subLR 的平衡因子是 -1,调整父节点、子节点的平衡因子subL->_bf = 0;subLR->_bf = 0;parent->_bf = 1;}else if (bf == 1){// 如果 subLR 的平衡因子是 1,调整父节点、子节点的平衡因子subL->_bf = -1;subLR->_bf = 0;parent->_bf = 0;}else{// 处理无效的平衡因子,理应不可能出现assert(false);}
}
右左单旋
右左单旋的代码
void RotateRL(Node* parent)
{// 获取父节点的右子节点Node* subR = parent->_right;// 获取右子节点的左子节点Node* subRL = subR->_left;// 获取 subRL 的平衡因子,用于调整旋转后的平衡因子int bf = subRL->_bf;// 先对右子节点进行右单旋 (RotateR)RotateR(parent->_right);// 然后对 parent 进行左单旋 (RotateL)RotateL(parent);// 根据 subRL 的平衡因子调整旋转后节点的平衡因子if (bf == 0){// 如果 subRL 的平衡因子是 0,旋转后所有节点的平衡因子都设置为 0subR->_bf = 0;subRL->_bf = 0;parent->_bf = 0;}else if (bf == 1){// 如果 subRL 的平衡因子是 1,调整父节点、子节点的平衡因子subR->_bf = 0;subRL->_bf = 0;parent->_bf = -1;}else if (bf == -1){// 如果 subRL 的平衡因子是 -1,调整父节点、子节点的平衡因子subR->_bf = 1;subRL->_bf = 0;parent->_bf = 0;}else{// 处理无效的平衡因子,理应不可能出现assert(false);}
}
相关文章:
如何在AVL树中高效插入并保持平衡:一步步掌握旋转与平衡因子 —— 旋转篇
文章目录 AVL树种旋转的规则右单旋右单旋代码左单旋左单旋代码左右双旋左右单旋的代码右左单旋右左单旋的代码 AVL树种旋转的规则 在AVL树中,旋转是为了保持树的平衡性。AVL树是一种自平衡的二叉搜索树,它要求每个节点的左右子树的高度差不能超过1。当插…...
C++Primer学习(7.1 定义抽象数据类型)
类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是种依赖于接口(interface)和实现(implementation)分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。 封…...
Vue 3 Diff 算法深度解析:与 Vue 2 双端比对对比
文章目录 1. 核心算法概述1.1 Vue 2 双端比对算法1.2 Vue 3 快速 Diff 算法 2. 算法复杂度分析2.1 时间复杂度对比2.2 空间复杂度对比 3. 核心实现解析3.1 Vue 2 双端比对代码3.2 Vue 3 快速 Diff 代码 4. 性能优化分析4.1 性能测试数据4.2 内存使用对比 5. 使用场景分析5.1 Vu…...
启动桌面Docker提示虚拟服务未启动
在启动 Docker Desktop 时,可能会遇到以下提示: Docker Desktop - Virtual Machine Platform not enabled Virtual Machine Platform not enabled该错误通常是由于 Windows 未启用 “Virtual Machine Platform” 功能导致的,这是运行 Docker…...
【SpringBoot】实现登录功能
在上一篇博客中,我们讲解了注册页面的实现。在此基础上会跳转到登录页面,今天给大家带来的是使用 SpringBoot,MyBatis,Html,CSS,JavaScript,前后端交互实现一个登录功能。 目录 一、效果 二、…...
DataWhale 速通AI编程开发:(进阶篇)第3章 提示词(Prompts)配置项
学习网址:Datawhale-学用 AI,从此开始 3.1 Roo Code提示词配置了什么 众所周知,提示词(Prompt)是用户向大语言模型输入的一段文本,用于指导大语言模型生成符合用户要求的输出。在ai编程领域更是如此,提示…...
VUE中VNode(虚拟节点)是个啥?
用 JavaScript 生成 Virtual DOM(VNode) 在 Vue 中,Virtual DOM(虚拟 DOM)是一个用 JavaScript 对象表示真实 DOM 结构的抽象层。通过这种方式,Vue 可以通过比较 Virtual DOM 与真实 DOM 的差异来最小化更…...
力扣:3. 无重复字符的最长子串(滑动窗口)
3. 无重复字符的最长子串 - 力扣(LeetCode)3. 无重复字符的最长子串 - 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1:输入: s "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc"…...
注解+AOP实现权限控制
注解与AOP实战:实现权限控制 在现代Java开发中,注解(Annotation)和面向切面编程(AOP)是两种强大的技术,它们能够帮助我们实现代码的解耦,提高代码的可读性和可维护性。本文将通过一…...
2.5 python接口编程
在现代软件开发的复杂生态系统中,不同系统、模块之间的交互协作至关重要。接口编程作为一种关键机制,定义了组件之间的通信规范与交互方式。Python 凭借其卓越的灵活性、丰富的库资源以及简洁易读的语法,在接口编程领域占据了重要地位&#x…...
睡不着运动锻炼贴士
在快节奏的现代生活中,失眠似乎已成为许多人的“夜间伴侣”。夜晚辗转反侧,白天精神不振,这样的恶性循环让许多人苦不堪言。其实,除了调整作息和饮食习惯,适当的运动也是改善睡眠的一剂良药。今天,就让我们…...
【Python入门】一篇掌握Python中的字典(创建、访问、修改、字典方法)【详细版】
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《Python/PyTorch极简课》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…...
深入理解 HTML 表单与输入
在网页开发的广袤领域中,HTML 表单如同搭建用户与服务器沟通桥梁的基石。它是收集用户输入信息的关键渠道,承载着交互的重任。今天,就让我们一同深入探索 HTML 表单与输入的奥秘。 HTML 表单在文档中划定出一片独特的区域,这片…...
宝塔docker切换存储目录
1、 停止 Docker 服务 sudo systemctl stop docker2、迁移 Docker 数据目录 sudo mkdir -p /newpath/docker sudo rsync -avz /var/lib/docker/ /newpath/docker/3、修改 Docker 配置文件 vi /etc/docker/daemon.json 内容 {"data-root": "/newpath/docker&q…...
IPoIB驱动中RSS与TSS技术的深度解析:多队列机制与性能优化
在高速网络通信中,IP over InfiniBand(IPoIB) 是实现低延迟、高吞吐的关键技术之一。为了充分发挥多核处理器的性能潜力,IPoIB驱动通过 接收侧扩展(RSS) 和 发送侧扩展(TSS) 技术,实现了数据包处理的多队列并行化。本文结合源码实现与性能优化策略,深入解析其核心机制…...
目前人工智能的发展,判断10年、20年后的人工智能发展的主要方向,或者带动的主要产业
根据2025年的最新行业研究和技术演进趋势,结合历史发展轨迹,未来10-20年人工智能发展的主要方向及带动的产业将呈现以下六大核心趋势: 一、算力革命与底层架构优化 核心地位:算力将成为类似“新能源电池”的基础设施,…...
DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?
当DeepSeek答非所问,应该如何准确的表达我们的诉求?不同使用场景如何向DeepSeek发问?是否有指令公式? 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…...
并发编程面试题二
1、java线程常见的基本状态有哪些,这些状态分别是做什么的 (1)创建(New):new Thread(),生成线程对象。 (2)就绪(Runnable):当调用线程对象的sta…...
【NLP】 8. 处理常见词(Stopwords)的不同策略
处理常见词(Stopwords)的不同策略 在自然语言处理 (NLP) 和信息检索 (IR) 任务中,常见词(Stopwords) 是指在文本中频繁出现但通常对主要任务贡献较小的词,例如 “the”、“is”、“in”、“and” 等。这些…...
【Java基础】java中的lambda表达式
Java Lambda表达式深度解析:语法、简化规则与实战 前言 Java 8的Lambda表达式通过简化匿名内部类和引入函数式编程,极大提升了代码的简洁性和可读性。 一、Lambda表达式的核心语法 Lambda表达式由参数列表、->符号和表达式主体组成,其基…...
【RS】OneRec快手-生成式推荐模型
note 本文提出了一种名为 OneRec 的统一生成式推荐框架,旨在替代传统的多阶段排序策略,通过一个端到端的生成模型直接生成推荐结果。OneRec 的主要贡献包括: 编码器-解码器结构:采用稀疏混合专家(MoE)架构…...
DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)
视频讲解: DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码) 代码仓库:GitHub - LitchiCheng/DRL-learning: 深度强化学习 2048游戏介绍,引用维基百科 《2048》在44的网格上进行。…...
练习题:87
目录 Python题目 题目 题目分析 代码实现 代码解释 列表推导式部分: 变量赋值和输出: 运行思路 结束语 Python题目 题目 使用列表推导式生成一个包含 1 到 100 中所有偶数的列表。 题目分析 本题要求使用 Python 的列表推导式生成一个包含 …...
二叉树的层序遍历(102)
102. 二叉树的层序遍历 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
NVMe集群:加速数据处理
随着大数据和云计算的快速发展,企业面临着前所未有的数据处理挑战。传统的存储技术和架构已经难以满足现代应用对高性能和低延迟的需求。在这种背景下,NVMe(Non-Volatile Memory Express)集群应运而生,它以其卓越的性能…...
JUC并发编程:共享模型之管程
一、共享带来的问题 (1)Java的体现 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? (2)问题分析 以上的结果可能是正数、负数、零。为什么呢…...
Java构造方法详解:从入门到实战
目录 一、什么是构造方法? 二、构造方法的作用 三、构造方法分类与使用 1. 默认构造方法 2. 有参构造方法 3. 构造方法重载 四、注意事项(避坑指南) 五、经典面试题解析 六、实战应用场景 七、总结 一、什么是构造方法? …...
Uniapp 字体加载问题(文件本地存储)
项目场景: 在最近公司开发一款小程序,但是小程序的文字需要用艺术字,就是那种不能用切图绕开的那种! 问题描述 我们在使用uni.loadfontface Api请求数据字体文件的时候总是会报错,就是那种网上也找不到解决方法的那种…...
HTML 新手入门:从零基础到搭建第一个静态页面(一)
开启 HTML 学习之旅 在互联网的广袤世界中,网页是我们与信息交互的主要窗口。而 HTML,作为构建网页的基石,就像是搭建房屋的砖块,是网页开发中不可或缺的基础。无论你是对网页开发充满好奇的小白,还是渴望系统学习前端…...
使用multiprocessing实现进程间共享内存
在 Python 中,可以使用多种方法来实现几个进程之间的通信。 简单消息传递:使用 multiprocessing.Queue 或 multiprocessing.Pipe。 共享简单数据:使用 multiprocessing.Value 或 multiprocessing.Array。 共享复杂数据:使用 multiprocessing.Manager。 进程间信号控制:使用…...
在IDEA中连接达梦数据库:详细配置指南
达梦数据库(DM Database)作为国产关系型数据库的代表,广泛应用于企业级系统开发。本文将详细介绍如何在IntelliJ IDEA中配置并连接达梦数据库,助力开发者高效完成数据库开发工作。 准备工作 1. 下载达梦JDBC驱动 访问达梦官方资…...
docker无法正常拉取镜像问题的解决
目录 1.前言 2.解决方案 1.前言 安装docker后拉取镜像,遇见了如下问题: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded whil…...
如何在保持安全/合规的同时更快地构建应用程序:DevOps 指南
随着敏捷思维方式的兴起,开发和 DevOps 团队都面临着持续的压力,他们需要以迭代方式缩短发布周期并加快部署速度,以满足不断增长的客户期望。随着这种对速度的追求越来越强烈,维护安全性和合规性标准的复杂性也随之增加。 当今 D…...
SQL Server查询优化
最常用,最有效的数据库优化方式 查询语句层面 避免全表扫描 使用索引:确保查询条件中的字段有索引。例如,查询语句 SELECT * FROM users WHERE age > 20,若 age 字段有索引,数据库会利用索引快速定位符合条件的记…...
iOS底层原理系列04-并发编程
在移动应用开发中,流畅的用户体验至关重要,而并发编程是实现这一目标的关键技术。本文将深入探讨iOS平台上的并发编程和多线程架构,帮助你构建高性能、响应迅速的应用程序。 1. iOS线程调度机制 1.1 线程本质和iOS线程调度机制 线程是操作…...
企业数字化转型数据治理解决方案(119页PPT)(文末有下载方式)
资料解读:企业数字化转型数据治理解决方案 详细资料请看本解读文章的最后内容。 在当今数字化时代,数据已经成为企业最宝贵的资产之一。然而,随着数据量的激增和数据来源的多样化,如何有效管理和利用这些数据成为了企业面临的一…...
git报错:“fatal:refusing to merge unrelated histories“
新建仓库,克隆本地项目到新仓库,首次同步本地已提交的代码到远程时,报错:"fatal:refusing to merge unrelated histories" 。 报错意思是:致命的:拒绝合并无关的历史。 一、问题背景ÿ…...
Jmeter下载及环境配置
Jmeter下载及环境配置 java环境变量配置配置jdk环境变量检查是否配置成功JMeter下载 java环境变量配置 访问地址: https://www.oracle.com/cn/java/technologies/downloads/ 注意:需要自己注册账号 下载完成,解压后的目录为: …...
K8S学习之基础二十四:k8s的持久化存储之pv和pvc
K8S的存储之pv和pvc 在 Kubernetes (k8s) 中,持久化存储是通过 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来实现的。PVC 是用户对存储资源的请求,而 PV 是集群中的实际存储资源。PVC 和 PV 的关系类似于 Pod 和 Node 的关系。 Persisten…...
1.5、Java构造方法重载
构造方法重载的实现 (1)定义多个构造方法 class Person {private String name;private int age;// 无参构造方法public Person() {this.name "Unknown";this.age 0;}// 带一个参数的构造方法public Person(String name) {this.name name;…...
领域驱动设计(DDD)技术分享:从三层架构到DDD的进化之旅
一、开篇话:我们为什么要聊DDD? 如果你像我一样有着Java开发背景,那Spring的三层架构可能是你的老朋友了。Controller-Service-DAO这种模式简直就像我们编程的"家常便饭"。但是,随着业务越来越复杂,你是否也…...
LeetCode - #227 基于 Swift 实现基本计算器
摘要 在这篇文章中,我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 、-、* 和 / 的数学表达式,并且遵循运算符的优先级规则。整数除法仅保留整数部分,不能使用 eval() 这样的内置解析方法。 描述 给你一个字符串表…...
Elasticsearch Java High Level Client [7.17] 使用
es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。 注意es服务端的版本需要与client的版本对齐,否则返回数据可…...
[多线程]基于环形队列(RingQueue)的生产者-消费者模型的实现
标题:[多线程]基于环形队列(RingQueue)的生产者-消费者模型 水墨不写bug 一、模型实现 接下来我们要实现一个基于环形队列(RingQueue)的生产者-消费者模型。该模型使用信号量和互斥锁来保证生产者和消费者之间的同步与…...
HAL库STM32常用外设—— CAN通信(一)
文章目录 一、CAN是什么?1.1 CAN应用场景1.2 CAN通信优势 二、CAN基础知识介绍2.1 CAN总线结构2.2 CAN总线特点2.2.1 CAN总线的数据传输特点2.2.2 位时序和波特率 2.3 CAN位时序和波特率2.3 CAN物理层2.3.1 CAN 物理层特性2.3.2 CAN 收发器芯片介绍 2.4 CAN协议层2.…...
分页查询的实现
目录 前言 一.问题描述 二.后端实现步骤 2.1配置PageHelper插件 ①导入依赖 ②在application.yml配置文件中添加相关配置 2.2编写一个入门的程序,体验分页过程 2.3定义一个vo,用来收集分页后的所有信息 2.4修改serviceImpl层的代码 2.5动态设…...
Sourcetree——使用.gitignore忽略文件或者文件夹
一、为何需要文件忽略机制? 1.1 为什么要会略? 对于开发者而言,明智地选择忽略某些文件类型,能带来三大核心优势: 仓库纯净性:避免二进制文件、编译产物等污染代码库 安全防护:防止敏感信息&…...
Thinkphp的belongsToMany(多对多) 和 hasManyThrough(远程一对多)的区别是什么?
虽然 belongsToMany(多对多) 和 hasManyThrough(远程一对多) 都会使用 JOIN 查询,但它们的核心区别在于 关联关系的本质不同,具体如下: 1️⃣ belongsToMany(多对多) &a…...
DataWhale 大语言模型 - 大模型技术基础
本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的核心技术。并且,课程…...
Docker+Flask 实战:打造高并发微服务架构
DockerFlask 实战:打造高并发微服务架构 今天我们要深入探讨一个非常热门且实用的主题:基于 Docker 部署 Python Flask 应用。Docker 作为当下最流行的容器化技术,已经广泛应用于各种开发和部署场景,尤其是在微服务架构中。而 Fl…...