集成学习 | 集成学习思想:Boosting思想 | XGBoost算法、LightGBM算法

目录

  • 一. XGBoost 算法
    • 1. XGBoost 算法流程
    • 2. XGBoost 算法评价
  • 二. LightGBM 算法
    • 2. LightGBM 算法优势

上一篇文章中,我们了解了Boosting思想的两种算法:Adboost和GBDT;其中对于GBDT算法,存在两种改进,即:

  • XGBoost
  • LightGBM

一. XGBoost 算法

XGBoost是GBDT(梯度提升树)的一个改进版本
    能够更快的、更高效率的训练模型
    X代表的就是eXtreme(极致)

	学习器:
		决策树
		将这些决策树称为”弱学习器“,这些”弱学习器“共同组成了XGboost
	算法思想:
		XGBoost的决策树之间是有先后顺序
		后一棵决策树的生成会考虑前一棵决策树的预测结果,即:将前一棵决策树的偏差考虑在内,也就是更改y值
	数据使用:
		生成每棵决策树使用的是整个数据集

在这里插入图片描述

1. XGBoost 算法流程

  1. 构造初始化常数函数,以及模型跟新
    F 0 ( x ) = f 0 ( x ) = 0 F_{0}(x)=f_{0}(x)=0 F0(x)=f0(x)=0

    F 1 ( x ) = F 0 ( x ) + f 1 ( x ) F_{1}(x)=F_{0}(x)+f_{1}(x) F1(x)=F0(x)+f1(x)

    F 2 ( x ) = F 1 ( x ) + f 2 ( x ) F_{2}(x)=F_{1}(x)+f_{2}(x) F2(x)=F1(x)+f2(x)

    . . . . . . ...... ......

    F 0 ( x ) = F ( k − 1 ) ( x ) + f k ( x ) F_{0}(x)=F_{(k-1)}(x)+f_{k}(x) F0(x)=F(k1)(x)+fk(x)

    我们的目标为:求出函数 f 1 ( x ) f_{1}(x) f1(x) f 2 ( x ) f_{2}(x) f2(x),…, f k ( x ) f_{k}(x) fk(x)

  2. 定义损失函数
    XGBoost算法的损失函数:在GBDT的基础上增加了正则化项,用于限制模型的复杂度
    o b j = ∑ i = 1 n L ( y i , F i ( k ) ( x ) ) + ∑ i = 1 k Ω ( f i ) o b j=\sum_{i=1}^{n} L\left(y_{i}, F_{i}^{(k)}(x)\right)+\sum_{i=1}^{k} \Omega\left(f_{i}\right) obj=i=1nL(yi,Fi(k)(x))+i=1kΩ(fi)

    公式解释:

    o b j 函数 obj函数 obj函数 为构建 k k k棵树的总损失

    预测误差 + 每棵树复杂度的惩罚项

    对于正则化项,我们做出以下公式优化:
    f k ( x ) = w q ( x ) f_{k}(x)=w_{q(x)} fk(x)=wq(x)
    Ω ( f ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f)=\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Ω(f)=γT+21λj=1Twj2

    公式解释:
    f k ( x ) f_{k}(x) fk(x)可以表示一棵树

    f 是一棵决策树, f k f_{k} fk是第 k k k棵决策树
    x 是一个样本,丢进 f 函数 f函数 f函数中就需要对该样本进行预测
    q ( x ) q(x) q(x) 表示进入的样本x落在哪个叶子节点中
    w q ( x ) w_{q(x)} wq(x) 是叶子节点 q ( x ) q(x) q(x)的值

    先算在哪个叶子节点上,然后根据该叶子节点的值返回

    Ω ( f ) \Omega(f) Ω(f)可以表示一棵树的复杂程度

    T 表示这棵决策树叶子节点的数量:叶子节点越多,决策树越复杂
    w j 2 w_{j}^{2} wj2 表示所有叶子节点值的平方和

    w w w为叶子节点的值
    由于每个弱学习器拟合的都是残差,所以 w w w不能太大
    如果模型企图去拟合离群点,那么 w w w就会变大

    此时,目标函数可以写为
    L k = ∑ i = 1 n L [ y i , F k − 1 ( x ) + f k ( x i ) ] + ∑ j = 1 K Ω ( f j ) L^{k}=\sum_{i=1}^{n} L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right]+\sum_{j=1}^{K} \Omega\left(f_{j}\right) Lk=i=1nL[yi,Fk1(x)+fk(xi)]+j=1KΩ(fj)

    公式推导:

    L k L^{k} Lk

    = ∑ i = 1 n L [ y i , F k − 1 ( x ) + f k ( x i ) ] + ∑ j = 1 K Ω ( f j ) =\sum_{i=1}^{n} L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right]+\sum_{j=1}^{K} \Omega\left(f_{j}\right) =i=1nL[yi,Fk1(x)+fk(xi)]+j=1KΩ(fj)

    = ∑ i = 1 n L [ y i , F k − 1 ( x ) + f k ( x i ) ] + ∑ j = 1 k − 1 Ω ( f j ) + Ω ( f k ) =\sum_{i=1}^{n} L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right]+\sum_{j=1}^{k-1} \Omega\left(f_{j}\right)+\Omega\left(f_{k}\right) =i=1nL[yi,Fk1(x)+fk(xi)]+j=1k1Ω(fj)+Ω(fk)

    = ∑ i = 1 n L [ y i , F k − 1 ( x ) + f k ( x i ) ] + Ω ( f k ) =\sum_{i=1}^{n} L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right]+\Omega\left(f_{k}\right) =i=1nL[yi,Fk1(x)+fk(xi)]+Ω(fk)

