当前位置: 首页 > news >正文

【C++进阶篇】二叉搜索树的实现(赋源码)

掌握二叉搜索树:从基础知识到实际应用的全貌

  • 一. 二叉搜索树简介
    • 1.1 基本概念
    • 1.2 意义与价值
    • 1.3 典型应用场景
    • 1.4 性能分析
    • 1.5 总结与展望
  • 二. 搜索二叉树实现
    • 2.1 插入
    • 2.2 查找
    • 2.3 删除
      • 2.3.1 单或无孩型
      • 2.3.2 双孩型
      • 2.3.4 整合代码
  • 三. ⼆叉搜索树key和key/value使⽤场景
    • 3.1 仅使用键(Key)的场景
    • 3.2 使用键值对(Key/Value)的场景
    • 3.3 key/value改装代码
      • 3.3.1 统计次数测试
  • 四. 最后

二叉搜索树作为计算机科学的核心数据结构,凭借其动态有序性和高效操作,已成为数据库、编译器、NLP等领域的基石。随着自平衡技术、分布式计算和机器学习的融合,BST将在未来持续进化,为海量数据处理、实时系统优化等场景提供更强大的支持。无论是传统软件优化还是新兴技术落地,BST的潜力远未穷尽。

一. 二叉搜索树简介

1.1 基本概念

二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,满足以下性质:

  1. 左子树所有节点的值均小于根节点值;
  2. 右子树所有节点的值均大于根节点值;
  3. 左右子树本身也是二叉搜索树。
  • 其核心优势在于:
  1. 中序遍历可得到一个升序序列;
  2. 平均时间复杂度为 O(log n),支持高效查找、插入和删除操作。

1.2 意义与价值

  1. 动态数据管理
  • 相比静态有序数组的二分查找(O(log n)),BST 支持动态插入和删除,且无需像链表一样线性遍历,兼顾了链表的灵活性和数组的快速访问特性。
  1. 自平衡扩展性
  • 通过红黑树、AVL树等自平衡变体,解决了BST退化为链表(时间复杂度退化至O(n))的问题,确保在频繁操作下仍保持高效。
  1. 天然有序性
  • 中序遍历直接生成有序序列,适用于需要范围查询或排序的场景。

1.3 典型应用场景

  1. 数据库索引
  • 加速键值查询(如按主键查找记录),避免全表扫描。
    示例:MySQL的InnoDB引擎使用B+树(BST的扩展)管理索引。
  1. 编译器符号表
  • 存储变量名及其属性(类型、作用域),支持快速查找和更新。
  1. 自然语言处理(NLP)
  • 构建词汇表,优化词汇统计和分析(如词频统计、拼写检查)。
  1. 动态集合管理
  • 实时排行榜、任务队列等需要频繁插入/删除且保持有序的场景。
  1. 文件系统与共享软件
  • 按文件名、时间戳等属性组织文件,支持快速检索和动态更新(如阿里云开发者社区案例)。

1.4 性能分析

如下图:通过该图分析一下,并总结得出结论。
在这里插入图片描述
2 h 2^h 2h-1=N,注这里的h表示树的高度,N表示树中的节点个数。
h = log ⁡ 2 ( N + 1 ) h = \log_2 (N + 1) h=log2(N+1),根据时间复杂度的规则,常数给省略,即 h = log ⁡ 2 N h = \log_2 N h=log2N

  • 最优情况下,二叉搜索树转化成完全二叉树,其高度为 h = log ⁡ 2 N h = \log_2 N h=log2N
    如下图:
    在这里插入图片描述
    高度为: h = N-1,。
  • 最差情况下,二叉搜索树退化为单支树。
    综上而言,二叉搜索树增删查时间复杂度为O(N),以最差的情况算时间复杂度。
    补充:二分查找也可以时间O( l o g 2 N log_2 N log2N)级别效率,但存在两大缺陷:
  • 需要支持下表随机访问,并且有序
  • 插入,删除效率低,涉及移动数据

1.5 总结与展望

