[Collection与数据结构] B树与B+树
🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (93平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482
🐰RabbitMQ(97平均质量分) https://blog.csdn.net/2301_80050796/category_12792900.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
目录
- 1. 常见的基本搜索结构
- 2. B树的概念
- 3. B树的插入分析
- 4. B树的插入实现
- 4.1 B树的结点设计
- 4.2 插入key的过程
- 4.4 B树的性能分析
- 4.5 B树的删除
- 5. B+树和B*树
- 5.1 B+树
- 5.2 B*树
1. 常见的基本搜索结构
以上的结构适合用于数量不是很大的情况,如果数量非常巨大,一次性无法加载到内存中,使用上述结构就不是很方便,比如: 使用平衡树搜索一个大文件.
上面方法其实只在内存中保存了每一项数据信息中需要查询的字段以及数据在磁盘中的位置,整体的数据实际也在磁盘中.
缺陷:
- 树的高度比较高,查找的时候最差情况之下要比较树的高度次.
- 数据量如果特别大的时候,树的结点可能无法一次性加载到内存中,需要多次硬盘IO,这时候就会拖慢查找的速度.
那如何提高对数据访问的速度呢? - 提高IO的速度
- 降低树的高度,即使用多叉平衡树.
2. B树的概念
B树是一种平衡的多叉树,称为B树(有些地方可能写的是B-树,注意不要读作"B减数").一棵M阶(M>2)的B树,是一棵平衡的M路搜索平衡搜索树,可以是空树或者满足一下的性质:
- 根结点至少有两个孩子
- 每个非根结点至少有M/2-1(向上取整)个关键字,至多有M-1个关键字,并且以升序的方式排列.
- 每个非根节点至少有M/2(向上取整)个孩子,至多有M个孩子.
- 孩子结点永远比关键字多一个.
- key[i]和key[i+1]之间的孩子结点的值介于key[i],key[i+1]之间.
- 所有的叶子结点都在同一层.
非根节点中至少有M/2-1(向上取整)个关键字和M/2(向上取整)个孩子是因为在每次节点满了之后都会拷走一半,这和节点的分裂有关,我们后续介绍.
3. B树的插入分析
为了简单起见,假设M=3,即是一棵三叉树,每个节点中保存两个数据,两个数据可以将区间分为三个部分,因此结点应该有三个孩子,为了后续实现简单起见,结点的结构如下.上一层存储的书该结点的数据,下一层存储的是孩子结点的地址.
我们之前规定的是3叉树,这里之所以要把4叉树当做3叉树来看待是因为数据满了之后,需要先进行插入再进行分裂,如果数据只有两个存储空间的话,新数据无法插入结点,也就无法正常进行分裂.下面我们来解释一下结点的分裂:
在我们插入的过程当中,有可能结点是需要分裂的.
前提是:
当前这棵树是一个M叉树,当一个关键字插入之后,关键字数目>M-1就要对结点进行拆分.拆分的规则是,把中间的元素提出来,放到父节点上(如果分裂的是根结点,则父节点不存在,需要新建一个结点),中间元素左边的的元素单独构成一个结点(保留在原来的结点中),中间元素右边的元素单独构成一个结点(这个结点一半不存在,需要新建).
比如我们使用53,139,75,49,145,36,101构建B树的过程如下:
这里我们发现,B树的分裂是横向的分裂,新老结点在同一层,也就是不会使得树的高度增加,正是因为结点的横向分裂,所以B树才是天然平衡的.只有在分裂根节点的时候,高度才会增加.
注意在对根节点分裂的时候,139的两个孩子结点也要跟着139这个结点一起复制过来.
插入过程总结:
- 如果树为空,直接插入新结点中,该结点为树的根节点.
- 树非空,找待插入元素在树中的位置(注意:找到插入结点的位置一定在叶子结点上)
- 树中的key唯一,即该元素已经存在的时候则不插入.
- 按照插入顺序的思想将该元素插入到找到的结点中
- 检测该结点是否满足B树的性质: 即该结点中的元素个数是否<=M-1.
- 如果插入结点后结点不满足B树的性质,需要对该结点进行分裂:
- 申请新的结点
- 找到该结点的中间位置
- 将该结点的中间位置右侧的元素以及其孩子搬移到新结点中.
- 将中间位置元素以往该结点的双亲节点中插入.之后调整树的连接方式,把分裂出去的数据的孩子一起调整走.
- 如果向上分裂已经到了根结点的位置,插入结束.
- 如果更节点在插入之后也是满的,则要继续重复上述步骤分裂根节点.
4. B树的插入实现
4.1 B树的结点设计
结点需要包含这几部分:
- 一个是存储数据的数据域
- 一个是存储孩子结点的地址域
- 为了方便分裂中中间元素向上插入,我们还要记录当前结点的双亲节点.
- 记录有效数据的size.
- 最后在给构造方法的时候注意要多给一个数据域和指针域.
public class BTreeNode {public int[] keys;//存储数据public BTreeNode[] subs;//存储孩子结点public BTreeNode parents;//存储双亲public int size;//有效数据个数public BTreeNode(int M){//M叉树this.keys = new int[M];//多给一个位置this.subs = new BTreeNode[M+1];this.size = 0;}
}
4.2 插入key的过程
- 首先判断该树是否是一棵空树,如果是空树,则需要新建一棵树,并让根节点数据域的第一个元素为key;
- 之后寻找该树中是否存在该数据,如果存在,直接返回,如果不存在,则继续下一步的插入逻辑
- 在最终找到的叶子结点中进行数据的插入
- 看看叶子结点是否为满
- 如果满了,需要进行下一步的分裂操作.
我们在判断结点中是否存在指定的值的时候,如果直接返回一个结点,我们无法判断直接判断这个节点返回的是未找到数据最终到达的叶子结点还是找到数据的结点,所以我们必须通过一个Integer来标记这个数据是否真的存在.我们定义一种数据类型叫做Pair,前面存放结点,后面存放整形以判断这个值是否存在.
//键值对
public class Pair <K,V>{public K key;public V val;public Pair(K key, V val) {this.key = key;this.val = val;}
}
插入逻辑
public class Insert {public BTreeNode root;//定义根节点public final int M = 3;//定义的是一个三叉树public boolean insert(int key){//查看root是否为空if (root == null){root = new BTreeNode(M);root.keys[0] = key;root.size = 1;return true;}//接下来寻找元素在树中是否存在Pair<BTreeNode,Integer> pair = find(key);//如果返回的不是-1,证明是存在的if (pair.val != -1){return false;}BTreeNode cur = pair.key;//拿到当前结点之后进行数据插入int index = cur.size-1;for (;index > 0;index--){if (cur.keys[index] > key){cur.keys[index+1] = cur.keys[index];} else if (cur.keys[index] < key) {break;}}cur.keys[index+1] = key;cur.size++;//之后查看是否需要分裂节点if (cur.size < M){return true;//不需要分裂,直接返回}else {split(cur);//不满足B树性质,需要分裂return true;}}/*** 寻找key在树中是否存在* @param key 需要寻找的key* @return 返回键值对*/private Pair<BTreeNode,Integer> find(int key){BTreeNode cur = root;BTreeNode parent = null;while (cur != null){//在整棵树中遍历int i = 0;while (i != cur.size){//在当前结点中遍历if (cur.keys[i] == key){return new Pair<>(cur,cur.keys[i]);}else if (cur.keys[i] < key){i++;}else {break;}}parent = cur;//如果最后没有找到,parent记录的是叶子结点cur = cur.subs[i];//如果最后没有找到,这个结点记录的是null}//走到了最后证明没有找到return new Pair<>(parent,-1);}/*** 分裂当前结点* @param cur 需要分裂的结点*/private void split(BTreeNode cur){BTreeNode newNode = new BTreeNode(M);//保存中间数据右边数据的结点BTreeNode parent = cur.parents;//记录该结点的父节点,把中间的数据提到父节点上去int mid = cur.size/2;int j = 0;int i = mid+1;for (;i < cur.size;i++){newNode.keys[j] = cur.keys[i];//数据复制走newNode.subs[j] = cur.subs[i];//孩子一起复制走//如果孩子不为空,就把孩子的父亲改成newNodeif (newNode.subs[j] != null){newNode.subs[j].parents = newNode;}j++;}//孩子还需要再复制一次newNode.keys[j] = cur.keys[i];//数据复制走newNode.subs[j] = cur.subs[i];//孩子一起复制走//如果孩子不为空,就把孩子的父亲改成newNodeif (newNode.subs[j] != null){newNode.subs[j].parents = newNode;}//更改newNode的size和原结点的sizenewNode.size = j;cur.size = cur.size-j-1;//包括复制走的数据和提到父节点上的数据if (cur.parents == null){//如果该结点是根结点root = new BTreeNode(M);root.keys[0] = cur.keys[mid];root.subs[0] = cur;cur.parents = root;root.subs[1] = newNode;newNode.parents = root;root.size = 1;return;}//如果该结点不是根结点newNode.parents = parent;int end = parent.size-1;int midVal = cur.keys[mid];//进行数据的插入for (;end > 0;end--){if (parent.keys[end] > midVal){parent.keys[end+1] = parent.keys[end];parent.subs[end+2] = parent.subs[end+1];//把数据和孩子都复制过去}else if (parent.keys[end] < midVal){break;}}parent.keys[end+1] = midVal;//把中间值移动过来parent.subs[end+2] = newNode;//把新节点连接到root上parent.size++;if (parent.size >= M){//如果根结点满了,继续分裂split(parent);}}
}
4.4 B树的性能分析
对于一棵结点为N度为M的B树,查找和插入需要logM-1N到logM/2N次比较,证明如下:对于度为M的B树,每个节点的子节点个数为M/2到(M-1)之间,因此树的高度应该要在logM-1N和logM/2N之间,在定位到该节点之后,每个节点中的数据个数一般非常有限,再采用二分查找的方式可以很快定位到该元素,时间复杂度可以近似看做O(1).
B-树的效率是很高的,对于N = 62*1000000000个节点,如果度M为1024,则
logM/2N<= 4,即在620亿个元素中,如果这棵树的度为1024,则需要小于4次即可定位到该节点,然后利用二分查找可以快速定位到该元素,大大减少了读取磁盘的次数.
4.5 B树的删除
参考<<算法导论>>或者<<数据结构-严蔚敏版>>.
5. B+树和B*树
5.1 B+树
B+树为B树的升级版,也是一种多路搜索树,它通常被用于数据库中建立索引以加快查找的速度.我们在MySQL的索引章节也有所介绍.
B+树的性质如下:
- 非叶子结点的子树指针域的个数和关键字的个数相同.
- 非叶子结点的子树指针p[i],指向关键字属于[k[i],k[i+1])的子树.也就是它的孩子中一定存在一个元素k[i].
- 为所有叶子结点增加一个链指针.把所有的叶子结点都串联起来,都指向自己的下一个兄弟节点,是一个链表,且链表中的节点数据都是有序的.
- 所有的真正的数据都在叶子结点出现.非叶子结点的关键字不是实际的数据记录,而是一种索引信息,用来引导搜索路径.
- 查找的次数相对于B树来说更加稳定,因为不管数据是多少,每次都要遍历到叶子结点.
B+树的搜索方式与B树基本相同,区别是B+树只有到达叶子结点才会命中数据,而B树有可能在非叶子结点就可以命中.
下面是B+树的分裂方式:
首先是叶子结点分裂:
- 当一个结点满的时候,分配一个新的结点,并将原结点中1/2的数据(较大的那1/2)复制到新的结点
- 原结点的下一个兄弟节点的指针指向新的结点.
- 更新父节点的指针信息,使得父节点正确指向分裂之后的两个结点.
其次是非叶子结点的分裂:
- 当为叶子结点插入数据的操作导致某个非叶子结点满,就需要对非叶子结点进行分裂.
- 对于非叶子结点,同样选择中间的位置进行分裂,它左边的键值和指针留在原节点,右边的键值和指针移动到新节点.
- 更新父节点的指针信息,使得父节点正确指向分裂之后的两个结点.
- 如果父节点满,则继续上述的步骤,直到不再产生分裂或者是到根节点
- 如果根节点发生了分裂,则创建一个新的根节点,将原根节点分裂后的两个节点作为新根节点的子节点,将分裂点键值放入新根节点.
5.2 B*树
B*树是B+树的变形,在B+树的非根和非叶子结点在增加了指向兄弟节点的指针.
分裂方式如下:
当一个结点满的时候,如果他的下一个兄弟节点未满,那么将一部分数据移动到他的兄弟节点中,再在原结点中插入关键字,最后修改父节点中兄弟节点的关键字(兄弟节点的数据发生了改变).如果兄弟节点也满了,则需要进行分裂,这里和B+树类似,不再赘述,唯一不同的是在非叶子结点分裂的时候,也需要修改兄弟节点指针的指向.
相关文章:
[Collection与数据结构] B树与B+树
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
在数字化浪潮中,数据呈爆发式增长,实时数据处理的重要性愈发凸显。从金融交易的实时风险监控,到电商平台的用户行为分析,各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架,在这一领域崭露头…...
【AIGC专栏】AI在自然语言中的应用场景
ChatGPT出来以后,突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类,虽然这是一句夸大其词的话,但是经过未来几十年的迭代,ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说,ChatGPT毫无疑问在当前…...
神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...
数科OFD证照生成原理剖析与平替方案实现
数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD(Open Fixed-layout Document)是一种基于XML的固定版式文档格式,广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面: OFD文…...
未来无线技术的发展方向
未来无线技术的发展趋势呈现出多样化、融合化的特点,涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升:Wi-Fi 技术迭代加快,如 Wi-Fi7 理论峰值速率达 46Gbps&#…...
验证二叉搜索数(98)
98. 验证二叉搜索树 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
Day51:type()函数
在 Python 中,type() 是一个内置函数,用于返回对象的类型。它可以用于检查变量的类型,也可以用于动态创建新的类型。今天,我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...
DeepSeek-R1大模型本地部署及简单测试
目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世,这是一款免费、开源且隐私优…...
【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...
AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库
一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...
灵芝黄金基因组注释-文献精读109
The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝(Ganoderma lingzhi)的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…...
【Proteus仿真】【51单片机】多功能计算器系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键 3、加减乘除,开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含:程序&…...
MySQL数据类型转换应注意什么?
文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时,需要注意以下几个关键点ÿ…...
【LLM-agent】(task1)简单客服和阅卷智能体
note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:Role (角色) -> Profile(角色…...
【Linux】使用管道实现一个简易版本的进程池
文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...
新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
生成式人工智能的发展既带来了有益的生产力转型机会,也提供了被恶意利用的机会。 最近,Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT,是人工智能用于非法活动的新前沿,可以被用于网…...
力扣017_最小覆盖字串题解----C++
题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动…...
C++:函数
在之前的博客中已经讲过了C语言中的函数概念了,重复的内容就不赘述了。C中的函数在C语言的基础上还有些补充,在这里说明一下。 一、引用 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变…...
linux asio网络编程理论及实现
最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…...
第一篇:数据库基础与概念
第一篇:数据库基础与概念 目标读者: 没有接触过数据库的初学者。 内容概述: 在本篇文章中,我们将从零开始,详细介绍数据库的基本概念、常见的数据库管理系统(DBMS)以及数据库设计的基础知识…...
从理论到实践:Django 业务日志配置与优化指南
在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…...
基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)
一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…...
常用的 ASCII 码表字符
ASCII(美国信息交换标准代码,American Standard Code for Information Interchange)是一种字符编码标准,用于表示英文字符、数字、标点符号以及一些控制字符。ASCII 码表包含 128 个字符,每个字符用 7 位二进制数表示&…...
AI大模型开发原理篇-8:Transformer模型
近几年人工智能之所以能迅猛发展,主要是靠2个核心思想:注意力机制Attention Mechanism 和 Transformer模型。本次来浅谈下Transformer模型。 重要性 Transformer模型在自然语言处理领域具有极其重要的地位,为NLP带来了革命性的突破。可以…...
Golang 并发机制-2:Golang Goroutine 和竞争条件
在今天的软件开发中,我们正在使用并发的概念,它允许一次执行多个任务。在Go编程中,理解Go例程是至关重要的。本文试图详细解释什么是例程,它们有多轻,通过简单地使用“go”关键字创建它们,以及可能出现的竞…...
NVLink 拓扑、DGX 硬件渲染图
文章目录 一个 server 固定 8 个GPUP100(4个NVL)V100(6个NVL)A100(12个NVL)H100(18个NVL)【DGX-2 :2018年发布NVSwitch,实现full-mesh】【NVLink 拓扑&#x…...
Python XML 解析
Python XML 解析 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。Python 作为一种功能强大的编程语言,拥有多种解析 XML 的库,如 xml.etree.ElementTree 和 lxml。本文将详细介绍 Python 中 XML 解析的方法、技巧和注意事项,帮助您更好地掌握 XML 数据的…...
java求职学习day22
MySQL 基础 &SQL 入门 1. 数据库的基本概念 1.1 什么是数据库 1. 数据库 (DataBase) 就是 存储 和 管理 数据的仓库 2. 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 1.2 为什么使用数据库 数据存储方式的比较 通过上面的比较 , 我们可以看出 , 使…...
stm32教程:EXTI外部中断应用
早上好啊大佬们,上一期我们讲了EXTI外部中断的原理以及基础代码的书写,这一期就来尝试一下用它来写一些有实际效能的工程吧。 这一期里,我用两个案例代码来让大家感受一下外部中断的作用和使用价值。 旋转编码器计数 整体思路讲解 这里&…...
OVS-DPDK
dpdk介绍及应用 DPDK介绍 DPDK(Data Plane Development Kit)是一组快速处理数据包的开发平台及接口。有intel主导开发,主要基于Linux系统,用于快速数据包处理的函 数库与驱动集合,可以极大提高数据处理性能和吞吐量&…...
快速分析LabVIEW主要特征进行判断
在LabVIEW中,快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征,从而帮助开发者在编写和优化程序时做出及时的判断,避免不必要的错误。 数据流和并行性分析 LabVIEW的图形…...
MySQL数据库(二)
一 DDL (一 数据库操作 1 查询-数据库(所有/当前) 1 所有数据库: show databases; 2 查询当前数据库: select database(); 2 创建-数据库 可以定义数据库的编码方式 create database if not exists ax1; create database ax2…...
Python 梯度下降法(五):Adam Optimize
文章目录 Python 梯度下降法(五):Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 Python 梯度下降法(五)&am…...
表格结构标签
<!-- thead表示表格的头部 tbody表示表格的主体 --> <thead></thead> <tbody></tbody> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…...
gcc和g++的区别以及明明函数有定义为何链接找不到
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Git进阶之旅:tag 标签 IDEA 整合 Git
第一章:tag 标签远程管理 git 标签 tag 管理: 标签有两种: 轻量级标签(lightweight)带有附注标签(annotated) git tag 标签名:创建一个标签git tag 标签名 -m 附注内容 :创建一个附注标签git tag -d 标签名…...
计算机网络一点事(24)
TCP可靠传输,流量控制 可靠传输:每字节对应一个序号 累计确认:收到ack则正确接收 返回ack推迟确认(不超过0.5s) 两种ack:专门确认(只有首部无数据) 捎带确认(带数据…...
集合的奇妙世界:Python集合的经典、避坑与实战
集合的奇妙世界:Python集合的经典、避坑与实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南,旨在帮助读者从基础入门到项目实战,全面提升编程能力。文章结构由 5 个版块组成,内容层层递进&#x…...
ubuntu20.04.6下运行VLC-Qt例子simple-player
下载examples-master.zip(https://github.com/vlc-qt/examples),编译运行simple-player 参考链接: https://blog.csdn.net/szn1316159505/article/details/143743735 本文运行环境 Qt 5.15.2 Qt creator 5.0.2 主要步骤…...
Node.js MySQL:深度解析与最佳实践
Node.js MySQL:深度解析与最佳实践 引言 Node.js作为一种流行的JavaScript运行时环境,以其轻量级、高性能和事件驱动模型受到开发者的青睐。MySQL则是一款功能强大的关系型数据库管理系统,广泛应用于各种规模的应用程序中。本文将深入探讨Node.js与MySQL的集成,分析其优势…...
Linux网络 | 网络层IP报文解析、认识网段划分与IP地址
前言:本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外, 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说, 开始我们的学习吧!! ps:本节正式进入网络层喽, 友友们…...
项目测试之Postman
文章目录 基础实战进行批量测试并输出报告 基础 实战 进行批量测试并输出报告 参考: https://blog.csdn.net/tyh_keephunger/article/details/109205191 概述 Newman是什么?Newman是Postman的命令行工具,用于执行接口测试集合。操作过程…...
C++——list的了解和使用
目录 引言 forward_list与list 标准库中的list 一、list的常用接口 1.list的迭代器 2.list的初始化 3.list的容量操作 4.list的访问操作 5.list的修改操作 6.list的其他操作 二、list与vector的对比 结束语 引言 本篇博客要介绍的是STL中的list。 求点赞收藏评论…...
MySQL基本架构SQL语句在数据库框架中的执行流程数据库的三范式
MySQL基本架构图: MySQL主要分为Server层和存储引擎层 Server层: 连接器:连接客户端,获取权限,管理连接 查询缓存(可选):在执行查询语句之前会先到查询缓存中查看是否执行过这条语…...
(leetcode 213 打家劫舍ii)
代码随想录: 将一个线性数组换成两个线性数组(去掉头,去掉尾) 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…...
如何用KushoAI提升API自动化测试效率:AI驱动的革命
在现代软件开发中,API测试已经成为确保系统稳定性和可靠性的关键。然而,传统的API测试往往依赖手动编写测试用例,每次修改API后都需要重新进行测试,这不仅耗时费力,还容易因人为疏忽而出现问题。想象一下,你是否曾因API在生产环境中出现微小错误而彻夜未眠?每次修改API后…...
docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)
一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式: 方式一: -)在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -)导出 # 导出镜像到…...
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解决方法
在使用DBeaver连接MySQL数据库时,如果遇到“Access denied for user ip (using password: YES)”的错误提示,说明用户认证失败。此问题通常与数据库用户权限、配置错误或网络设置有关。本文将详细介绍解决此问题的步骤。 一、检查用户名和密码 首先&am…...
VirtualBox:跨磁盘导入已存的vdi磁盘文件顺便测试冷迁移
目录 1.背景 2.目的 3.步骤 3.1 安装在移动硬盘上 3.2.接管现有主机磁盘上的虚拟机 3.3接管迁移到移动硬盘的虚拟机 4. 结论 1.背景 电脑重新做了系统,然后找不到virtualbox的启动程序了,另外电脑磁盘由于存储了其他文件已经爆红,无法…...