即: L k = ∑ i = 1 n L [ y i , F k − 1 ( x ) + f k ( x i ) ] + Ω ( f k ) L^{k}=\sum_{i=1}^{n} L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right]+\Omega\left(f_{k}\right) Lk=i=1nL[yi,Fk1(x)+fk(xi)]+Ω(fk)
3. 二阶展开

一元函数在x0点的泰勒展式:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + … + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + … f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+\frac{f^{\prime \prime}\left(x_{0}\right)}{2 !}\left(x-x_{0}\right)^{2}+\ldots+\frac{f^{(n)}\left(x_{0}\right)}{n !}\left(x-x_{0}\right)^{n}+\ldots f(x)=f(x0)+f(x0)(xx0)+2!f′′(x0)(xx0)2++n!f(n)(x0)(xx0)n+
注意:我们只求至二阶导即可
所以,对于 L [ y i , F k − 1 ( x ) + f k ( x i ) ] L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right] L[yi,Fk1(x)+fk(xi)],可以写为:

L [ y i , F k − 1 ( x ) + f k ( x i ) ] L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right] L[yi,Fk1(x)+fk(xi)]

= L [ y i , F k − 1 ( x ) ] + ∂ F k − 1 L [ y i , F k − 1 ( x ) ] f k ( x i ) + 1 2 ∂ F k − 1 2 L [ y i , F k − 1 ( x ) ] f k 2 ( x i ) =L[y_{i}, F_{k-1}(x)]+\partial_{F_{k-1}}L[y_{i}, F_{k-1}(x)] f_{k}\left(x_{i}\right)+\frac{1}{2} \partial_{F_{k-1}}^{2}L[y_{i}, F_{k-1}(x)] f_{k}^{2}\left(x_{i}\right) =L[yi,Fk1(x)]+Fk1L[yi,Fk1(x)]fk(xi)+21Fk12L[yi,Fk1(x)]fk2(xi)