随着大数据时代的到来,自然语言处理、图像识别等领域需要快速高效的数据存储和检索机制。尽管二叉搜索树在某些情况下存在平衡性问题,未来可能会结合自平衡的树结构(如AVL树、红黑树)来改进性能。此外,随着并行计算技术的发展,研究如何在分布式系统中应用二叉搜索树的思想,将是一个重要的研究方向。
在智能算法和机器学习领域,二叉搜索树的基本原则也可能被拓展和应用于更复杂的模型和数据结构中。总的来说,二叉搜索树作为一种基础的数据结构,具有广泛的应用前景和深远的研究意义。

二. 搜索二叉树实现

2.1 插入

插入过程思考步骤:

  1. 树如果为空,直接将该节点赋值给根指针_root
  2. 树不为空,插入的值比根节点大,往右走,因为左节点的值都比根节点的值小;插入的值比根节点小,往左走,因为右节点的值都比根节点的值大,最后将该节点与父节点进行连接。细节:需要注意判断当前节点的值与父节点的值大小进行比较,不可根据本能反应差左边还是右边。
  3. 如果⽀持插⼊相等的值,插⼊值跟当前结点相等的值可以往右⾛,也可以往左⾛,找到空位置,插⼊新结点。(要注意的是要保持逻辑⼀致性,插⼊相等的值不要⼀会往右⾛,⼀会往左⾛)
  • 示例代码:
bool Insert(const K& key)
{if (_root == nullptr){_root = new Node(key);return true;}Node* cur = _root;Node* parent = nullptr;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);if (parent->_key > key)parent->_left = cur;if (parent->_key < key)parent->_right = cur;return true;//表示插入成功
}

2.2 查找

这个过程就简单了,当前要查的节点的值与根节点的值进行比较,比它大的往右走,反之往左走;走到空,就没找到,返回false即可,否则返回true,表示找到了。

  • 示例代码:
bool 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 true;//找到了}}return false;//未找到
}

2.3 删除

2.3.1 单或无孩型

删除过程相对较复杂,别担心,小编一步一步带入大家学习并掌握它。
下面以几张图片来讲解过程,如下:
在这里插入图片描述
先查找该节点的值是否存在该搜索二叉树中,存在才进行删除,不存在什么也不做。
比如:

  • 删除1,1的左右孩子结点都为空,将父节点(3)指向空即可
  • 删除10,将父亲节点(8)指向10的右节点,因为10的左节点为空。

在这里插入图片描述
先查找该节点的值是否存在该搜索二叉树中,存在才进行删除,不存在什么也不做。
比如:

  • 删除14,14的左孩子结点不为空,将14的父节点(10)指向14的左节点即可,因为14节点的右为空,所以在指向前需判断,不可盲目的连接。
    通过上述分析无孩型可以规定至单孩型,处理过程一致:
  • 通过上述分析得出的伪代码如下(该代码有问题):
bool Erase(const K& key)
{Node* cur = _root;Node* parent = nullptr;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 == parent->_right){parent->_right = cur->_right;}else{parent->_left = cur->_right;}delete cur;}else if (cur->_right == nullptr){//右为空,父亲指向我的左if (cur == parent->_right){parent->_right = cur->_left;}else{parent->_left = cur->_left;}delete cur;}else{//...}return true;}}return false;
}

上述代码有没有问题???
我们来看加入我们删除8这个节点,会有什么问题,parent为空,在else进行解引用,程序必崩溃。
如何解决???
如果当前根节点左为空,且正要删除根节点,重新将根节点的右节点当做根节点即可,在释放旧的根节点;当前根节点右为空,且正要删除根节点,重新将根节点的左节点当做根节点即可,在释放旧的根节点,否则再让父节点指向要删除节点的左或右节点。

  • 示例代码如下:
bool Erase(const K& key)
{Node* cur = _root;Node* parent = nullptr;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->_right){parent->_right = cur->_right;}else{parent->_left = cur->_right;}}delete cur;}else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{//右为空,父亲指向我的左if (cur == parent->_right){parent->_right = cur->_left;}else{parent->_left = cur->_left;}}delete cur;}else{//...}return true;}}return false;
}

2.3.2 双孩型

当删除的节点既有左孩子又有右孩子,使用替代法。
在这里插入图片描述
找个符合二叉搜索树规则的节点来替代,

  1. 找当前节点左子树最大节点的值来替代
  2. 找当前节点右子树最小节点的值来替代

