二叉搜索树的实现与应用场景
本章目标
1.二叉搜索树的概念
2.二叉搜索树的性能分析
3.二叉搜索树的实现
4.二叉搜索树的key/key-value的实现场景
1.二叉搜索树的概念
二叉搜索树又叫二叉排序树,它是具有以下性质的树
1.它的左子树不为空,并且左子树上的值都小于根节点
2.它的右子树不为空,并且右子树上的值都大于根节点
3.它的左右结点都是二叉搜索树
4.二叉搜索树支持插入相等的值,也可以不支持插入相等的值,在后续我们会介绍map/set,以及mutiset和mutimap,前者就是不支持插入相等的值,后者就是支持插入相等的值
这是支持插入相等值的二叉搜索树
5.为什么这棵树又叫做二叉排序树,因为这颗树是严格遵守左边小右边大的方式.
当我们去按中序遍历去走一边,它就会排好升序,所以叫二叉排序树.
2.二叉搜索树的性能分析
1.对于当前二叉搜索树,如果它的搜索树接近一棵完全二叉树,那么它的时间复杂度就是logn的级别.因为二叉搜索树它会用要查找的值和当前结点的值进行比对,如果比他它就是它的右边,比他小就去它的左边,无论怎么样它都会往下走一层.它的查找次数也就是二叉搜索树的层数.
2.如果二叉搜索树退化成一颗单枝树的话,它的时间复杂度就到了N的地步.这是最坏的情况.
综上所述二叉搜索树的增删查的效率是O(N).
3.在前面我们学习过二分查找,它也能达到logn的效率,但是它有两个弊端.
1.它要求数据有序.2它如果进行中部的插入或者删除的话它的效率是很低的,它需要进行移动数据.
3.二叉搜索树的实现
对于二叉搜索树,它的结点结构与我们之前学过的二叉树并无区别.我们用一个类进行封装.
template <class K>
struct BStree_Node
{typedef BStree_Node<K> Node;Node* left = nullptr;Node* right = nullptr;K key;BStree_Node(const K& val = K()):key(val){;}};
因为我们写的二叉搜索树是一个泛型的,我们使用模板去控制类型.
3.1.二叉搜索树的插入
1.树为空,我们直接将结点赋值给根节点.
2.如果根结点不为空,大就让它往右边走,小就让他往左边走,找到空位,插入.
3.如果插入相等的值,可以插入到左边也可以插入到右边,但是要保证所以插入相等的值都要插入到左边,或者右边.
bool insert(const K& val)
{if (_root == nullptr){_root = new Node(val);return true;}Node* cur = _root;Node* parents = nullptr;while (cur){if (cur->key < val){parents = cur;cur = cur->right;}else if (cur->key > val){parents = cur;cur = cur->left;}else{return false;}}cur = new Node(val);if (parents->key > val){parents->left = cur;}else{parents->right = cur;}return true;
}
因为我们的二叉树是一颗三叉链.我们需要保证它的插入的结点,也要和它前面的结点相连,但是我们并不知道,它是插入在它的左边还是右边,我们可以重复判断一下.
如果我们支持插入相同的值的话,我们只需要让它的后两个判断合并,因为mutiset是肯定会插入成功的,我们实现也应当如此.
bool insert(const K& val){if (_root == nullptr){_root = new Node(val);return true;}Node* cur = _root;Node* parents = nullptr;while (cur){if (cur->key < val){parents = cur;cur = cur->right;}else {parents = cur;cur = cur->left;}//else//{// //return false;// parents = cur;// cur = cur->left;//}}cur = new Node(val);if (parents->key >= val){parents->left = cur;}else{parents->right = cur;}return true;}
相等时支持插入应该实现的代码
3.2搜索二叉树的查找
1.它的查找功能是插入的前部分的逻辑,我们至于要让大的向左走,小的向右边走即可.
2.如果在查找时,它的值已经被找到.我们返回当前结点.
3.如果遍历到最后,我们还没有找到,我们就让它返回nullptr.
4.如果支持查找相等值,一般我们应该返回中序遍历的第一个值例如下图
我们要返回的就是1下面的3.
Node* find(const K& val)
{Node* cur = _root;//Node* result = nullptr;while (cur){if (cur->key < val){cur = cur->right;}else if (cur->key > val){cur = cur->left;}else{return cur;//result = cur;//cur = cur->left;}}//return result;return nullptr;
}
相等时查找的代码就是将注释中的代码放出来,并替换.
3.3搜索二叉树的删除
对于二叉树的删除
如果元素不存在就返回false.
如果元素存在分为下面四种情况
1.左右孩子均为空
2.左孩子为空
3,右孩子为空
4.左右孩子均不为空
(1)我们可以让孩子的父亲的的该结点置空,然后删除该结点.
(2,3)我们让父亲结点对应的孩子结点的指针去指向它们剩余的那个孩子,然后删除该结点
(4),我们无法直接直接删除该结点,我们要从它们已经有的结点去找到它们的代替替换掉,然后删除.这个结点是当前结点的左子树的最大(最右)结点,右子树的最小(最左)结点.
然后让它们的值交换,让被替换的结点结点的父亲的结点的对应孩子结点的指针去接管它们剩下的结点.(也可能没有).删除掉该被替换的结点.
bool erase(const K& val)
{Node* cur = _root;Node* parents = nullptr;while (cur){if (cur->key < val){parents = cur;cur = cur->right;}else if (cur->key > val){parents = cur;cur = cur->left;}else{//删除if (cur->left == nullptr){if (cur == _root){_root = cur->right;}else{if (parents->right == cur){parents->right = cur->right;}else{parents->left = cur->right;}}delete cur;}else if (cur->right == nullptr){if (cur == _root){_root = cur->left;}else{if (parents->left == cur){parents->left = cur->left;}else{parents->right = cur->left;}}delete cur;}else{Node* pminright = cur;Node* minright = cur->right;while (minright->left){pminright = minright;minright = minright->left;}std::swap(cur->key, minright->key);if (pminright->left == minright)pminright->left = minright->right;elsepminright->right = minright->right;delete minright;}return true;}}return false;
}
3.4在类内部的递归–中序遍历
我们在类内部实现的中序遍历,我们一般只提供接口,我们不会把私有成员暴露出来.
void inorder()
{_inorder(_root);cout << endl;
}
private:void _inorder(Node* root){if (root == nullptr){return;}_inorder(root->left);cout << root->key << " ";_inorder(root->right);}
3.5拷贝与析构
拷贝和析构我们都采用递归的形式,前置走前序,或者走后序.
因为拷贝和析构格式的特殊我们也是提供接口的形式在内部调用
BStree(const BStree<K>& t)
{_root=Copy(t._root);
}
BStree<K>& operator=(BStree<K> t)
{swap(_root, t._root);return *this;
}
~BStree()
{destory(_root);cout << "~BStree" << endl;
}
private:
Node* Copy(Node* root)
{if (root == nullptr)return nullptr;Node* copy = new Node(root->key);copy->left = Copy(root->left);copy->right = Copy(root->right);return copy;
}
void destory(Node* root)
{if (root == nullptr)return;destory(root->left);destory(root->right);delete root;
}
Node* _root = nullptr;
赋值运算符重载,采用现代写法,交换的写法.
在这里我们已经写过了构造函数,我们要主动写一个无参的作为默认构造.
我们在这里用default强制生成.
BStree()=default;
4.二叉搜索树的key/key-value的实现场景
1 key搜索场景:
只有key作为关键码,结构中只需要存储key即可,关键码即为需要搜索到的值,搜索场景只需要判断key在不在。key的搜索场景实现的⼆叉树搜索树⽀持增删查,但是不⽀持修改,修改key破坏搜索树结构了。
场景1:⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆法进⼊。
场景2:检查⼀篇英⽂⽂章单词拼写是否正确,将词库中所有单词放⼊⼆叉搜索树,读取⽂章中的单词,查找是否在⼆叉搜索树中,不在则波浪线标红提⽰。
2.key/value搜索场景:
每⼀个关键码key,都有与之对应的值value,value可以任意类型对象。树的结构中(结点)除了需要存储key还要存储对应的value,增/删/查还是以key为关键字⾛⼆叉搜索树的规则进⾏⽐较,可以快速查找到key对应的value。key/value的搜索场景实现的⼆叉树搜索树⽀持修改,但是不⽀持修改key,修改key破坏搜索树性质了,可以修改value。
场景1:简单中英互译字典,树的结构中(结点)存储key(英⽂)和vlaue(中⽂),搜索时输⼊英⽂,则同时查找到了英⽂对应的中⽂。
场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。
场景3:统计⼀篇⽂章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。
template <class K,class V>
class BStree
{typedef BStree_Node<K,V> Node;
public:BStree() = default;BStree(const BStree<K,V>& t){_root = Copy(t._root);}BStree<K,V>& operator=(BStree<K,V> t){swap(_root, t._root);return *this;}~BStree(){destory(_root);cout << "~BStree" << endl;}bool insert(const K& val,const V& value){if (_root == nullptr){_root = new Node(val,value);return true;}Node* cur = _root;Node* parents = nullptr;while (cur){if (cur->key < val){parents = cur;cur = cur->right;}else if (cur->key > val){parents = cur;cur = cur->left;}else{return false;}}cur = new Node(val,value);if (parents->key > val){parents->left = cur;}else{parents->right = cur;}return true;}void inorder(){_inorder(_root);cout << endl;}Node* find(const K& val){Node* cur = _root;while (cur){if (cur->key < val){cur = cur->right;}else if (cur->key > val){cur = cur->left;}else{return cur;}}return nullptr;}bool erase(const K& val){Node* cur = _root;Node* parents = nullptr;while (cur){if (cur->key < val){parents = cur;cur = cur->right;}else if (cur->key > val){parents = cur;cur = cur->left;}else{//删除if (cur->left == nullptr){if (cur == _root){_root = cur->right;}else{if (parents->right == cur){parents->right = cur->right;}else{parents->left = cur->right;}}delete cur;}else if (cur->right == nullptr){if (cur == _root){_root = cur->left;}else{if (parents->left == cur){parents->left = cur->left;}else{parents->right = cur->left;}}delete cur;}else{Node* pminright = cur;Node* minright = cur->right;while (minright->left){pminright = minright;minright = minright->left;}std::swap(cur->key, minright->key);if (pminright->left == minright)pminright->left = minright->right;elsepminright->right = minright->right;delete minright;}return true;}}return false;}
private:void _inorder(Node* root){if (root == nullptr){return;}_inorder(root->left);cout << root->key << " "<<root->value;_inorder(root->right);}Node* Copy(Node* root){if (root == nullptr)return nullptr;Node* copy = new Node(root->key,root->value);copy->left = Copy(root->left);copy->right = Copy(root->right);return copy;}void destory(Node* root){if (root == nullptr)return;destory(root->left);destory(root->right);delete root;}Node* _root = nullptr;
};
key-val结构二叉搜索树代码,只需要修改模板参数,以及插入查找等地方修改,整体逻辑是跟key走的,并无太多差异.
相关文章:
二叉搜索树的实现与应用场景
本章目标 1.二叉搜索树的概念 2.二叉搜索树的性能分析 3.二叉搜索树的实现 4.二叉搜索树的key/key-value的实现场景 1.二叉搜索树的概念 二叉搜索树又叫二叉排序树,它是具有以下性质的树 1.它的左子树不为空,并且左子树上的值都小于根节点 2.它的右子树不为空,并且右子树上的…...
单例模式介绍
单例模式大家都很清楚,最常见的是饿汉式与懒汉式。也有不常见的静态内部类式与枚举式以及,懒汉式的线程安全版本。 单例模式常被用于全局式的配置管理(数据库连接池,日志管理器),资源共享(线程池…...
Pycharm 代理配置
Pycharm 代理配置 文章目录 Pycharm 代理配置1. 设置系统代理1.1 作用范围1.2 使用场景1.3 设置步骤 2. 设置 python 运行/调试代理2.1 作用范围2.2 使用场景2.3 设置步骤 Pycharm 工具作为一款强大的 IDE,其代理配置在实际开发中也是必不可少的,下面介绍…...
springboot入门-repository数据访问层JPA和mybatis
在 Spring Boot 中,Repository 接口是数据访问层(DAO)的核心抽象,而 JpaRepository 和 MyBatis 的实现方式有显著不同。以下是详细解释: 1. JPA 的 Repository 接口为什么使用 interface? (1) 基于接口的动…...
代码随想录算法训练营Day31 | 56. 合并区间 738.单调递增的数字
56. 合并区间 问题描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 解决方式…...
【教学类-102-19】蝴蝶三色图作品1——卡纸蝴蝶(滴颜料按压对称花纹)A4横版最大号22.85CM
背景需求: 前期做了18次实验,基本实现了三色图三线的各种变化效果和16种图纸大小的批量导入 今天开始制作具体可用的学具——黑卡纸蝴蝶(滴颜料按压对撑颜色) 【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图…...
Claude系列模型-20250426
文章目录 Claude 3.7 Sonnet - "Our most intelligent model yet"Claude 3.5 Haiku - "Fastest model for daily tasks"Claude 3.5 Sonnet (Oct 2024)Claude 3 Opus总结Claude 3.7 Sonnet - “Our most intelligent model yet” 特点: 这是目前Claude系列…...
ADC单通道采集实验
设置的步骤如下; #include "adc.h"ADC_HandleTypeDef adc_handle {0}; void adc_init(void) {adc_handle.Instance ADC1; //ADC的基地址adc_handle.Init.DataAlign ADC_DATAALIGN_RIGHT; //…...
启动你的RocketMQ之旅(五)-Broker详细——消息传输
前言: 👏作者简介:我是笑霸final。 📝个人主页: 笑霸final的主页2 📕系列专栏:java专栏 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一…...
100个节点的部署,整合Docker、Kubernetes和Jenkins的详细设计
一、架构设计概览 组件角色: Docker:应用容器化封装,确保环境一致性。Kubernetes(K8s):自动化容器编排,管理多节点集群的调度、扩缩容和自愈。Jenkins:CI/CD流水线驱动,实现代码到生产的自动化流程。集群规模: Master节点:3个(高可用,避免单点故障)。Worker节点:…...
神经网络与计算机视觉
2016 年,随着 AlphaGo 在围棋比赛中击败李世石,“人工智能”、“神经网络”、“深度 学习”等字眼便越来越多的出现在大众眼前,智能化好像成为一种不可逆转的趋势,带给大家新奇感的同时也带来了一丝忧惧:在不远的未来,机器是否真的拥有思维和情感?《终结者》中天网大战人…...
openEuler对比CentOS的核心优势分析
openEuler对比CentOS的核心优势分析 在开源操作系统领域,openEuler与CentOS均占据重要地位,但随着CentOS维护策略的调整(如CentOS 8停止维护,转向CentOS Stream),越来越多的用户开始关注国产化替代方案。o…...
高性能电脑系统优化工具Advanced SystemCare PRO v18.3.0.240 解锁永久专业版
软件介绍 IObit Advanced SystemCare,系统清理维护与安全防护软件,大幅提升整体系统性能和安全!一键AI智能模式,全面扫描优化修复系统,拥有性能加速模式、系统优化、网络加速、启动项优化、软件更新、实时监视清理、隐…...
【C语言练习】005. 编写表达式并确定其值
【C语言练习】005. 编写表达式并确定其值 005. 编写表达式并确定其值示例 1:算术表达式计算过程:最终结果:示例 2:关系和逻辑表达式计算过程:最终结果:示例 3:复合赋值和算术表达式计算过程:最终结果:示例 4:位运算表达式计算过程:最终结果:示例 5:综合表达式计算…...
力扣面试150题--合并两个有序链表和随机链表的复制
Day 33 题目描述 思路 常规题目,比较list1和list2节点的值,取出较小值扩展链表,最后其中一个遍历完直接拼接另外一个即可(归并排序) /*** Definition for singly-linked list.* public class ListNode {* int v…...
测试用例的设计
组合原则:多个选项有效数据建议组合使用(正向功能)、单个选项无效数据组合其他选项有效数据使用(逆向功能) 一、针对登录模块设计测试用例: 1.账号:已注册手机号、已注册邮箱、为空、未注册手机号、未注册邮箱 2.密码:注册密码、为空、错误密码 3.验证码:正确、过期、错误 …...
关于TCP三次握手和四次挥手的疑点
参考文章:浅谈TCP三次握手和四次挥手 1、三次握手的作用 (1)确保双方收到对方的初始序列号:客户端发送SYN包,服务器回复SYN-ACK包,客户端再回复ACK包,确保双方都接收到对方的序列号。 …...
逆向|dy|a_bogus|1.0.1.19-fix.01
2025-04-26 请求地址:aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQV96azV6NkoyMG1YeGt0eHBnNkkzRVRKejlyMEs3d2Y2dU9EWlhvd2ttblZWRnB0dlBPMmMwN2J0WFotcVU4V3M 个人主页的视频数据 我们需要逆向这个接口,所以现在需要分析这个请求, 分析这几个数据包可以发现: 只有…...
【软考-架构】13.5、中间件
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 中间件技术典型应用架构 中间件技术 在分布式系统环境中,出于操作系统和应用程序之间的软件。 主要的中间件有五类: 数据库访问中间件࿱…...
【Redis】基础2:作为缓存
文章目录 1. 一些概念2. 主动更新策略/缓存设计模式2.1 cache-aside pattern(lazy loading)2.2 read-through pattern(针对读操作)2.3 write-through pattern2.4 write behind pattern(write back pattern)…...
豆包,Kim,deepseek对比
以下是豆包、Kimi、DeepSeek的对比与应用: 对比 - 核心技术:DeepSeek-R1完全依赖强化学习驱动,跳过监督微调阶段。Kimi k1.5采用“轻量级SFT预热RL优化”的混合策略。 - 多模态支持:Kimi k1.5支持文本与图像的多模态联合推理。De…...
L2-005 集合相似度
L2-005 集合相似度 - 团体程序设计天梯赛-练习集 给定两个整数集合,它们的相似度定义为:Nc/Nt100%。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 …...
33.状态压缩动态规划
一、算法内容 1.简介 若元素数量比较小(不超过 20 20 20)时,想要存储每个元素取或不取的状态时, 可以借助位运算将状态压缩。 需要借助状态压缩过程的动态规划就是状态压缩 DP(很多地方会简称为状压 DP)…...
WSL 中 nvidia-smi: command not found的解决办法
前言 在使用基于 Linux 的 Windows 子系统(WSL)时,当我们执行某些操作后,可能会遇到输入 nvidia-smi 命令却无法被系统识别的情况。 例如,在终端中输入nvidia-smi 后,系统返回提示 -bash: nvidia-smi: co…...
Linux 进程控制
文章目录 1. 进程创建1.1 fork1.2 写时拷贝 2.进程终止2.1 退出码2.2 进程如何返回退出码 3. 进程等待3.1 wait3.1.1 阻塞等待3.1.2 退出码与退出信号 3.2 waitpid 1. 进程创建 1.1 fork 我们可以使用fork函数来创建子进程,创建子进程后,父子进程之间就…...
使用MobaXterm远程登录Ubuntu系统:SSH服务配置教程
一、MobaXterm介绍 MobaXterm官网:https://mobaxterm.mobatek.net/ MobaXterm类似于Xshell,是一个工具箱,功能比Xshell多。 直接去官网下载安装就可以,本文主要介绍开启Ubuntu的ssh服务,并通过MobaXterm实现远程登录…...
直线模组精度测试的标准是什么?
直线模组的精度测试是确保其性能和稳定性的重要环节。那么,大家知道直线模组精度测试的标准是什么吗? 1、定位精度:以最大行程为基准长度,用从基准位置开始实际移动的距离与指令值之间的最大误差的绝对值来表示。一般来说…...
RK3568 Debian调试记录
文章目录 1、环境介绍2、前言3、debian目录结构3.1、脚本调用顺序 4、编译debian4.1、构建debian编译所需的环境4.2、编译debian4.3、打包 5、系统启动6、debian适配6.1、新增板级配置单6.2、USB6.3、Wi-Fi / BT6.4、屏幕旋转6.5、触摸旋转6.6、时钟 7、测试8、总结 1、环境介绍…...
来自 Bisheng 关于微调的内容总结
来自 Bisheng 关于微调的内容总结 0. 引言1. 关于微调的总结 0. 引言 这篇文章的内容(主要是截图)是来自 Bisheng 关于微调的内容总结,内容来源于 B 站Up主七吟覃_BISHENG负责人的视频,感兴趣的可以观看原视频。 1. 关于微调的总…...
Git 工具的安装
目录 Git 工具介绍 Git 工具安装 创建本地仓库 配置本地仓库 Git 版本控制基本原理 本期开始,我们将学习如何使用 Git 工具,实现多版本控制。 Git 工具介绍 要了解 Git 工具我们得先了解版本控制器的概念。 有这样一个场景,如下图所…...
任务管理系统,Java+Vue,含源码与文档,科学规划任务节点,全程督办保障项目落地提效
前言: 在当今快节奏的工作环境中,高效的任务管理是确保项目按时完成、资源合理分配及团队协作顺畅的关键。任务管理系统作为提升工作效率的重要工具,通过数字化手段帮助用户组织、跟踪和完成各类任务。本文将详细阐述任务管理系统的五大核心…...
JavaScript基础知识合集笔记1——数据类型
文章目录 JavaScript中的数据类型基本数据类型引用类型存储区别 JavaScript中的数据类型 基本数据类型和复杂类型 基本数据类型 基础类型包含六种:Number、Bigint、String、Boolean、Undefined、null、symbol Number(特殊值NaN,意为“不是数值”) c…...
2025.04.26-美团春招笔试题-第四题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 图像智能降维处理 问题描述 卢小姐是一家图像处理公司的算法工程师,她正在开发一种高效的图像压缩算法。该算法基于奇异值分解(SVD)技术,通过保留图像矩阵中最重要的特征,在…...
测试基础笔记第十三天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、流程控制语句-判断语句1.判断语句2.逻辑运算符3.elif多重判断4.if的嵌套5.if与逻辑运算符结合1.and2.or3.not 设计测试用例二、流程控制语句-循环语句1.while语…...
【昇腾】PaddleOCR转om推理
文章目录 1. 使用Paddle框架推理1.1 安装1.2 推理 2. paddle 转 ONNX3. 转om4. Ais_bench 命令推理5. Ais_bench 编写推理代码 概要: PyTorch官方提供了昇腾插件包,安装后虽然可以支持PytorchOCR和PaddlePaddle的推理任务,但性能通常低于GPU。…...
【数据融合】基于拓展卡尔曼滤波实现雷达与红外的异步融合附matlab代码
一、问题分析与技术难点 1. 传感器特性对比 传感器测量维度优势局限性噪声模型雷达距离 $ r $、方位角 $ \theta $、速度 $ v $测距精度高、全天候工作角度分辨率低、易受多径干扰高斯噪声,协方差矩阵 $ R_r \text{diag}(\sigma_r^2, \sigma_\theta^2, \sigma_v^…...
第一部分:网页的骨架 —— HTML
这目录 前言1. 初识 HTML:搭建地基和框架1.1 小例子: 创建一个最简单的 HTML 页面,包含 "Hello World"。1.2 练习 2. 常用文本与内容标签:填充墙体和房间2.1 小例子: 创建一个包含个人简介(使用标…...
RTMP 协议解析 1
介绍 📖 什么是 RTMP? RTMP协议(Real-Time Messaging Protocol,实时消息传输协议)是由Adobe公司(最初由Macromedia开发)设计的一种用于实时传输音频、视频和数据流的网络协议,主要…...
c++初始化数组
1.前言 话说数组是n年前的事了,我为啥现在又提到它呢?因为很多人不会初始化数组,所以今天我来教教大家 2.初始化数组 初始化数组就是定义数组,就像这样 int a[5]{0}; 这样是a[0]到a[5]全都等于0 如果要输出这个数组…...
支持Win和Mac的批量图片压缩方法
软件介绍 如果你的图片太大,传输或上传总是卡壳,那就需要一款好用的图片压缩工具了。今天推荐的这款工具支持Windows和Mac双系统,简直是图片压缩界的"变形金刚"! 图压(图片压缩双系统版) …...
autodl(linux)环境下载git-lfs等工具及使用
一、git-lfs工具下载 #初始化git.lfs命令 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs git lfs install 二、 huggingface-cli工具下载及使用 Linux设置huggingface的镜像: ex…...
云原生--核心组件-容器篇-3-Docker核心之-镜像
1、定义与作用 定义: Docker镜像是一个只读的模板,包含运行应用程序所需的所有内容,包括代码、依赖库、环境变量、配置文件等。简单来说,Docker镜像是一个轻量级、独立、可执行的软件包,它包含了运行某个软件所需的所有…...
Dify与n8n深度对比:AI应用开发与自动化工作流的双轨选择
Dify与n8n深度对比:AI应用开发与自动化工作流的双轨选择 在数字化转型加速的2025年,Dify和n8n作为两大主流工具,分别代表了AI应用开发与自动化工作流领域的顶尖解决方案。本文将从核心定位、功能特性、使用场景等维度展开对比,为…...
AI算法优化建筑形态与能耗管理 实现方案和技术架构
以下是基于AI算法优化建筑形态与能耗管理的实现方案与技术架构,结合行业实践与前沿技术趋势,分层次解析核心要素及实施路径: 一、技术架构设计 1. 数据采集与感知层 多源数据融合 传感器网络:部署温湿度、CO₂浓度、光照、人流密度等传感器,构建实时数据采集体系(如北京…...
【互联网架构解析】从物理层到应用层的全栈组成
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(Python网络请求)运行结果验证 三、性能对比测试方法论量化数据对比结果分…...
Redis和MQ的区别
redis是一个高性能的key-value数据库,支持消息推送功能,可以当做一个轻量级的队列服务器使用。 redis只是提供一个高性能的、原子操作内存键值队,具有高速访问能力,虽然可以做消息队列的存储,但不具备消息队列的任何功…...
多系统安装经验,移动硬盘,ubuntu grub修改/etc/fstab 移动硬盘需要改成nfts格式才能放steam游戏
笔记本一个系统,移动硬盘两个系统,当前系统sda4.jpg 移动硬盘需要再装一个linux会有boot/efi,启动的时候grub界面才能识别,单linux没有efi别的电脑识别不到 没efi甚至启动不了grub 按下f6.jpg 看看笔记本grub能不能识别得到移动硬…...
4.26学习——web刷题
把攻防世界的web做了20道左右,挑了几道学到东西的题目记录一下 攻防世界warmup 进到环境中读取源代码发先有个提示:source.php,进去看看 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$wh…...
Go 语言中的实时交互式编程环境
在 Go 语言中,确实有几种方法可以实现类似 Python REPL 的实时交互式编程体验,让你可以实时编写代码并查看输出,而无需每次都编译运行整个程序。 但是需要注意的是,由于 Go 是编译型语言,完全的实时交互体验不如解释型…...
动态规划求解leetcode300.最长递增子序列(LIS)详解
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…...