其中:
g i = ∂ F k − 1 L [ y i , F k − 1 ( x ) ] ,即 L 关于 x 0 的一阶导 g_{i}=\partial_{F_{k-1}}L[y_{i}, F_{k-1}(x)],即L关于x_{0}的一阶导 gi=Fk1L[yi,Fk1(x)],即L关于x0的一阶导
h i = ∂ F k − 1 2 L [ y i , F k − 1 ( x ) ] ,即 L 关于 x 0 的二阶导 h_{i}= \partial_{F_{k-1}}^{2}L[y_{i}, F_{k-1}(x)] ,即L关于x_{0}的二阶导 hi=Fk12L[yi,Fk1(x)],即L关于x0的二阶导

对于 L [ y i , F k − 1 ( x ) + f k ( x i ) ] L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right] L[yi,Fk1(x)+fk(xi)]

x = F k − 1 ( x ) + f k ( x i ) x = F_{k-1}(x)+f_{k}\left(x_{i}\right) x=Fk1(x)+fk(xi)

x 0 = F k − 1 ( x ) x_{0}= F_{k-1}(x) x0=Fk1(x)

x − x 0 = f k ( x i ) x-x_{0} = f_{k}(x_{i}) xx0=fk(xi)

i为样本,所以 g i , h i g_{i},h_{i} gihi是可以计算得到的
也就是说, L [ y i , F k − 1 ( x ) ] L[y_{i}, F_{k-1}(x)] L[yi,Fk1(x)]为常数

即,为了求下一棵树,我需要求每个样本的一阶导,二阶导

因此,我们可以得到:
L [ y i , F k − 1 ( x ) + f k ( x i ) ] = L [ y i , F k − 1 ( x ) ] + g i ∗ f k ( x i ) + 1 2 h i ∗ f k 2 ( x i ) L\left[y_{i}, F_{k-1}(x)+f_{k}\left(x_{i}\right)\right]=L[y_{i}, F_{k-1}(x)]+g_{i} * f_{k}\left(x_{i}\right)+\frac{1}{2} h_{i} * f_{k}^{2}\left(x_{i}\right) L[yi,Fk1(x)+fk(xi)]=L[yi,Fk1(x)]+gifk(xi)+21hifk2(xi)
因为 L [ y i , F k − 1 ( x ) ] L[y_{i}, F_{k-1}(x)] L[yi,Fk1(x)]为常数,所以对于每个样本,可以得到:
L k = ∑ i = 1 n g i ∗ f k ( x i ) + 1 2 h i ∗ f k 2 ( x i ) L^{k}=\sum_{i=1}^{n}g_{i} * f_{k}\left(x_{i}\right)+\frac{1}{2} h_{i} * f_{k}^{2}\left(x_{i}\right) Lk=i=1ngifk(xi)+21hifk2(xi)
L k = ∑ i = 1 n ( g i ∗ w q ( x i ) + 1 2 h i ∗ w q ( x i ) 2 ) + γ T + 1 2 λ ∑ j = 1 T w j 2 L^{k}=\sum_{i=1}^{n}\left(g_{i} * w_{q\left(x_{i}\right)}+\frac{1}{2} h_{i} * w_{q\left(x_{i}\right)}^{2}\right)+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Lk=i=1n(giwq(xi)+21hiwq(xi)2)+γT+21λj=1Twj2

我们认为,对于n个样本,最终会落到T个叶子节点上去
也就是说,对于某一个叶子节点:

g a + g b + g c + . . . . = G j g_{a}+g_{b}+g_{c}+.... = G_{j} ga+gb+gc+....=Gj

同理,也可得到 H j H_{j} Hj

将公式转换为对于每个每个叶子节点求和,我们就可以得到:
L k = ∑ j = 1 T ( G j ∗ w j + 1 2 H j ∗ w j 2 ) + γ T + 1 2 λ ∑ j = 1 T w j 2 L^{k}=\sum_{j=1}^{T}\left(G_{j} * w_{j}+\frac{1}{2} H_{j} * w_{j}^{2}\right)+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} Lk=j=1T(Gjwj+21Hjwj2)+γT+21λj=1Twj2
合并后,最终得到的损失函数为:
L k = ∑ j = 1 T ( G j ∗ w j + 1 2 ( H j + λ ) ∗ w j 2 ) + γ T L^{k}=\sum_{j=1}^{T}\left(G_{j} * w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) * w_{j}^{2}\right)+\gamma T Lk=j=1T(Gjwj+21(Hj+λ)wj2)+γT

  1. 为了使损失函数最小,需要损失函数对于 w j w_{j} wj 求导,并令导数为0,求得最优的w:

     	注意:此时树的结构是确定的,即q函数确定
    