为什么行???
因为左子树节点最大的值,比左子树所有节点的值都大,比右子树所有节点的值都小,可能站稳脚跟。本篇以第二种为例:
假如删除3,从右子树找最小的值4,从右子树的当前根节点,一直去左子树找,因为最小值在左子树,找到4,再将最小节点的值与当前正要删除节点的值(3)进行替换,从而转化成间接删除3这个节点。注意旧节点的右子树不一定为空。

  • 示例代码:
else
{//找右子树最小的最小节点,进行交换,间接删除要删除的节点。Node* minright = cur->_right;Node* minrightparent = cur;while (minright->_left){minrightparent = minright;minright = minright->_left;}cur->_key = minright->_key;//交换值,达到删除的目的if (minright == minrightparent->_right){minrightparent->_right = minright->_right;}else{minrightparent->_left = minright->_right;}delete minright;
}

2.3.4 整合代码

下面的代码是上面分析的整合版。

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->_right){parent->_right = cur->_right;}else{parent->_left = cur->_right;}}delete cur;}else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{// 父亲指向我的左if (cur == parent->_right){parent->_right = cur->_left;}else{parent->_left = cur->_left;}}delete cur;}else{// 找右子树最小节点(最左)替代我的位置Node* minRightParent = cur;Node* minRight = cur->_right;while (minRight->_left){minRightParent = minRight;minRight = minRight->_left;}cur->_key = minRight->_key;if (minRightParent->_left == minRight){minRightParent->_left = minRight->_right;}else{minRightParent->_right = minRight->_right;}delete minRight;}return true;}}return false;
}

三. ⼆叉搜索树key和key/value使⽤场景

3.1 仅使用键(Key)的场景

当数据仅需通过键进行快速查找、排序或范围查询,且无需存储额外数据时,纯键结构更合适。典型场景包括:

  1. 数据库索引
  • 例如:按用户ID快速查找记录,BST可加速主键查询(如MySQL的B+树索引是BST的变种)。
  • 优势:支持范围查询(如 WHERE id BETWEEN 10 AND 20)。
  1. 有序集合维护
  • 例如:实现一个动态排序的排行榜(如游戏高分榜),或自动补全功能(如输入时按字母顺序过滤候选词)。
  • 优势:插入、删除和查找时间复杂度为平均 O(logn)。
  1. 符号表(Symbol Table)的键管理
  • 仅需管理键的存在性(如检查变量名是否已定义),不关心具体值。

3.2 使用键值对(Key/Value)的场景

当需要通过键快速访问关联的额外数据时,键值对结构更适用。典型场景包括:

  1. 缓存系统
  • 例如:Redis、Memcached 使用键值对存储临时数据,通过键快速检索值(如用户会话信息)。
  • 优势:支持高效读写,适合热点数据加速。
  1. 符号表实现
  • 例如:编译器中的符号表,存储变量名(键)及其类型、作用域(值)。
  • 优势:键唯一性保证,值可存储复杂属性。
  1. 配置管理
  • 例如:通过配置键(如 database.url)快速获取配置值,支持动态更新。
  1. 路由表或映射表
  • 例如:网络路由中通过目标IP(键)查找下一跳地址(值)。

3.3 key/value改装代码

仅需在节点中增加value值,Find找到时返回节点的指针,以便对当前key对应的value值进行修改。

  • 示例代码:
