⼆叉搜索树详解
1. ⼆叉搜索树的概念
⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:
• 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值
• 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值
• 它的左右⼦树也分别为⼆叉搜索树
• ⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,后续我们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值
称为二叉排序树的原因:这颗树是严格遵守左边小右边大的方式.当我们去按中序遍历去走一边,它就会排好升序,所以叫二叉排序树。
2. ⼆叉搜索树的性能分析
最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为: log2 N最差情况下,⼆叉搜索树退化为单⽀树(或者类似单⽀),其⾼度为: N
所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为: O(N)
那么这样的效率显然是⽆法满⾜我们需求的,我们后续课程需要继续讲解⼆叉搜索树的变形,平衡⼆叉搜索树AVL树和红⿊树,才能适⽤于我们在内存中存储和搜索数据。
另外需要说明的是,⼆分查找也可以实现 O(log2 N) 级别的查找效率,但是⼆分查找有两⼤缺陷:
3. 需要存储在⽀持下标随机访问的结构中,并且有序。
4. 插⼊和删除数据效率很低,因为存储在下标随机访问的结构中,插⼊和删除数据⼀般需要挪动数据。
这⾥也就体现出了平衡⼆叉搜索树的价值。
3.二叉搜索树相关功能实现
初始化,insert(插入),Find(查找),Erase(删除),析构,打印(中序遍历),构造(深拷贝)
初始化
template<class K>
struct BSTreeNode
{//二叉搜索树节点BSTreeNode * left;BSTreeNode* right;K _key;//构造函数BSTreeNode(const K& key):left(nullptr), right(nullptr), _key(key){}
};template<class K>
class BSTree
{typedef BSTreeNode<K> Node;public:private:
Node* _root=nullptr;
insert(插入)
//不带重复的搜索二叉树
//插入
bool Insert(const K& key)
{//如果为第一个节点,直接创建新节点赋予_rootif (_root == nullptr){_root = new Node(key);return true;}//记录父亲节点便于插入新节点链接Node* parent = nullptr;Node* cur = _root;//采用二叉搜索树特性找到插入位置while (cur){if (cur->_key < key){parent = cur;cur = cur->right;}else if(cur->_key > key){parent = cur;cur = cur->left;}else{//已存在这种值到达此处return false;}}//到达这一层cur所在位置即为插入点//创建出节点+真确链接(判断出为parent左边还是右边)cur = new Node(key);if (parent->_key < key){parent->right = cur;}else{parent->left = cur;}return true;}
其中while那部分代码为核心,利用二叉搜索树左边小·右边大特性找到插入节点位置。
Find(查找)
关键代码(while利用二叉搜索树特性寻找)
bool Find(const K& key)
{Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->right;}else if (cur->_key > key){parent = cur;cur = cur->left;}else{//已存在这种值到达此处return true;}}return false;
}
Erase(删除)
⾸先查找元素是否在⼆叉搜索树中,如果不存在,则返回false。
如果查找元素存在则分以下四种情况分别处理:(假设要删除的结点为N)
- 要删除结点N左右孩⼦均为空
- 要删除的结点N左孩⼦位空,右孩⼦结点不为空
- 要删除的结点N右孩⼦位空,左孩⼦结点不为空
- 要删除的结点N左右孩⼦结点均不为空
对应以上四种情况的解决⽅案:
- 把N结点的⽗亲对应孩⼦指针指向空,直接删除N结点(情况1可以当成2或者3处理,效果是⼀样的)
- 把N结点的⽗亲对应孩⼦指针指向N的右孩⼦(左孩子为空),直接删除N结点
- 把N结点的⽗亲对应孩⼦指针指向N的左孩⼦(右孩子为空),直接删除N结点
- ⽆法直接删除N结点,因为N的两个孩⼦⽆处安放,只能⽤替换法删除。找N左⼦树的值最⼤结点R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的位置,都满⾜⼆叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换,转⽽变成删除R结点,R结点符合情况2或情况3,可以直接删除。
采用替换法,然后删除情况会变成1,2,3进行操作
细节:删除节点要判断为,parent的左,还是parent的右。经过分析为parent左为一般情况,parent的右删除节点为根节点。
bool Erase(const K& key)
{Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->right;}else if (cur->_key > key){parent = cur;cur = cur->left;}else{//已存在这种值到达此处,准备删除//孩子左为空if (cur->left == nullptr){if (cur == _root){_root = cur->right;}else{if (cur == parent->left){parent->left = cur->right;}else{parent->right = cur->right;}}delete cur;}//孩子右为空else if(cur->right==nullptr){if (cur == _root){_root = cur->left;}else{if (cur == parent->left){parent->left = cur->left;}else{parent->right = cur->left;}}delete cur;}else//到达这里为左右孩子都存在{//替换法Node* pMinright = cur;Node* minRight = cur->right;while (minRight->left){pMinright = minRight;minRight = minRight->left;}swap(cur->_key, minRight->_key);//删除节点要判断为,parent的左,还是parent的右if (pMinright->left == minRight){pMinright->left = minRight->right;}else{pMinright->right = minRight->right;}delete minRight;}return true;}}return false;
}
打印(中序遍历),构造(深拷贝),析构
1.分析知道,递归遍历需要传入根节点参数,如果由使用者传入根节点是不方便的,因为_root为private不便于访问,解决方案1.成员函数GetRoot()将遍历包裹一层,具体实现看代码
2.深拷贝利用前序遍历一个个取值构造
3.析构利用后序遍历
public://默认构造函数//方法一/*BSTree(){}*///方法二 强制生成BSTree() = default;//拷贝构造BSTree(const BSTree<K>& t){//这种写法肯定存在问题这是一种浅拷贝,通过析构来观察//_root = t._root;//完成深拷贝就要利用t给*this构造_root = Copy(t._root);}//赋值运算符重载BSTree<K>& operator=(const BSTree<K> t){swap(_root, t._root);return *this;}
void InOrder()
{_InOrder(_root);cout << endl;
}~BSTree()
{Destory(_root);
}
private:void _InOrder(Node* root){if (root == nullptr){return;}_InOrder(root->left);cout << root->_key << " ";_InOrder(root->right);}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;}
二叉搜索树的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),单词存在,则++单词对应的次数。
代码实现
namespace key_value
{template<class K, class V>struct BSTreeNode{BSTreeNode<K, V>* _left;BSTreeNode<K, V>* _right;K _key; // 中文V _value; // 英文BSTreeNode(const K& key, const V& value):_left(nullptr), _right(nullptr), _key(key), _value(value){}};template<class K, class V>class BSTree{typedef BSTreeNode<K, V> Node;public:// 强制生成BSTree() = default;// BSTree(const BSTree& t)BSTree(const BSTree<K, V>& t){_root = Copy(t._root);}// t1 = t3// BSTree& operator=(BSTree t)BSTree<K, V>& operator=(BSTree<K, V> t){swap(_root, t._root);return *this;}~BSTree(){Destory(_root);_root = nullptr;}bool Insert(const K& key, const V& value){if (_root == nullptr){_root = new Node(key, value);return true;}Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(key, value);if (parent->_key < key){parent->_right = cur;}else{parent->_left = cur;}return true;}Node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_key < key){cur = cur->_right;}else if (cur->_key > key){cur = cur->_left;}else{return cur;}}return nullptr;}bool Erase(const K& key){Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_key < key){parent = cur;cur = cur->_right;}else if (cur->_key > key){parent = cur;cur = cur->_left;}else{// 准备删除if (cur->_left == nullptr){//if (parent == nullptr)if (cur == _root){_root = cur->_right;}else{if (cur == parent->_left){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}delete cur;}else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{if (cur == parent->_left){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}delete cur;}else // 两个孩子{Node* pMinRight = cur;Node* minRight = cur->_right;while (minRight->_left){pMinRight = minRight;minRight = minRight->_left;}swap(cur->_key, minRight->_key);if (pMinRight->_left == minRight){pMinRight->_left = minRight->_right;}else{pMinRight->_right = minRight->_right;}delete minRight;}return true;}}return false;}void InOrder(){_InOrder(_root);cout << endl;}private:void _InOrder(Node* root){if (root == nullptr){return;}_InOrder(root->_left);cout << root->_key << ":" << root->_value << endl;_InOrder(root->_right);}void Destory(Node* root){if (root == nullptr){return;}Destory(root->_left);Destory(root->_right);delete root;}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;}private:Node* _root = nullptr;};
}
相关文章:
⼆叉搜索树详解
1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结…...
CompleteableFuture的异步任务编排
为什么会有CompleteableFuture Java 的 1.5 版本引入了 Future,可以把它简单的理解为运算结果的占位符, 它提供了两个方法来获取运算结果。 get():调用该方法线程将会无限期等待运算结果。get(longmeout, TimeUnit unit):调用该…...
珈和科技贺李德仁院士荣膺国际数字地球学会会士:以时空智能赋能可持续发展目标 绘就数字地球未来蓝图
4月22日,第十四届国际数字地球会议在重庆盛大启幕。在这场在全球范围内数字地球领域具有国际影响力的学术盛会上,国际数字地球学会向珈和科技的企业顾问,2023年度国家最高科学技术奖得主李德仁院士授予了“国际数字地球学会会士”最高荣誉称号…...
【CodeBuddy 】从0到1,打造一个“牛马打鸡血仪”
【CodeBuddy 】从0到1,打造一个“牛马打鸡血仪” 我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 🌟嗨,我是LucianaiB&#…...
BI是什么意思?一文讲清BI的概念与应用!
目录 一、BI 是什么意思 1. BI 的定义 2. BI 的发展历程 3. BI 的核心组件 二、BI 的应用场景 1. 销售与市场营销 2. 财务管理 编辑3. 人力资源管理 4. 生产与运营管理 编辑三、选择合适的 BI 工具 1. 考虑企业的需求和规模 2. 评估工具的功能和性能 3. 关注工…...
可编辑PPT | 华为安全架构设计方法指南华为数字化转型架构解决方案
这份文档是华为的安全架构设计方法指南,它详细介绍了安全架构设计的重要性、方法和流程。文档强调安全架构是软件研发技术体系中的关键DFX能力,与可靠性、性能等并列,尤其在云计算和复杂网络环境下,安全性设计显得尤为重要。华为的…...
1.6 提示词工程(二)
目录 3.2 提供参考文本 3.2.1 使用参考文本来构建答案 3.2.2 指导模型用引用的文本回答问题 3.3 把复杂的任务拆分成简单的子任务 3.3.1 利用意图分类确定与用户查询最相关的指令 3.3.2 针对需要长时间对话的应用程序,应概括或过滤之前的对话内容 …...
WIFI信号状态信息 CSI 深度学习之数据集
Building occupant activity sensing dataset based on WIFI CSI(WiSA) 所有的数据以及实验参数都上传到了figshare中并配备详细说明,供参考。 论文链接:WiSA: Privacy-enhanced WiFi-based activity intensity recognition in …...
基于服务器的 DPI 深度分析解决方案
一、传统网络流量分析的瓶颈与挑战 在企业网络管理体系中,传统流量分析模式高度依赖网络设备作为数据采集核心节点,无论是基于 NetFlow/IPFIX 等流协议的流量分析,还是通过端口镜像技术实现的流量监控,均以交换机、路由器等网络设…...
动态规划(5):线性动态规划
引言 所谓线性动态规划,通常指状态定义和转移具有线性结构的动态规划问题,其状态通常可以用一维数组表示,状态转移主要依赖于相邻或前面有限个状态。这类问题的特点是状态空间呈线性排列,每个状态只与有限个前置状态相关,使得问题结构相对简单,更容易理解和掌握。 一维…...
c语言- 如何构建CMake项目(Linux/VSCode)
目录 linux(vscode)构建C语言CMake项目 1. 检查linux是否下载cmake,否则执行下列代码 2. 在vscode下载cmake的插件CMake Tools 3. 构建项目(项目结构) 4. 进行cmake配置 1. 在VS Code中按下ctrl shift p键&…...
HJ17 坐标移动【牛客网】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ17 坐标移动 一、题目描述 二、测试用例 三、解题思路 基本思路: 这题的难点在于理解题目和如何处理各种情况。题目是给定一串指令,首先要判断指令是否合法…...
HGHAC集群滚动扩展或更换硬盘设备
文章目录 环境文档用途详细信息 环境 系统平台:N/A 版本:4.5.8 文档用途 集群版本:hghac4.2.1 数据库版本:hgdb-see-4.5.8 此步骤适用于所有hac架构的hgdb集群。 主要用途:HAC集群服务器滚动扩展或更换硬盘 本文…...
虚拟环境中VSCode运行jupyter文件
用VS Code打开jupyter文件,点击右上角 Select Kernel 在正上方会出现这个选择框,选择 Python Environment 会出来所有的虚拟环境,选择要用的环境行...
【蓝桥杯嵌入式】【模块】六、PWM相关配置及代码模板
1. 前言 最近在准备16届的蓝桥杯嵌入式赛道的国赛,打算出一个系列的博客,记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点,如果有错误或者遗漏欢迎各位大佬斧正。 本系列博客会分为以下两大类: 1.1. 单独模块的讲…...
力扣-盛最多水的容器
1.题目描述 2.题目链接 11. 盛最多水的容器 - 力扣(LeetCode) 3.题目解析 题目中的储水量两边差*短边高度。也就是说,两条边中,决定储水量的是短边的高度。 我们可以定义两个指针,一个在最左边,一个在…...
数据实时同步:inotify + rsync 实现数据实时同步
1 数据实时同步 在生产环境中,某些场景下,要将数据或文件进行实时同步,保证数据更新后其它节点能立即获得最新的数据。 数据同步的两种方式 PULL:拉,使用定时任务的方式配合同步命令或脚本等,从指定服务…...
C#学习第24天:程序集和部署
程序集知识点 1.程序集的基本概念 程序集是部署和版本控制的最小单位。它可以是可执行文件(.exe)或动态链接库(.dll)。包含元数据和清单(Manifest),描述程序集的内容和依赖关系。 2.程序集清单…...
mac .zshrc:1: command not found: 0 解决方案
nano ~/.zshrc 使用自带的nano命令打开文件,修改后 Ctrl X 然后输入y 然后回车即可保存成功 一般情况下,不是常用这个命令,除非是遇到有问题的文件,才用, 例如 遇到下面的问题 /Users/xxli/.zshrc:1: command no…...
学习设计模式《十》——代理模式
一、基础概念 代理模式的本质【控制对象访问】; 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问; 代理模式的功能:代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象;客户端得…...
RestFul操作ElasticSearch:索引与文档全攻略
RestFul方式操作ES 索引库操作 创建索引库 PUT /索引库名称 {"mappings":{"properties":{"字段名":{"type":"字段类型","analyzer":"分词器","index":"是否参与搜索(布尔值)"},…...
OpenCV 图像读取与显示
一、知识点: 1、读取图像 (1)、Mat imread( const String & filename, int flags IMREAD_COLOR_BGR ); (2)、返回值: Mat,返回读取的图像。 若读取图像失败,则返回一个空的对象,对象.empty()为true。 (3)、参数filename: String是…...
Django快速入门篇
Django官网 https://docs.djangoproject.com/zh-hans/4.2/ 官方介绍 官方版本 推荐LTS版本,python3.9/3.10 djongo 每两年会出一个LTS版本 关于环节djongo,conda直接安装即可 conda create -n myenv python3.9 conda activate myenv pip install dj…...
C++23 新增扁平化关联容器详解
文章目录 一、引言已有关联容器回顾新容器的引入原因 二、std::flat_set定义与特性代码示例适用场景 三、std::flat_multiset定义与特性代码示例适用场景 四、std::flat_map定义与特性代码示例适用场景 五、std::flat_multimap定义与特性代码示例适用场景 六、与其他容器的比较…...
当PLC遇上电焊机器人:EtherCAT转CANopen上演工业级“语言翻译官”
在汽车自动化产线中,PLC与电焊机器人的高效协同是提升生产效率的关键。但PLC常用的EtherCAT协议与电焊机器人采用的CANopen协议存在通信壁垒,JH-ECT009疆鸿智能EtherCAT转CANopen技术成为打破这一障碍的核心方案。 应用拓扑图 EtherCAT是高速工业以太网协…...
LeetCode 1345. 跳跃游戏 IV(困难)
题目描述 给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标 i 1 、i - 1 或者 j : i 1 需满足:i 1 < arr.lengthi - 1 需满足:i - 1 …...
Linux bash shell的循环命令for、while和until
1、for命令 for命令,允许你创建一个遍历一系列值的循环,每次迭代都使用其中一个 值来执行已定义好的一组命令。 for var in list do commands done # 在list参数中,你需要提供迭代中要用到的一系列值。 # 可以通过几种不同的方法指定列表中的…...
三、【数据建模篇】:用 Django Models 构建测试平台核心数据
【数据建模篇】:用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据?准备工作:创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…...
Mac如何允许安装任何来源软件?
打开系统偏好设置-安全性与隐私,点击右下角的解锁按钮,选择允许从任何来源。 如果没有这一选项,请到打开终端,输入命令行:sudo spctl --master-disable, 输入命令后回车,输入电脑的开机密码后回车。 返回“…...
云原生主要架构模式
云原生(Cloud Native)是一种利用云计算的优势来构建和运行可扩展、弹性和高效应用程序的方法。它不仅仅是技术的集合,更是一种架构和设计理念。本文将围绕你提出的几部分,深入探讨云原生主要的架构模式,帮助你理解如何利用这些模式构建现代化的应用。 1. 服务化架构模式(…...
Neon数据库:让Postgres更智能的选择!
Neon:革新的Serverless PostgreSQL解决方案 在当今快速发展的技术世界,数据库的效率和灵活性成为众多开发者关注的重中之重。Neon,以其独特的serverless架构,正引领着这一变革。本文将深入探讨Neon的独特构架、应用场景以及具体的…...
《Metasploit框架核心模块解析与安全防护实践》
目录 一、框架模块化设计与安全验证价值 1. 漏洞验证模块(Exploit Modules) 2. 安全评估模块(Auxiliary Modules) 3. 安全响应模块(Post-Exploitation) 4. 载荷安全…...
C#:多线程Task使用
一.Task与Thread Task是架构在Thread之上的,也就是说任务最终还是要抛给线程去执行。Task跟Thread不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。…...
Nginx笔记
一、概述 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个电子邮件代理服务器。正向代理服务的是客户端(比如VPN),反向代理服务的是服务端。Nginx是多进程的,有一个Master进程控制多个Worke…...
小米便签源码部署流程
一、准备环境 1. 安装必要工具 Android Studio:最新稳定版(需支持 Kotlin 和 Jetpack Compose)。 JDK:建议 JDK 11 或更高(通过 sdkman 或 brew 安装)。 Git:用于克隆源码。 2. 配置国内镜像源&…...
DAY 30 超大力王爱学Python
知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 步骤 1:创建项目结构 …...
左右边界策略
这是一套完整的交易逻辑策略,涵盖了从函数定义、指标计算、信号生成到资金和仓位管理、加仓和减仓逻辑、以及止损和止盈逻辑的各个方面。 以下对该交易系统进行详细分析: 交易逻辑思路 1. 函数定义 - DZSell 和 DZBuy 函数:这两个函数用于计算卖出和买入的价格区间。它…...
iOS苹果和Android安卓测试APP应用程序的区别差异
在当今这个移动互联网时代,iOS和Android作为两大主流操作系统,它们在测试应用程序时存在哪些差异呢?这不仅是一个技术问题,也是一个市场策略问题。让我们从一个实际案例开始探讨。 假设我们有一个新的社交应用需要在iOS和Android…...
【Python装饰器深潜】从语法糖到元编程的艺术
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...
Kubernetes中微服务JVM监控与自动发现的解决方案
以下是针对 Kubernetes 中微服务 JVM 监控与自动发现的解决方案,结合 Prometheus 的动态发现机制和 Spring Boot 的监控能力,解决 Pod IP 动态变化和当前微服务监控数据暴露匿名随意访问的安全问题。 一、微服务端配置(Spring Boot 微服务) 1. 依赖配置(pom.xml) <…...
mapbox进阶,纯前端geojson转shape,并将shape相关文件压缩成zip压缩包并下载
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀纯前端geojson转…...
Oracle ASM Rebalance Power 了解
Oracle ASM Rebalance Power 了解 基本概念 ASM (Automatic Storage Management) 的 Rebalance Power 参数控制磁盘组重新平衡操作的速度和资源使用。当添加、删除或调整 ASM 磁盘时,ASM 会自动执行重新平衡操作来重新分布数据。 ASM_POWER_LIMIT 参数 作用 控…...
sqlite的拼接字段的方法(sqlite没有convert函数)
我在sqlserver 操作方式: /// <summary>///获取当前门店工资列表/// </summary>/// <param name"wheres">其他条件</param>/// <param name"ThisMendian">当前门店</param>/// <param name"IsNotU…...
深入解析 OpenManus:开源 AI 智能体框架的技术原理与实践
深入解析 OpenManus:开源 AI 智能体框架的技术原理与本地部署指南 在当今人工智能快速发展的时代,智能体(Agent)技术正逐渐成为推动自动化和智能化的关键力量。OpenManus,由 MetaGPT 团队开发的开源 AI 智能体框架&am…...
[面试精选] 0001. 两数之和
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 1. 两数之和 - 力扣(LeetCode) 2. 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个…...
CAP分布式理论
CAP分布式理论 文章目录 CAP分布式理论事务本地事务定义适用场景优点缺点 分布式事务一、分布式事务的定义二、分布式事务的标准与 CAP 理论的关系1. CAP 理论的核心内容2. CAP 理论对分布式事务的指导意义3. 分布式事务的其他关键标 三、总结:CAP 理论与分布式事务…...
如何管理和优化内核参数
Linux 系统中的内核参数(Kernel Parameters)对系统的性能、安全性和稳定性有很大影响。通过调整内核参数,可以优化系统性能、增强网络能力、调整内存管理等。管理和优化内核参数通常涉及以下几个步骤: 1. 查看当前内核参数 在 L…...
sgRNA的靶基因基因组如何获得? for 下游的 T7E1验证
愿武艺晴小朋友一定得每天都开心! 1)在基因组,靶标区域上下游,设计引物(以Zfp532基因为例): a. NCBI(Home - Gene - NCBI)Gene 页面上输入:Zfp532。 b. 在新…...
人工智能+:职业价值的重构与技能升级
当“人工智能”成为产业升级的标配时,一个令人振奋的就业图景正在展开——不是简单的岗位替代,而是职业价值的重新定义。这场变革的核心在于,AI并非抢走工作机会,而是创造了人类与技术协作的全新工作范式。理解这一范式转换的逻辑…...
【前端开发】Uniapp日期时间选择器:实现分钟动态步长设置
技术栈 Uniapp Vue3 uView年份显示前后一年,分钟动态设置间隔 效果图 主体显示 <view class"uni-row selector" click"openPicker"><uni-icons color"#c0c4cc" type"calendar" size"22"></uni-…...