w j ∗ = − G j H j + λ w_{j}^{*}=-\frac{G_{j}}{H_{j}+\lambda} wj=Hj+λGj
即:每个叶子节点值为 w j ∗ w_{j}^{*} wj时,模型最佳

w w w带入,得到最小损失为:
L min ⁡ k = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T L_{\min }^{k}=-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T Lmink=21j=1THj+λGj2+γT

  1. 计算增益

上面,我们在树结构确定时,算出来最小损失
那么,我们现在的问题是:怎么确定树的结构?

对于一次节点分裂,显然损失下降越多,分裂节点越佳

这里我们解释 ∑ j = 1 T G j \sum_{j=1}^{T}G_{j} j=1TGj
假设数据集中共存在10个样本: g 1 , g 2 , . . . , g 10 g_{1},g_{2},...,g_{10} g1g2...g10

将样本1-5落在R叶子节点内
将样本6-10落在L叶子节点内

因此我们可以得到 ∑ j = 1 T G j = G R + G L \sum_{j=1}^{T}G_{j}=G_{R}+G_{L} j=1TGj=GR+GL
同理,可以得到 H R , H L H_{R},H_{L} HRHL

对于分裂前,我们有:
 loss  before  = − 1 2 ( G L + G R ) 2 ( H L + H R ) + λ + γ \text { loss }_{\text {before }}=-\frac{1}{2} \frac{\left(G_{L}+G_{R}\right)^{2}}{\left(H_{L}+H_{R}\right)+\lambda}+\gamma  loss before =21(HL+HR)+λ(GL+GR)2+γ
对于分裂后,我们有:
 loss  a f t e r = − [ 1 2 G L 2 H L + λ + γ ] − [ 1 2 G R 2 H R + λ + γ ] = − 1 2 ( G L 2 H L + λ + G R 2 H R + λ ) + 2 γ \text { loss }_{a f t e r}=-[\frac{1}{2} \frac{G_{L}^{2}}{H_{L}+\lambda } +\gamma] -[\frac{1}{2} \frac{G_{R}^{2}}{H_{R}+\lambda } +\gamma] =-\frac{1}{2}\left(\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}\right)+2 \gamma  loss after=[21HL+λGL2+γ][21HR+λGR2+γ]=21(HL+λGL2+HR+λGR2)+2γ

因此,信息增益为:

计算所有候选分裂点对应的gain
选择gain最大的分裂点进行分裂
如果一个节点的所有候选分裂点都不能带来gain,则该节点不分裂

g a i n = 1 2 ( G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 ( H L + H R ) + λ ) − γ gain=\frac{1}{2}\left(\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{\left(G_{L}+G_{R}\right)^{2}}{\left(H_{L}+H_{R}\right)+\lambda}\right)-\gamma gain=21(HL+λGL2+HR+λGR2(HL+HR)+λ(GL+GR)2)γ

2. XGBoost 算法评价

  • 与决策树不同,XGBoost并不直接使用基尼系数或信息增益这些指标来进行特征选择或分裂点选择,而是计算每个特征的分裂增益(Gain)来选择最佳的最佳的特征和分裂点,从而构建更准确的树模型
  • 分裂增益表示在分裂前后损失函数的减少程度

在计算分裂增益时,有两种方式:

  1. 精确算法:遍历所有特征的所有可能的分裂点,计算gain值,选择最大的 gain值对应的分裂点进行分裂
    如:上述公式推导部分

  2. 近似算法:对于每个特征,只考虑分位点,减少计算复杂度

    	分位点:按照上一轮的预测误差函数的二阶导数值作为权重进行划分
    