namespace key_value
{template<class K, class V>struct BSTNode{K _key;V _value;BSTNode<K, V>* _left;BSTNode<K, V>* _right;BSTNode(const K& key, const V& value):_key(key), _value(value), _left(nullptr), _right(nullptr){}};template<class K, class V>class BSTree{typedef BSTNode<K, V> Node;public: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->_right){parent->_right = cur->_right;}else{parent->_left = cur->_right;}}delete cur;}else if (cur->_right == nullptr){if (cur == _root){_root = cur->_left;}else{// 父亲指向我的左if (cur == parent->_right){parent->_right = cur->_left;}else{parent->_left = cur->_left;}}delete cur;}else{// 找右子树最小节点(最左)替代我的位置Node* minRightParent = cur;Node* minRight = cur->_right;while (minRight->_left){minRightParent = minRight;minRight = minRight->_left;}cur->_key = minRight->_key;if (minRightParent->_left == minRight){minRightParent->_left = minRight->_right;}else{minRightParent->_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);}Node* _root = nullptr;};}

3.3.1 统计次数测试

Test.cpp

#include"BStree.h"int main()
{string arr[] = { "苹果","香蕉","香蕉","西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
"苹果", "香蕉", "苹果", "香蕉","香蕉","香蕉" };key_value::BSTree<string, int> countTree;for (auto& e : arr){//key_value::BSTNode<string, int>* ret = countTree.Find(e);auto ret = countTree.Find(e);if (ret == nullptr){countTree.Insert(e, 1);}else{ret->_value++;}}countTree.InOrder();return 0;
}

输出结果:
在这里插入图片描述

四. 最后

本文介绍二叉搜索树(BST)是动态有序数据结构,通过左小右大性质实现高效增删查改(平均O(log n)),但最差退化为O(n)。其核心价值体现在:1)数据库索引、编译器符号表等需快速范围查询场景;2)自平衡变体(如红黑树)解决退化问题,保障高频操作性能;3)键值对扩展支持缓存系统、配置管理等关联数据场景。本文详述了BST的插入、查找、删除实现(含单/双子节点处理),并通过词频统计案例演示键值对应用。随着技术发展,BST与自平衡、分布式计算的融合将持续赋能实时系统与大数据处理。

相关文章:

【C++进阶篇】二叉搜索树的实现(赋源码)

掌握二叉搜索树&#xff1a;从基础知识到实际应用的全貌 一. 二叉搜索树简介1.1 基本概念1.2 意义与价值1.3 典型应用场景1.4 性能分析1.5 总结与展望 二. 搜索二叉树实现2.1 插入2.2 查找2.3 删除2.3.1 单或无孩型2.3.2 双孩型2.3.4 整合代码 三. ⼆叉搜索树key和key/value使⽤…...

LLMs 其他 Trick

huggingface 下载不了模型问题&#xff1f; from modelscope.hub.snapshot_download import snapshot_download model_dir snapshot_download(damo/nlp_xlmr_named-entity-recognition_viet- ecommerce-title, cache_dirpath/to/local/dir, revisionv1.0.1) 方法一&#xff1…...

2025年金融创新、区块链与信息技术国际会议(FRCIT 2025 2025)

2025 International Conference on Financial Innovation, Regional Chains, and Information Technology &#xff08;一&#xff09;会议信息 会议简称&#xff1a;FRCIT 2025 大会地点&#xff1a;中国郑州 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Schola…...

rtty操作记录说明

rtty操作记录说明 前言 整理资料发现了几年前做的操作记录&#xff0c;分享出来&#xff0c;希望对大家有用。 rtty-master&#xff1a;rtty客户端程序&#xff0c;其中buffer\log\ssl为源码的子目录&#xff0c;从git上下载https://github.com/zhaojh329&#xff0c; rtty…...

股指期货是什么?有啥特点?怎么用?

股指期货&#xff0c;英文简称SPIF&#xff0c;全称是股票价格指数期货&#xff0c;也叫股价指数期货、期指。简单来说&#xff0c;它就是以股价指数为“赌注”的一种期货合约。想象一下&#xff0c;你和朋友打了个赌&#xff0c;约定在未来的某个日子&#xff0c;按照事先说好…...

提示词设计模板(基于最佳实践)

1. 任务清晰化 模糊指令 ➜ 明确指令 ❌ "写一篇关于环保的文章" ✅ *"列出5种城市环保措施&#xff0c;并分别说明其对减少碳排放的影响&#xff08;要求&#xff1a;数据支持案例&#xff09;"* 2. 任务步骤化 案例&#xff1a;策划线上营销活动 1.…...

涌现理论:连接万物的神秘力量

一、理论起源与概述 现象引介&#xff1a;通过蜂群“风浪”&#xff08;蜜蜂抖动翅膀呈波浪式扩散&#xff09;、鱿鱼变色捕猎等生物现象&#xff0c;引出涌现理论。理论定义&#xff1a;涌现理论可有效介入复杂问题&#xff0c;解释事物起源&#xff0c;适用于物理、化学、生…...

