xampp上传Wordpress/天津百度seo
欢迎光临 :
羑悻的小杀马特-CSDN博客
目录
一·AVL树的介绍:
二·AVL树的实现:
1·结构框架:
2·节点的插入:
旋转:
2·1左单旋:
2.1.1左单旋介绍及步骤:
2.1.2左单旋代码实现:
2.1.3左单旋技巧总结:
2·2右单旋:
2.2.1右单旋介绍及步骤:
2.2.2右单旋代码实现:
2.2.3右单旋技巧总结:
2·3左右双旋 :
2.3.1左右双旋介绍及步骤:
2.3.2左右双旋代码实现:
2.3.3左右双旋技巧总结:
2.4右左双旋:
2.4.1右左双旋介绍及步骤:
2.4.2右左双旋代码实现:
2.4.3右左双旋技巧总结:
旋转系列的总结:
3.节点的查找:
4.检验AVL树是否平衡:
三·AVL树的代码汇总:
一·AVL树的介绍:
AVL树,它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。
因此为了能记录它是否平衡这里引入了一个新名词也就是平衡因子:balance factor:某个结点的平衡因子就是它右子树的高度减去左子树的高度,也就是说这个树要是AVL树那么它的平衡因子一定是-1或0或1,否则就要旋转调整(后面会介绍到)。
那为啥高度差不能都为0呢?如⼀棵树是2个结点,4个结点等情况下,⾼度差最好就是1,⽆法作为⾼度差是0,因此这样设计是比较合理的
当然因为这样设计就趋近于完全二叉树,那么高度就可以理解为log(n),那么此时它的增删查改也可以这么认为成log(n)。
二·AVL树的实现:
1·结构框架:
template<class K, class V>
struct AVLTreeNode
{// 需要parent指针,后续更新平衡因子可以看到pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTreeNode<K, V>* _right;AVLTreeNode<K, V>* _parent;int _bf; // balance factorAVLTreeNode(const pair<K, V>& kv):_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0){}
};
template<typename K,typename V>
class AVLTree {
public:using node = AVLTreeNode<K, V>;
private:node* _root = nullptr;
};
2·节点的插入:
这里插入其实和上次写的二叉搜索树的插入差不多,但是就多了控制高度平衡以及对平衡因子的控制操作。
也就是我们找到空位置连接插入后,然后把它的parent处节点的平衡因子更新一下,看一下是否符合条件:然后分情况决定继续向上遍历查找还是停止还是旋转。下面分为三种情况:
1·情况一:恰好为0,也就是原来是-1或者1变来的,此时就不需要向上调整了,为什么呢?因为未插入前parent作为一个节点的右孩子或者左孩子,那么这个节点的假设是左孩子是parent,可以发现此时插入还是不插入这个节点的平衡因子都不变故这时就不需要向上判断。
如:
2·情况二:恰好为1或者-1,也就是从-2或者0变来的,那么此时它变化了,可能会导致上面变化因此还要向上继续遍历找平衡因子的变化。
3·情况三:恰好是-2或者是2,那么此时就不符合平衡规则那就涉及到旋转了(下面会讲到)。
旋转:
这里旋转是为了什么呢?1·保持搜索树的原则。2·可以降低树的高度。3·可以保证树的平衡。,因此根据parent为2或者-2,以及它的左或右孩子为1或-1的几种情况可以把它分为左单旋,右单旋,左右双旋,右左双旋等。
2·1左单旋:
2.1.1左单旋介绍及步骤:
左单旋肯定是右边高,这里为了方便对下面很多节点,这里直接把剩下的子树抽象化,因为它是平衡二叉树故因此可以把再你插入之前,将要变成2或者-2的节点作为parent以及它的下面分割下来成为抽象的树部分如:
这样的话,左单旋也就是在最右边的h(当然这里的h>=0)高度的下面插入一个节点, 然后通过左单旋变为平衡状态:
这里我们可以看出来,就是把pr的左指针指向parent,parent的右指针指向pr1,但是这里就忽视了最终要的父亲指针,此时也要注意,把pr1(注意是否为空)的父亲指针指向parent,然后保存原先parent的父亲指针(也要判断一下parent是否为根节点从而单独做处理),然后把此时的连接连成pr即可了。
2.1.2左单旋代码实现:
下面展示一下代码:
void RotateL(node* parent) {//左旋node* subr = parent->_right;node* subrl = subr->_left;//处理sublr:parent->_right = subrl;if (subrl) subrl->_parent = parent;//sublr为空不能访问node* pp = parent->_parent;//保存parent的父节点指针//调节新旧“parent”位置:subr->_left = parent;parent->_parent = subr;if (pp == nullptr) {_root = subr;subr->_parent = nullptr;}else {if (parent == pp->_left) pp->_left = subr;else pp->_right = subr;subr->_parent = pp;}parent->_bf = subr->_bf = 0;}
2.1.3左单旋技巧总结:
技巧总结:这里对于左单旋的操作进行一下总结:把parent节点向下压,然后把 pr的左孩子也就是prl作为parent右孩子,其他注意连接即可。
2·2右单旋:
2.2.1右单旋介绍及步骤:
右单旋肯定是左边高,其实也是根左单旋大差不差,下面上图:
这里也和上面类似只不过是把parent的左指针指向plr,pl的右指针指向parent,还有一些其他的注意连接方法,右单旋也就是在最左边的h插入使它变为h+1:
这里与左单旋大差不差,因此就不重复了。
2.2.2右单旋代码实现:
代码:
void RotateR(node* parent) {//右旋node* subl = parent->_left;node* sublr = subl->_right;parent->_left = sublr;if (sublr) sublr->_parent = parent;node* pp = parent->_parent;subl->_right = parent;parent->_parent = subl;if (pp == nullptr) {_root = subl;subl->_parent = nullptr;}else {if (parent == pp->_left) pp->_left = subl;else pp->_right = subl;subl->_parent = pp;}parent->_bf = subl->_bf = 0;
}
2.2.3右单旋技巧总结:
技巧总结:把parent向下压,然后把plr与parent的左指针相连,然后注意parent指针的控制即可。
2·3左右双旋 :
2.3.1左右双旋介绍及步骤:
这里为什么叫这个呢?其实它的步骤可以分为先对parent的孩子进行左单旋,然后再对parent进行右单旋,即可。这里我们可以这么理解,即就是在进行右单旋的插入图,把节点插在中间的h上即可,而这时根据h>=0;分为了三种情况,对应的是平衡因子的变化:
情况一:就是h为0的情况:那么此时到最后进行旋转后它们的平衡因子都是0。
情况二:插入h的右边,那么旋转后,pl的平衡因子就是-1,其他都是零。
情况三:插入h的左边,那么旋转后parent的平衡因子就是1。
那么我们写代码的时候怎么区分这三种情况就成了写左右双旋的关键了,即这时候我们得到的插入后的plr这个节点的bf一定是如果是0,就是第一种情况,如果是-1就是第三种情况 ,如果是1就是第二种情况,因此可以根据这个进行代码的编写。
步骤1:首先先把pl左旋,然后parent进行右旋,这时大概结构就搞好了,也就是高度OK了,步骤2:接下来就是平衡因子的更改,可以根据我们旋转之前保存的pl的bf分情况进行对旋转后parent,pl和plr三个节点处平衡因子进行更新操作。
2.3.2左右双旋代码实现:
代码展示:
void RotateLR(node* parent) {//左右双旋node* subl = parent->_left;node* sublr = subl->_right;int bf = sublr->_bf;RotateL(subl);RotateR(parent);if (bf == -1) {//插入的是sublr的左支sublr->_bf = 0;subl->_bf = 0;parent->_bf = 1;}else if (bf == 1) {//插入的是sublr的右支sublr->_bf = 0;subl->_bf = -1;parent->_bf = 0;}else if (bf == 0) {//插入前sublr为空sublr->_bf = 0;subl->_bf = 0;parent->_bf = 0;}else{assert(false);}}
2.3.3左右双旋技巧总结:
技巧总结:就是把parent节点压下来,plr节点提到最上面,之后pl连接它的左指针,parent连接它的右指针,然后plr的左孩子给pl右指针,右孩子给parent左指针。
2.4右左双旋:
2.4.1右左双旋介绍及步骤:
这里其实和左右双旋一样,但是是左旋最初的那个图在中间的h插入,然后也是分为那三种情况。
情况1:h=0,最后插入的就是prl这个节点,那么此时parent,prl和pr平衡因子都是0.
情况2:h>=1,但是插入的那个h的右边,那么此时,pr的bf是0,parent的bf是-1,然后prl的平衡因子就是0。
情况3: h>=1,但是插入的那个h的左边,那么此时,pr的bf是1,parent的bf是0,然后prl的平衡因子就是0。
跟左右双旋一样,那么我们写代码的时候怎么区分这三种情况就成了写右左双旋的关键了,即这时候我们得到的插入后的plr这个节点的bf一定是如果是0,就是第一种情况,如果是-1就是第三种情况 ,如果是1就是第二种情况,因此可以根据这个进行代码的编写。
步骤1:类似,还是pr右旋,然后parent左旋,链接好形状。
步骤2:更新平衡因子,如果第一种情况,此时parent,pr,prl的平衡因子都是0,第二种情况,prl是0,parent是-1,pr是0,第三种情况:prl还是0,parent是0,pr是1。
2.4.2右左双旋代码实现:
代码:
void RotateRL(node* parent) {//右左双旋node* subr = parent->_right;node* subrl = subr->_left;int bf = subrl->_bf;RotateR(subr);RotateL(parent);if (bf == -1) { //插入的是subrl的左支subrl->_bf = 0;subr->_bf = 1;parent->_bf = 0;}else if (bf == 1) {//插入的是subrl的右支subrl->_bf = 0;subr->_bf = 0;parent->_bf = -1;}else if (bf == 0) {//插入前subrl为空subrl->_bf = 0;subr->_bf = 0;parent->_bf = 0;}else{assert(false);}}
2.4.3右左双旋技巧总结:
技巧总结:就是把parent节点压下来,prl节点提到最上面,之后parent连接它的左指针,pr连接它的右指针,然后prl的左孩子给parent右指针,右孩子给pr左指针。
旋转系列的总结:
这里对上面四种旋转方式如何进行的做一个总结:
1·首先是左单旋和右单旋:可以这么想向哪一边旋转就是另一边高,故就是插入的是最边上才导致增高的,根据此画出相应的图来,都是parent被拽下来,然后少的孩子用旁边的离得最近的孩子补上,其次就是注意各个节点对应的指针的连接。
2·左右双旋和右左双旋:可以这么理解,左右:右单旋的图,只是节点插在了中间的h处(再分三种情况判断平衡因子)右左:左单旋的图,节点插在了中间的h;操作就是:plr或者prl(中间h分出去的节点或者是h=0,新插入的节点)提到最上面,然后pl成左支或者pr成右支,然后被截下来的plr或者prl的左支向左补,右支向右补,最后处理好节点之间的连接即可。
3.节点的查找:
node* Find(const K& key)
{node* cur = _root;while (cur){if (cur->_kv.first < key){cur = cur->_right;}else if (cur->_kv.first > key){cur = cur->_left;}else{return cur;}}return nullptr;
}
4.检验AVL树是否平衡:
导致其不平衡的条件有两个:要么高度不符合要求,要么就是高度正确而平衡因子未更新正确。
因此可以根据这两个条件来写代码完成检验操作。
int treehight(node* root) {if (root == nullptr) return 0;int lefthight = treehight(root->_left);int righthight = treehight(root->_right);return lefthight > righthight ? lefthight + 1 : righthight + 1;
}bool _IsBalanceTree(node* root) {//不平衡肯定是在插入数据的时候没有更新正确导致://如高度没有控制好,或者就是高度控制了当往上调整的时候平衡因子没有及时更新导致平衡因子不符合要求if (root == nullptr) return true;int lefthight = treehight(root->_left);int righthight = treehight(root->_right);int gap = abs(lefthight - righthight);if (gap >= 2){cout << root->_kv.first << ":高度存在问题" << endl;return false;}if (abs(root->_bf) != gap) {cout << root->_kv.first << ":平衡因子存在问题"<< endl;return false;}return _IsBalanceTree(root->_left) && _IsBalanceTree(root->_right);}
这里顺便说一下删除操作:如果没找到此节点就直接返回了,要么就是删除的是叶子节点直接删除就可,要么是删除一个节点,它的左孩子为空或者右孩子为空,那么此时删除这个节点后,把另一端不为空的孩子补过去,最后一种就是要删除节点的 左右孩子都不为空,此时就要类似二叉搜索树删除一样找替代的孩子,即此节点右孩子一直向左遍历找到最后一个节点与它替换在完成间接删除操作。这里就不做操作了,大致就是这个意思。
三·AVL树的代码汇总:
#pragma once
#include<iostream>
#include<assert.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
template<class K, class V>
struct AVLTreeNode
{// 需要parent指针,后续更新平衡因子可以看到pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTreeNode<K, V>* _right;AVLTreeNode<K, V>* _parent;int _bf; // balance factorAVLTreeNode(const pair<K, V>& kv):_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0){}
};
template<typename K,typename V>
class AVLTree {
public:using node = AVLTreeNode<K, V>;bool Insert(const pair<K, V>& kv){if (_root == nullptr) {_root = new node(kv);return true;}else {//寻找空位置进行插入:node* cur = _root;node* parent = nullptr;while (cur) {if (cur->_kv.first > kv.first) {parent = cur;cur = cur->_left;}else if (cur->_kv.first < kv.first) {parent = cur;cur = cur->_right;}else {return false;}}//插入:cur = new node(kv);if (kv.first < parent->_kv.first) parent->_left = cur;else parent->_right = cur;cur->_parent = parent;//更新平衡因子:平衡更新完要么找到parent的bf等于0,要么找到了root发现它的平衡因子还是1或-1//保持parent始终是cur的父亲while (parent) {//cur仍旧是当前插入的节点if (cur == parent->_left) parent->_bf--;else parent->_bf++;if (parent->_bf == 0) break;else if (parent->_bf == -1 || parent->_bf == 1) {cur = parent;parent = cur->_parent;}else if (parent->_bf == 2 || parent->_bf == -2) {//判断如何旋转:if (parent->_bf == 2 && parent->_right ->_bf== -1) {RotateRL(parent);}else if (parent->_bf == -2 && parent->_left->_bf == 1) {RotateLR(parent);}else if (parent->_bf == 2 && parent->_right->_bf == 1) {RotateL(parent);}else if (parent->_bf == -2 && parent->_left->_bf ==-1) {RotateR(parent);}else {assert(false);}break;//这里由于给它旋转后肯定保证了parent出平衡因子为0,故不用上调了}else assert(false);}return true;}}node* Find(const K& key){node* cur = _root;while (cur){if (cur->_kv.first < key){cur = cur->_right;}else if (cur->_kv.first > key){cur = cur->_left;}else{return cur;}}return nullptr;}int treehight(node* root) {if (root == nullptr) return 0;int lefthight = treehight(root->_left);int righthight = treehight(root->_right);return lefthight > righthight ? lefthight + 1 : righthight + 1;}void InOrder() {_inorder(_root);}bool IsBalanceTree() {return _IsBalanceTree(_root);}
private:void RotateL(node* parent) {//左旋node* subr = parent->_right;node* subrl = subr->_left;//处理sublr:parent->_right = subrl;if (subrl) subrl->_parent = parent;//sublr为空不能访问node* pp = parent->_parent;//保存parent的父节点指针//调节新旧“parent”位置:subr->_left = parent;parent->_parent = subr;if (pp == nullptr) {_root = subr;subr->_parent = nullptr;}else {if (parent == pp->_left) pp->_left = subr;else pp->_right = subr;subr->_parent = pp;}parent->_bf = subr->_bf = 0;}void RotateR(node* parent) {//右旋node* subl = parent->_left;node* sublr = subl->_right;parent->_left = sublr;if (sublr) sublr->_parent = parent;node* pp = parent->_parent;subl->_right = parent;parent->_parent = subl;if (pp == nullptr) {_root = subl;subl->_parent = nullptr;}else {if (parent == pp->_left) pp->_left = subl;else pp->_right = subl;subl->_parent = pp;}parent->_bf = subl->_bf = 0;}void RotateLR(node* parent) {//左右双旋node* subl = parent->_left;node* sublr = subl->_right;int bf = sublr->_bf;RotateL(subl);RotateR(parent);if (bf == -1) {//插入的是sublr的左支sublr->_bf = 0;subl->_bf = 0;parent->_bf = 1;}else if (bf == 1) {//插入的是sublr的右支sublr->_bf = 0;subl->_bf = -1;parent->_bf = 0;}else if (bf == 0) {//插入前sublr为空sublr->_bf = 0;subl->_bf = 0;parent->_bf = 0;}else{assert(false);}}void RotateRL(node* parent) {//右左双旋node* subr = parent->_right;node* subrl = subr->_left;int bf = subrl->_bf;RotateR(subr);RotateL(parent);if (bf == -1) { //插入的是subrl的左支subrl->_bf = 0;subr->_bf = 1;parent->_bf = 0;}else if (bf == 1) {//插入的是subrl的右支subrl->_bf = 0;subr->_bf = 0;parent->_bf = -1;}else if (bf == 0) {//插入前subrl为空subrl->_bf = 0;subr->_bf = 0;parent->_bf = 0;}else{assert(false);}}void _inorder(node* root) {if (root == nullptr) return;_inorder(root->_left);cout << root->_kv.first << ":" << root->_kv.second << endl;_inorder(root->_right);}bool _IsBalanceTree(node* root) {//不平衡肯定是在插入数据的时候没有更新正确导致://如高度没有控制好,或者就是高度控制了当往上调整的时候平衡因子没有及时更新导致平衡因子不符合要求if (root == nullptr) return true;int lefthight = treehight(root->_left);int righthight = treehight(root->_right);int gap = abs(lefthight - righthight);if (gap >= 2){cout << root->_kv.first << ":高度存在问题" << endl;return false;}if (abs(root->_bf) != gap) {cout << root->_kv.first << ":平衡因子存在问题"<< endl;return false;}return _IsBalanceTree(root->_left) && _IsBalanceTree(root->_right);}node* _root = nullptr;
};
这些也仅是个人对AVL有限的理解,希望大佬多多指导。
相关文章:

AVL树(平衡二叉树)的介绍以及相关构建
欢迎光临 : 羑悻的小杀马特-CSDN博客 目录 一AVL树的介绍: 二AVL树的实现: 1结构框架: 2节点的插入: 旋转: 21左单旋: 2.1.1左单旋介绍及步骤: 2.1.2左单旋代码实…...

SAP员工士气因重组受到打击
SAP在2024年经历了员工士气显著下降的局面,特别是在国内员工中。这一变化与公司在1月宣布的重组计划紧密相关。根据彭博社的报道,6月进行的一项调查显示,SAP约16,500名员工中,有51%愿意接受竞争对手的类似职位,而对公司…...

Unity3D 中构建行为树插件详解
前言 在Unity3D中,行为树(Behavior Tree)是一种用于游戏AI设计和实现的高级工具,它提供了一种结构化和模块化的方式来管理游戏实体的行为。行为树通过树状结构组织了一系列节点,每个节点代表了一个决策或动作。这种结…...

数学符号练习-函数连续性与导数
前言 其实主要的目的是可以在文本中输出各种数学符号,便于以后用到的时候有现成的例子拿过来抄~~ 函数的连续性 设函数 y f ( x ) yf(x) yf(x)在点 x 0 x_0 x0的某邻域内有定义,如果当自变量的改变 Δ x Δx Δx趋近于0时,相应函数的改变量也趋近于…...

笔记本维修与拆解(一)
清灰: 拆螺丝: 拔掉电池供电: 多按几次开机键,放电: 涂抹硅胶的时候,千万不要涂很多,溢出CPU,如果硅胶溢到焊盘上去的话很容易热胀冷缩短路 【联想拯救者Y9000P和R9000P最简单清灰教程…...

【JavaSE系列】IO流
目录 前言 一、IO流概述 二、IO流体系结构 三、File相关的流 1. FileInputStream 2. FileOutputStream 3. FileReader 4. FileWriter 四、缓冲流 五、转换流 1. InputStreamReader 2. OutputStreamWriter 六、数据流 七、对象流 八、打印流 九、标准输入输出流…...

深入探讨在线教育系统源码:搭建知识付费平台实战方案详解
知识付费平台是软件开发行业内炙手可热的项目,其受众群体非常广,也是很多小伙伴提问比较多的,今天小编将从在线教育系统源码开始,为大家讲解一个知识付费平台的搭建开发实战方案。 一、系统架构设计 搭建在线教育系统需考虑以下几…...

前端全屏模式切换
前端全屏模式切换 const isBigScreen ref(false) const handleScreen () > {if (isBigScreen.value) {document.exitFullscreen()isBigScreen.value false} else {isBigScreen.value truedocument.documentElement.requestFullscreen() // 请求全屏模式} }...

构建高可用和高防御力的云服务架构第二部分:SLB负载均衡(2/5)
在现代云服务中,负载均衡(Load Balancing)是一种关键技术,用于优化资源利用、最小化响应时间、提高系统的可伸缩性和可靠性。负载均衡器位于客户端和服务器之间,根据预设的策略将请求分发到多个服务器上,以…...

计算机毕业设计Python+Spark知识图谱微博舆情预测 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 Hadoop 大数据毕业设计
《PythonSpark知识图谱微博舆情预测》开题报告 一、课题背景与意义 随着互联网技术的飞速发展,社交媒体平台如微博已成为人们表达观点、交流信息的重要渠道。微博每天产生海量的数据,这些数据中蕴含着丰富的社会情绪、事件动态等信息,对于政…...

excel-VBA知识点记录
1、计算机硬件的组成部分 内存,一旦断电,存储在里面的数据就消失了,而硬盘是永久存储数据的,所以刚开始我们在文件里面编辑没有按保存的时候,数据是在内存里面的,一旦断电数据就没了,但我们点了…...

RabbitMQ——消息的可靠性处理
1.业务分析 在业务的开发中,我们通常将业务的非核心业务交给MQ来处理,比如支付,在支付过后,我们需要扣减余额,修改支付单状态,修改订单状态,发送短信提醒用户,给用户增加积分等等&am…...

babylon.js-1:入门篇
最近项目中使用到了 Babylon.js 这门技术,从今天开始,抽取自己写的比较好的拿出来,作为分享案例: 记录学习成果通过笔记的方式记录技术积累方便工作中查找翻阅实现案例 是什么 Babylon.js是一个基于WebGL的开源3D渲染引擎&…...

VS Code调整字体大小
##在工程目录底下.vscode/settings.json添加设置参数 {"editor.fontSize": 15,"window.zoomLevel": 1.5 }...

Python基础语句教学
Python是一种高级的编程语言,由Guido van Rossum于1991年创建。它以简单易读的语法和强大的功能而闻名,被广泛用于科学计算、Web开发、数据分析等领域。 Python的应用领域广泛,可以用于开发桌面应用程序、Web应用、游戏、数据分析、人工智能等…...

ansible 配置
目录 1.集群自动化维护工具 ansible 2.ansible管理架构 3.安装ansible 4.Iventory主机模式 5.通过ping验证 6.ansible常用模块 7.命令行模块 7.1command模块 7.2shell模块 7.3scripts模块 7.4file模块 7.5copy模块 7.6yum模块 1.集群自动化维护工具 ansibl…...

堆排序算法详解:原理与Python实现
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

[论文阅读] ChartInstruct: Instruction Tuning for Chart Comprehension and Reasoning
原文链接:http://arxiv.org/abs/2403.09028 源码链接:https://github.com/vis-nlp/ChartInstruct 启发:本文构建的instruction-tuning数据集以及使用该数据集对模型进行微调的过程都值得学习。 Abstract 研究对象:图表 研究…...

基于springboot+vue学生宿舍管理系统设计与实现
博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…...

【Android】模糊搜索与数据处理
【Android】模糊搜索与数据处理 本篇博客主要以根据输入内容动态获取城市为例进行讲解。 获取城市 这一部分主要是根据输入的信息去动态获取城市信息 首先定义了一个名为 NetUtil 的类,主要用于通过 HTTP 请求获取城市信息。 public class NetUtil {private stat…...

机器学习-KNN
KNN:K最邻近算法(K-Nearest Neighbor,KNN) 用特征空间中距离待分类对象的最近的K个样例点的类别来预测。 投票法:K 个样例的对数类别。 k1:最近邻分类 k 通常是奇数(因为我们根据这个K数据判断类别,如果…...

python 安装包 site-packages
1. site-packages 文件夹的位置 当我们通过 pip 或其他方式安装一个 Python 包时,这些包的文件就会被复制到 site-packages 文件夹下。 site-packages 文件夹通常位于 Python 的安装目录下的 Lib 文件夹内。具体的路径会根据你使用的操作系统和 Python 版本的不同而…...

大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

CentOS8.5.2111(3)实验之DHCP服务器架设
一、实验目标 1.掌握DHCP服务器的主配置文件各项申明参数及操作及其含义 2. 具备DHCP 服务器、中继服务器的配置能力 3. 具备测试客户端正常获取服务器分配地址的能力 4. 具备DHCP服务器故障排除能力 二、实训原理/流程 (一)项目背景 …...

机器学习(4):机器学习项目步骤(一)——定义问题
1. 机器学习项目的五大步骤 定义问题 收集数据和预处理 选择算法和确定模型 训练拟合模型 评估优化模型性能 2. 定义问题的主要任务 刨析业务场景,设定清晰目标,同时还要确定当前问题属于哪一种机器学习类型。 3. “易速鲜花”项目案例 项目任务&a…...

C#中Socket通信常用的方法
创建Socket 在C#中创建一个Socket对象的基本步骤如下: 引入命名空间: 首先,确保你的文件顶部包含了以下命名空间的引用: using System.Net; using System.Net.Sockets; 创建Socket实例: 你可以创建一个Socket实例&am…...

【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 一:单例模式(singleton) 1:概念 二:“饿汉模…...

huggingface实现中文文本分类
目录 1 自定义数据集 2 分词 2.1 重写collate_fn方法 3 用BertModel加载预训练模型 4 模型试算 5 定义下游任务 6 训练 7 测试 #导包 import torch from datasets import load_from_disk #用于加载本地磁盘的datasets文件 1 自定义数据集 #自定义数据集 #…...

基于python+控制台+txt文档实现学生成绩管理系统(含课程实训报告)
目录 第一章 需求分析 第二章 系统设计 2.1 系统功能结构 2.1.1 学生信息管理系统的七大模块 2.1.2 系统业务流程 2.2 系统开发必备环境 第三章 主函数设计 3.1 主函数界面运行效果图 3.2 主函数的业务流程 3.3 函数设计 第四章 详细设计及实现 4.1 学生信息录入模块的设计与实…...

Spring Boot 整合MyBatis-Plus 实现多层次树结构的异步加载功能
文章目录 1,前言2,什么是多层次树结构?3,异步加载的意义4,技术选型与实现思路5,具体案例5.1,项目结构5.2,项目配置(pom.xml)5.3,配置文件…...