在这里插入图片描述

二. LightGBM 算法

LightGBM是由微软开发的boosting集成模型,类似于XGBoost,对GBDT进行了优化和高效实现,原理有一些相似之处;但它的主要优势在于能够处理大规模数据

	在实验中:
		LightGBM 比 XGBoost 快将近10倍
		内存占用率大约为XGBoost的1/6

2. LightGBM 算法优势

	GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次
		如果把整个训练数据一次性装进内存,会明显限制训练数据的大小
		如果不装进内存,反复地读写训练数据又会消耗非常大的时间。

面对大规模工业级数据,传统的GBDT算法无法满足需求。LightGBM的主要目的之一是解决上述大数据量级下的GBDT训练问题,以便在工业实践中支持大规模数据并保证效率

	算法思想:
		LightGBM提出直方图算法:为了减少分裂点的数量

直方图就是把连续的浮点特征离散化为k个整数(也就是分桶bins的思想),比如:

[ 0 , 0.1 ] = > 0 [0,0.1] =>0 [0,0.1]=>0
[ 0.1 , 0.3 ] = > 1 [0.1,0.3] => 1 [0.1,0.3]=>1

这里的思想类似XGBoost的分位点

在这里插入图片描述


感谢阅读🌼
如果喜欢这篇文章,记得点赞👍和转发🔄哦!
有任何想法或问题,欢迎留言交流💬,我们下次见!
本文相关代码存放位置
    【Boosting思想 扩展算法 代码实现

祝愉快🌟!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486984.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLAlchemy操作数据库

数据库是一个网站的基础。 比如 MySQL 、 MongoDB 、 SQLite 、 PostgreSQL 等,这里我们以 MySQL为例进行讲解。 SQLAlchemy 是一个 ORM 框架 我们会以 MySQL SQLAlchemy 组合进行讲解。 在操作数据库操作之前,先确保你已经安装了以下两个插件&#…

阿里云服务器新/老用户优惠价格收费标准(2024最新更新)

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

鸿蒙(HarmonyOS)版Retrofit网络请求框架

注意 从3.0开始,官方已经废弃Java了。鸿蒙最终选择了高效简洁的JS/eTS语言为主要开发语言,即从3.0 Beta开始,鸿蒙将重心主要放在JS类Web式、eTS声明式两大类开发范式,兼容C/C类。Java类API不再演进,但是会持续运营维护…

前台处理:CO主数据之成本中心-<KS01>

一、背景: 前面讲解了成本要素和成本要素组,我们继续介绍成本控制与核算的主数据之成本中心,成本控制分主数据篇和业务篇: 主数据篇主要内容:成本要素、成本中心、订单、作业类型、工作中心; 业务篇主要…

Spring boot2.7整合jetcache方法缓存 设置定时刷新 解决多系统同时操作数据问题

上文 Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作 解决了 缓存更新的问题 但是 现在有个问题 例如 我们 A系统 和 B系统 同时缓存了这一组数据 但是 A系统数据发生了更新 但是 B系统并不知道 其实 也没有特别好的办法同步通知 但可以控…

Git (版本控制,git安装和配置,git代码托管服务,git操作本地远程仓库,分支,idea整合git)【看这一片就够】

目录 一、版本控制介绍 1. 版本控制介绍 2. 版本控制工具 3. git简介 二、git安装与配置 1. 下载git 2. 安装git 2. 配置git 三、git代码托管服务 1. 常见的git代码托管服务 2. 注册码云帐号【这里介绍一种的用法,其它也是一样的操作】 3. 创建远程仓库 …

试试前端自动化测试(基础篇)

众所周知的原因,前端作为一种特殊的 GUI 软件,做自动化测试困难重重。在快速迭代,UI 变动大的业务中,自动化测试想要落地更是男上加男 🐶。 近期的学习过程中,翻阅了众多前端自动化测试相关的文章&#xf…