9.9 Ollama私有化部署Mistral 7B全指南:命令行交互到API集成全流程解析

Ollama私有化部署Mistral 7B全指南:命令行交互到API集成全流程解析 关键词:Ollama 私有化部署, Mistral 7B 运行, 本地大模型管理, 命令行交互, REST API 集成 一、Mistral 7B 模型特性解析 Mistral 7B 是由 Mistral AI 团队开发的高性能开源大语言模型,在同等参数量级模型…...

【Redis 进阶】缓存

思维导图&#xff1a; 1. 缓存的基本概念 1.1 缓存的实例化解释 以火车站刷身份证为例&#xff0c;身份证存放在皮箱中虽安全&#xff0c;但取用不便&#xff1b;而将其置于衣袋&#xff0c;则显著提高了访问效率。这一过程恰似计算机系统中缓存的运作机制——将常用数据暂存于…...

游戏资源传输服务器

目录 项目简介项目实现nginx配置服务器逻辑图 项目代码简介reactor 模型部分文件传输部分 项目演示视频演示演示分析 项目简介 使用C开发&#xff0c;其中资源存储在fastdfs 中&#xff0c;用户通过http上传或下载资源文件&#xff0c;此项目需要开启nginx中的nginx-upload-mod…...

dockerdesktop 重新安装

1、卸载 dockerdesktop 卸载时&#xff0c;最后一步删除镜像文件 会卡住 取消 2、在资源管理器中将镜像文件路径改名 如&#xff1a;e:\docker 修改 e:\docker1 3、重新安装wsl wsl --shutdown 以管理员身份运行hy.bat pushd "%~dp0" dir /b %SystemRoot%\servic…...

免费实用的远程办公方案​

假如你需要快速检索出远程电脑文件并下载&#xff1f; 假如你需要访问远程电脑的共享文件夹&#xff1f; 假如你需要访问远程电脑的USB设备&#xff0c;例如软件加密狗、调试器、固件烧录器、U盘等&#xff1f; 本篇文章能够解决以上痛点。 这个方案非常实用&#xff0c;也很…...

论文知识总结

参考1 一 Intelligent reflecting surface (IRS)跟RIS区别是什么 Intelligent Reflecting Surface (IRS) 和 Reconfigurable Intelligent Surface (RIS) 在很多情况下所指相同或相近&#xff0c;常被视为同一类技术的不同表述&#xff0c;但在一些特定语境下也有细微区别&…...

WebGIS 开发黑科技:解锁地理信息的新视界

你能想象吗&#xff1f;在我们生活的这个广袤星球上&#xff0c;每一处角落的地理信息&#xff0c;竟能通过网页&#xff0c;以超乎想象的方式呈现在眼前。WebGIS&#xff0c;这个看似神秘的词汇&#xff0c;实则是当下地理信息领域的 “黑科技”。它究竟有何神奇魔力&#xff…...

Postman启动时检测到版本不匹配错误

Postman启动时检测到版本不匹配错误&#xff0c;提示&#xff1a;Version mismatch detected. Looks like youve used a newer version of the Postman app on this system. 找到 C:\Users\AppData\Local\Postman C:\Users\AppData\Roaming\Postman 并删除现有的 postman 文件夹…...

Java Spring MVC -01

SpringMVC 是一种基于 的实现 MVC 设计模式的请求驱动类型的轻量级 Web 框架&#xff0c;属于 Spring FrameWork 的后续产品&#xff0c;已经融合在 Spring Web Flow 中。 First:SpringMVC-01-SpringMVC 概述 SpringMVC 是 Spring 框架的一个模块&#xff0c;用于构建 Web 应…...

遨游5G-A防爆手机:赋能工业通信更快、更安全

在工业数字化转型与5G-A商用进程加速的双重驱动下&#xff0c;中国防爆手机市场正迎来历史性发展机遇。作为“危、急、特”场景通信解决方案服务商&#xff0c;遨游通讯深刻洞察到&#xff1a;当5G-A网络以超高速率、海量连接和毫秒级时延重塑行业生态时&#xff0c;防爆手机这…...

MySQL 8.0 OCP 1Z0-908 51-60题

Q51.Examine this parameter setting: audit_logFORCE_LOG_PERMAENT What effect does this have on auditing? A)It will force the load of the audit plugin even in case of errors at server start.//插件在之前就必须加载完成&#xff0c;只有当插件之前通过 INSTALL PL…...

javax.servlet.Filter 介绍-笔记

1.javax.servlet.Filter 简介 javax.servlet.Filter 是 Java Servlet API 中的一个核心接口&#xff0c;用于在请求到达目标资源&#xff08;如 Servlet 或 JSP&#xff09;之前或响应返回给客户端之前执行预处理或后处理操作。它常用于实现与业务逻辑无关的通用功能&#xff…...

【2025年前端高频场景题系列】使用同一个链接,如何实现PC打开是web应用、手机打是-个H5 应用?

面试情境与问题引入 哈喽大家伙,我是布鲁伊。在前端开发面试中,面试官经常会抛出一些看似简单却能考察多方面能力的问题。"如何实现同一个链接在PC端和移动端展示不同应用?"就是这样一个典型问题。为什么面试官喜欢问这个问题?因为它能同时考察候选人的设备适配…...

GPT 经验

GPT 经验篇 一、gpt源码past_key_value是干啥的&#xff1f;二、gpt onebyone 每一层怎么输入输出&#xff1f;三、bert和gpt有什么区别四、文本生成的几大预训练任务&#xff1f;五、讲讲T5和Bart的区别&#xff0c;讲讲bart的DAE任务&#xff1f;六、讲讲Bart和Bert的区别&am…...

uniapp|实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,拍照保存至相册,多端兼容(APP/微信小程序)

基于uniapp以及微信小程序实现移动端人脸识别相似度对比,实现摄像头、相册权限获取、相机模块交互、第三方识别集成等功能,附完整代码。 目录 核心功能实现流程摄像头与相册权限申请权限拒绝后的引导策略摄像头调用拍照事件处理人脸识别集成图片预处理(Base64编码/压缩)调用…...

蓝桥杯13届国B 出差

题目描述 A、B、C、D四个人中要派两个人出差&#xff0c;按下述三个条件有几种安排方案&#xff0c;如何安排。 (1) 若A去&#xff0c;则C和D中要去一人。 (2) B和C不能都去。 (3) C去则D要留下。 输入描述 本题无输入。 输出描述 按字典序输出所有符合要求的安排方案&…...

论软件设计模式及其应用

三、正文 摘要 2023年 3 月&#xff0c;我所在的公司承接了某油企智慧加油站平台的建设工作。该项目旨在帮助加油站提升运营效率、降低运营成本和提高销售额。我在该项目中担任系统架构设计师&#xff0c;负责整个系统的架构设计工作。本文以该项目为例&#xff0c;详细论述了…...

实现 STM32 PWM 输出:原理、配置与应用详解

实现 STM32 PWM 输出&#xff1a;原理、配置与应用详解 在嵌入式开发领域&#xff0c;STM32 微控制器凭借其强大的功能和丰富的外设资源&#xff0c;被广泛应用。PWM&#xff08;脉冲宽度调制&#xff09;作为 STM32 的重要功能之一&#xff0c;对于电机调速、LED 调光、信号合…...

优艾智合机器人助力半导体智造,领跑国产化替代浪潮

在全球半导体产业加速自动化转型的背景下&#xff0c;传统物流已成为制约智能化升级的关键瓶颈。作为中国移动机器人行业的领军企业&#xff0c;优艾智合&#xff08;YOUIBOT&#xff09;自2017年起就敏锐洞察到"半导体设备国产化"的紧迫需求&#xff0c;依托在工业移…...

Pytorch张量和损失函数

文章目录 张量张量类型张量例子使用概率分布创建张量正态分布创建张量 (torch.normal)正态分布创建张量示例标准正态分布创建张量标准正态分布创建张量示例均匀分布创建张量均匀分布创建张量示例 激活函数常见激活函数 损失函数(Pytorch API)L1范数损失函数均方误差损失函数交叉…...

【RabbitMQ】工作队列和发布/订阅模式的具体实现

文章目录 建立连接工作队列模式实现创建队列和交换机生产者代码消费者代码运行程序启动消费者启动生产者 发布/订阅模式实现创建队列和交换机生产者代码创建交换机声明两个队列绑定队列和交换机发送消息完整代码 消费者代码完整代码 运行程序启动生产者启动消费者 建立连接 我…...