微信商家转账到零钱:实用指南,涵盖开通、使用与常见问题

商家转账到零钱是什么? 商家转账到零钱功能整合了企业付款到零钱和批量转账到零钱,支持批量对外转账,操作便捷。如果你的应用场景是单付款,体验感和企业付款到零钱基本没差别。 商家转账到零钱的使用场景有哪些? 这…

路由控制过滤策略出口 filter-policy export实验简述(直连路由)

配置过滤策略 filter-policy实验简述(直连路由) filter-policy export可以实现对特定流量的筛选和导出。 实验拓扑图: 实验基础配置: 销售部电脑:192.168.1.100/24/192.168.1.254 通过直连路由引入外部路由 财务部电…

Unity-UGUI系统

UGUI是什么 UGUI是Unity引擎内自带的UI系统官方称之为:Unity Ul 是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案 它是基于Unity游戏对象的UI系统,只能用来做游戏UI功能 不能用于开发Unity编辑器中内置的用户界面 六大基础组件 概述 Canvas EventS…

并发VS并行

参考文章 面试必考的:并发和并行有什么区别? 并发:一个人同时做多件事(射击游戏队友抢装备) 并行:多人同时处理同一件事(射击游戏敌人同时射击对方)

2024年最新阿里云服务器价格表(收费标准报价)

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

存储级内存SCM:PCM对决ReRAM

在22年7月份有一件震惊存储圈的事情,那就是Intel说要放弃Optane产品线,包括PMEM和SSD两个方向都要放弃。存储圈看到听到这个消息也是一脸的茫然。 在Optane产品发布之前,大家针对DRAM和SSD之间的性能gap一直在苦苦找寻合适的产品。SCM存储级内…

Tempo Talents | 创新专业建设方案,赋能高校4+N大数据学科人才培养

数字经济成为国家战略,是新一轮的经济发展引擎,数字人才、复合型人才成为发展的关键和核心要素。各级政府、区域开始以区域产业为导向,培育、聚集产业所需的数智化人才。 高校作为人才培养的重要基地,也发挥着不可或缺的作用。他…

【Java程序设计】【C00373】基于(JavaWeb)Springboot的社区疫情返乡管控系统(有论文)

TOC 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击卡片…

网络七层模型之传输层:理解网络通信的架构(四)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

排序大乱炖

目录 一:插入排序 1.1直接插入排序 1.2希尔排序 二:选择排序 2.1选择排序 2.2堆排序 三:交换排序 3.1冒泡排序 3.2快速排序 3.2.1Hoare版本 3.2.2双指针法 3.2.3非递归 一:插入排序 1.1直接插入排序 直接插入排序…

ESCTF赛题WP

ESCTF_reverse题解 逆吧腻吧babypybabypolyreeasy_rere1你是个好孩子完结撒花 Q_W_Q 逆吧腻吧 下载副本后无壳,直接拖入ida分析分析函数逻辑:ida打开如下:提取出全局变量res的数据后,编写异或脚本进行解密: a[0xBF, …

技术与业务:项目成功的黄金关键

目录 前言1 明确业务需求2 技术选择与业务匹配3 解决方案设计与业务一致4 开发与实施5 持续监控与优化6 反馈循环与持续改进结语 前言 在当今数字化时代,技术与业务之间的紧密联系对于项目的成功至关重要。无论是开发新产品、提供服务还是改进现有流程,…

Avalonia(11.0.2)+.NET6 打包设置发布包的版本号

Avalonia11.0.2+.NET6 打包设置发布包的版本号 系统版本如何打包设置打包的版本号本文是对上一篇打包文章的补充,后台好多人私信我说打包的版本号如何设置,今天出个补充说明 Avalonia(11.0.2)+.NET6 打包运行到银河麒麟V10桌面系统 系统版本 如何打包 Avalonia(11.0.2)+.NET…