loki grafana 页面查看 loki 日志偶发 too many outstanding requests

问题描述 grafana 页面查看 loki 日志偶然出现 too many outstanding requests loki pod 日志报错 levelerror ts2025-05-13T06:15:52.509738812Z callerscheduler_processor.go:158 org_idfake traceID1570d49e6d15b25c msg"error notifying scheduler about finished …...

Python之with语句

文章目录 Python中的with语句详解一、基本语法二、工作原理三、文件操作中的with语句1. 基本用法2. 同时打开多个文件 四、with语句的优势五、自定义上下文管理器1. 基于类的实现2. 使用contextlib模块 六、常见应用场景七、注意事项 Python中的with语句详解 with语句是Python…...

tomcat搭建内网论坛

准备工作&#xff1a; 准备jdk-8u291-linux-x64.tar.gz压缩包与apache-tomcat-9.0.16.tar.gz压缩包。 jdk安装&#xff1a; tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/ cd /usr/local/ ln -s jdk1.8.0_291/ jdk vim /etc/profile.d/jdk.sh cat /etc/profile.d/jdk.s…...

基于开源AI大模型AI智能名片S2B2C商城小程序的零售结算技术创新研究——以京东AI与香港冯氏零售集团智能结算台为例

摘要&#xff1a;本文以京东AI与香港冯氏零售集团共同打造的人工智能结算台为切入点&#xff0c;结合开源AI大模型、AI智能名片及S2B2C商城小程序的技术特性&#xff0c;深入探讨其在零售结算领域的创新应用。研究发现&#xff0c;开源AI大模型为智能结算提供了强大的图像识别与…...

supabase 怎么新建项目?

在 Supabase 中新建项目主要通过官方网站的仪表盘 (Dashboard) 来完成。以下是详细步骤&#xff1a; 通过 Supabase 仪表盘新建项目&#xff1a; 注册/登录 Supabase 账户&#xff1a; 访问 Supabase 官网&#xff1a;https://supabase.com/如果你还没有账户&#xff0c;点击 …...

框架篇八股(自用)

框架篇 Spring框架中的bean不是线程安全的 Scope&#xff08;&#xff09; singleton单例 prototype多例 一个类中有可修改的成员变量需要考虑线程安全 bean没有可变状态&#xff08;service类&#xff0c;DAO类&#xff09; 某种程度单例bean是线程安全的 AOP面向切面编程…...

Flask Docker Demo 项目指南

首先&#xff0c;创建一个新的项目目录并创建必要的文件&#xff1a; mkdir flask-docker-demo cd flask-docker-demo创建一个简单的Flask应用 (app.py)&#xff1a; from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, Docker World…...

蓝卓AI智能体平台

在数字化浪潮席卷全球的今天&#xff0c;制造业企业正面临前所未有的挑战&#xff1a;如何将海量数据转化为精准决策&#xff1f;如何让传统生产流程具备“自进化”的智能&#xff1f;如何打破数字化与智能化之间的鸿沟&#xff1f;蓝卓数字科技凭借对工业场景的深刻理解&#…...

typedef unsigned short uint16_t; typedef unsigned int uint32_t;

你提到的这两行是 C/C 中的类型别名定义&#xff1a; typedef unsigned short uint16_t; typedef unsigned int uint32_t;它们的目的是让代码更具可读性和可移植性&#xff0c;尤其在处理精确位数的整数时非常有用。 ✅ 含义解释 typedef unsigned short uint16_t;…...

黑马k8s(五)

1.Namespace 2.Pod run nginx&#xff1a;nginx是pod控制器的名称&#xff0c;不是pod的名称 查看pod更高的参数&#xff1a; 启动一个不存在的镜像&#xff1a;pod 查看 dev下面的pod&#xff0c;第二个pod处于容器创建的状态 查看pod的详情描述&#xff1a; 通过pod的ip&…...

进程间通信分类

前提&#xff1a; 进程具有独立性&#xff0c;要通信就是要让它们&#xff1a;看到同一份资源&#xff08;某种形式的内存空间&#xff0c;操作系统提供&#xff09; 本地通信&#xff1a;同一台主机&#xff0c;OS&#xff0c;用系统调用通信。标准&#xff1a;systemV。 S…...

uniapp-商城-56-后台 新增商品(弹窗属性继续分析)

1、概述 前面我们讲了布局和相应商品属性的页面布局。属性是一个弹窗&#xff0c;它是一个cell的组件的实现属性。点击该cell就会调用uni-popup 进行弹窗。基本的页面布局如下&#xff1a; 属性显示其实是个一嵌套的数据显示。 2 页面显示商品属性 点击添加属性 2.1 代码如…...

奇怪的公式

奇怪的公式 背景导入 在剑桥大学&#xff0c;瞥了一眼下面这个公式&#xff0c;我眩晕了&#xff0c;庆幸自己没学数学专业。 1 2 3 4 ⋯ − 1 12 1234\dots -\frac{1}{12} 1234⋯−121​ 一天&#xff0c;剑桥大学教授哥德弗雷哈代收到一封来自印度的信。写信人叫拉马…...

web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构&#xff1f;1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...

golang 定时器

写法一&#xff1a; package mainimport ("fmt""sync""time" )type DemoTicker struct {ch <-chan time.Timestop chan struct{}sg *sync.WaitGroup }func main() {count, stopCount : 0, 5demo : DemoTicker{ch: time.Tick(time.Seco…...

ETL 数据集成平台与数据仓库的关系及 ETL 工具推荐

数字化时代企业每天都会产生海量的数据&#xff0c;这些数据分散在不同的系统、数据库和应用中。为了能够有效地利用这些数据&#xff0c;进行数据分析、商业智能决策等&#xff0c;ETL数据集成平台和数据仓库成为了企业数据管理架构中的关键组成部分。本文将深入探讨ETL数据集…...

java架构设计

1.可维护性 封装性&#xff0c;例如将缓存redis封装到一个service&#xff0c;别的地方用到&#xff0c;只需要传参调用就行。如果有一天换国产缓存&#xff0c;只需要修改service&#xff0c;而不需要修改多出引用地方 * 可维护性&#xff1a;后期功能迭代&#xff0c;不可避…...

UDP--DDR--SFP,FPGA实现之指令监测模块实现

指令监测模块实现介绍 如下图所示&#xff0c;为指令监测模块的运行框图 将指令设置为8bytes数据&#xff0c;故需要一个64位寄存器进行缓存&#xff0c;在进行数据缓存时&#xff0c;数据不可以输出至下一级模块&#xff0c;故对数据和有效指示信号也应该进行相应延迟&#…...

Houdini安装SideFX Labs工具架

开源免费的 https://github.com/sideeffects/SideFXLabs/releases 下载后解压 放到文档里 新建一个packages文件夹 把SideFXLabs.json 复制到packages文件夹 删除一些没用的平台 修改相关路径即可 然后就能在houdini里搜到 autouv 节点 不然没装是没有这个节点的 参考教程 …...

uniapp+vue3+uview来开发我们的项目

前言&#xff1a; 就像我们vue的web的框架element、iview等一样&#xff0c;我们的uni-app开发也有适合的他的框架&#xff0c;除了他本身的扩展组件以外&#xff0c;第三方好用的就是就是uview了。 实现效果&#xff1a; 官网信息&#xff1a; vue2版本&#xff1a;uview-ui …...

MySQL 5.7在CentOS 7.9系统下的安装(上)——以rpm包的形式下载mysql

这里我们主要以CentOS 7.9为例进行介绍&#xff0c;会顺带讲讲Ubuntu的操作方式。 目录 一、检查自己的机器上是否安装有MySQL&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;检查系统中是否有正在运行的MySQL服务&#xff1a; &#xff08;2&#xff09; 检查当…...

【图像处理基石】什么是油画感?

在图像处理中&#xff0c;“油画感”通常指图像呈现出类似油画的块状纹理、笔触痕迹或色彩过渡不自然的现象&#xff0c;表现为细节模糊、边缘不锐利、颜色断层或人工纹理明显。这种问题常见于照片处理、视频帧截图或压缩后的图像&#xff0c;本质是画质受损的一种表现。以下是…...