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

二叉搜索树

目录

概念

代码实现

成员

 基本结构

查找

插入

 删除

中序遍历

拷贝构造

赋值运算符重载

析构函数

递归实现

递归实现查找

递归实现插入

递归实现删除


概念

关于二叉树的基本结构已经进行过详细剖析,本篇博客将对一种特殊的二叉树进行分析。

二叉树(C语言)_二叉树 csdn-CSDN博客文章浏览阅读1.4k次,点赞22次,收藏21次。帮助读者快速掌握树这一数据结构,了解堆的功能,能够实现堆排序,以及如何再大量数据中快速找到前K个最大元素,如何处理普通二叉树,普通二叉树的遍历等知识。_二叉树 csdn https://blog.csdn.net/2401_87944878/article/details/145262931

二叉搜索树在二叉树的基础上,有三个要求。

1)若一个节点的左树不为空,则其左树的所有节点要小于该节点;

2)若一个节点的右树不为空,则其右树的所有节点要大于该节点;

3)一个节点的左右树也是搜索二叉树。

以上就是一个二叉搜索树。

二叉搜索树在对数据进行查找的时候效率很高,对于一个完全二叉树或趋于完全二叉树的结构,其查找的效率可以达到O(logN),但是如果一个二叉树在使用的时候退化成一个单叉树的时候,其结构就类似于一个链表,查找效率就变成了O(N)。

平衡二叉搜索树会解决搜索二叉树退化的问题。在AVL树中会详细讲解。

关于搜索二叉树的底层在下面的代码实现中会进行详细分析。 


代码实现

二叉搜索树有两个模型:1)key模型;2)key_value模型;

key模型主要是对单个数据进行排序的;key_value模型是在对key排完序后,可以通过key查找到另一个value模型。

比如:key模型会用在快速判断一个事物存不存在,比如小区门禁,通过信息进行排序,快速寻找访客是不是户主;key_value 会用在像电子字典上,将单词排序后,在查找key中的英文时,也能读取value中存储的含义。

下面代码会进行key_value模型的实现。


成员

在C++中有一个类是专门用来存储key和value值的,叫做pair;该模型也是专门为map设计的,此处写代码时就直接使用了。

pair - C++ Referencehttps://legacy.cplusplus.com/reference/utility/pair/?kw=pair

关于pair的构造,有两种:1)可以通过一个函数make_pair创建对象来实现构造。

2)在C++11后支持多参数的构造,但是需要{}进行构造。

pair<int, int> p;
pair<string, int> p2(make_pair("make", 1));  //通过函数make_pair进行构造
pair<int, int> p1({ 1,2 });                 //多参数构造

 基本结构

与二叉树的主要区别在与:搜索二叉树的成员时pair对象。

template<class K ,class V>
struct BSTreeNode    //二叉树的每一个节点
{//构造函数BSTreeNode(const pair<K,V>& vk):_vk(vk), left(nullptr), right(nullptr){}pair<K, V> _vk;    //储存key和value的容器BSTreeNode* left;   //左节点BSTreeNode* right;   //右节点};template<class K, class V>
class BSTree
{typedef BSTreeNode<K, V> BSTreeNode;private:BSTreeNode* _root=nullptr;
};

查找

二叉搜索树满足:左树小,右树大的特点,所以只需要将查找的值和当前节点的值进行对比,就能确定是往左树走,还是往右树走。

当前节点小了,往右树找;当前节点大了,往左树找;只当找到或到空节点。

//查找
bool Find(const pair<K, V> vk)
{BSTreeNode* cur = _root;while (cur){if (cur->_vk.first > vk.first){cur = cur->left;     //当前节点大,往左找}else if (cur->_vk.first < vk.first){ cur = cur->right;    //当前节点小,往右找}else{return true;          //相等,返回}}return false;     //没找到,返回
}

插入

关于二叉搜索树的插入,需要考虑要插入到哪一个位置???     :二叉搜索树是有要求的,在插入数据后还需要满足是二叉搜索树的结构。

二叉搜索树是没有重复数据的,所以不需要考虑找不到位置的情况。那插入的位置必定是空节点。

像查找一样,通过比较来确定节点的位置。当找到位置后,插入即可。

//插入
bool Insert(const pair<K, V>& vk)
{BSTreeNode* newnode = new BSTreeNode(vk);if (_root == nullptr){_root = newnode;return true;}else{BSTreeNode* cur = _root;BSTreeNode* parent = nullptr;   //保存新节点的父节点,保证后续节点的链接while (cur){if (cur->_vk.first > vk.first){parent = cur;cur = cur->left;}else if (cur->_vk.first < vk.first){parent = cur;cur = cur->right;}else{return false;   //相等,说明树中已经有该节点了,不需要再插入}} //循环出来了,说明找到位置了//将新节点插入到指定位置,注意还需要判断其是父节点左子树还是右子树if (parent->_vk.first > vk.first){parent->left = newnode;}else{parent->right = newnode;}return true;}
}

 删除

删除的情况,有三种;

1)删除节点没有左节点:将右节点和父节点链接即可;

2)删除节点没有右节点:将左节点和父节点链接即可;

3)有左右节点:找一个位置能满足当前位置节点得到要求,即比左树都大,比右树都小。这个节点可以是左树的最大值(即左树的最右边),或右树的最小值(即右树的最左边)。

//删除
bool Erase(const pair<K, V> vk)
{BSTreeNode* cur = _root;BSTreeNode* parent = nullptr;while (cur){if (cur->_vk.first > vk.first){parent = cur;cur = cur->left;}else if (cur->_vk.first < vk.first){parent = cur;cur = cur->right;}else{break;   //找到了}}if (cur == nullptr)   //不存在要删除的节点return false;if (cur->left == nullptr)   //左树为空{if (parent == nullptr)  //判断删除节点是否为根节点_root = cur->right;else{if (parent->left == cur)    //是父节点的坐支还是右支parent->left = cur->right;else parent->right = cur->right;}}else if (cur->right == nullptr){if (parent == nullptr) _root = cur->left;else{if (parent->left == cur)   parent->left = cur->left;elseparent->right = cur->left;}}else{//找左树的最大节点BSTreeNode* leftMax = cur->left;BSTreeNode* Maxparent = cur;while (leftMax->right){Maxparent = leftMax;leftMax = leftMax->right;}if (Maxparent->left== leftMax)   //检leftMax是在parent的左还是右{								//如果循环没进去就在左Maxparent->left = leftMax->left;}else{Maxparent->right = leftMax->left;}//将左树的最大节点的vk和要删除节点的vk进行交换即可swap(leftMax->_vk, cur->_vk);//此时leftMax存储的是需要删除的数据cur = leftMax;}delete cur;return true;
}

以上对于左右树都有节点的删除方法是:找左树的最大节点。

下面是找右树的最小节点方法。

else
{//找右树的最小节点BSTreeNode* rightMin = cur->right;BSTreeNode* Maxparent = cur;while (rightMin->left){Maxparent = rightMin;rightMin = rightMin->left;}if (Maxparent->left == rightMin)   //检leftMax是在parent的左还是右{								//如果循环没进去就在左Maxparent->left = rightMin->right;}else{Maxparent->right = rightMin->right;}//将左树的最大节点的vk和要删除节点的vk进行交换即可swap(rightMin->_vk, cur->_vk);//此时leftMax存储的是需要删除的数据cur = rightMin;
}               

中序遍历

二叉搜索树通过中序遍历得到的是一个升序数组。

进行中序遍历的时候采用递归的方式进行,所以参数需要传_root才行,但是对于类外是不能访问_root的,所以此处通过函数调用函数来实现。

public://中序遍历void InOrder(){_InOrder(_root);}private:void _InOrder(BSTreeNode* _root){if (_root == nullptr)return;if(_root->left)_InOrder(_root->left);cout << _root->_vk.first << " " << _root->_vk.second << endl;if(_root->right)_InOrder(_root->right);}

拷贝构造

拷贝构造可以直接通过前序遍历即可。

public://拷贝构造BSTree(BSTree<K, V>& tree){_root=_BSTree(tree._root);}private:BSTreeNode* _BSTree(const BSTreeNode* root){if (root == nullptr)return nullptr;BSTreeNode* _root = new BSTreeNode(root->_vk);_root->left = _BSTree(root->left);_root->right = _BSTree(root->right);return _root;}

赋值运算符重载

赋值可以直接运用形参是实参的拷贝来实现。

//赋值运算符重载
BSTree& operator=(BSTree tmp)
{swap(tmp._root, _root);  //形参是实参的拷贝,所以直接将形参和要赋值的树交换即可return *this;
}

析构函数

析构函数需要用后序遍历来实现。

public:~BSTree(){_Destory(_root);}private:void _Destory(BSTreeNode* root){if (root == nullptr)return;_Destory(root->left);_Destory(root->right);free(root);}

以上代码中某些方法的实现其实可以使用递归来实现,但是为了易于理解采用了非递归的思想方法。下面对部分代码用递归的方法实现。

递归实现

递归实现查找

递归查找与非递归一样,只需要对节点的key值进行分类即可。

public:bool _Find(const pair<K, V>& vk){return _FindR(_root, vk);}private:bool _FindR(const BSTreeNode* root, const pair<K, V>& vk){if (root == nullptr)return false;if (root->_vk.first == vk.first)return true;if (root->_vk.first > vk.first){return _FindR(root->left, vk);}else{return _FindR(root->right, vk);}}

递归实现插入

在递归实现插入的时候,形参直接使用引用就可以不用再去考虑父节点了。

public://递归实现插入bool _Insert(const pair<K, V> vk){return _InsertR(_root, vk);}private:bool _InsertR(BSTreeNode*& _root, const pair<K, V> vk){if (_root == nullptr){_root = new BSTreeNode(vk);return true;}if (_root->_vk.first > vk.first){return _InsertR(_root->left, vk);}else if(_root->_vk.first < vk.first){return _InsertR(_root->right, vk);}else  //相等,不用插入{return false;}}

递归实现删除

递归实现删除并不是完全递归,只是在找位置的时候,使用递归。在删除的时候还是需要分类讨论。

public://递归删除bool _Erase(const pair<K, V> vk){return _EraseR(_root,vk);}
private://递归删除bool _EraseR(BSTreeNode*&root,const pair<K, V> vk){if (root == nullptr)return false;if (root->_vk.first > vk.first){return _EraseR(root->left, vk);}else if (root->_vk.first < vk.first){return _EraseR(root->right, vk);}else{BSTreeNode* del = root;if (root->left == nullptr){root = root->right;}else if (root->right == nullptr){root = root->left;}else{//找到了删除//找左树的最大节点替换BSTreeNode* leftMax = root->left;while (leftMax->right){leftMax = leftMax->right;}swap(root->_vk, leftMax->_vk);return _EraseR(root->left, vk);  //不能直接删除del,这样会导致del节点与父节点                //的联系没有处理}delete del;del = nullptr;return true;}    }

相关文章:

二叉搜索树

目录 概念 代码实现 成员 基本结构 查找 插入 删除 中序遍历 拷贝构造 赋值运算符重载 析构函数 递归实现 递归实现查找 递归实现插入 递归实现删除 概念 关于二叉树的基本结构已经进行过详细剖析&#xff0c;本篇博客将对一种特殊的二叉树进行分析。 二叉树&…...

Linux多线程详解

Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…...

攻防世界-web-1

Training-WWW-Robots 在URL后面加上/robots.txt 直接在URL后面添加/fl0g.php PHP2 他问我能不能登录这个网站&#xff0c;又因为考察php内容&#xff0c;在URL后面添加/index.php&#xff0c;无任何回显 试试/index.phps 分析一下代码&#xff0c;发现要用get方式上传idadmin,…...

笔记本+移动端维修全套教程

今天分享的是笔记本移动端维修全套教程&#xff08;免费视频资料大全&#xff09; 当自己手机或者电脑坏了&#xff0c;很多人都会想着去维修店铺修&#xff0c;但价格不透明&#xff0c;容易被坑&#xff0c;当自己了解一些之后&#xff0c;即使不会修&#xff0c;也可以对手…...

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…...

【STM32】GPIO

目录 1、什么是GPIO2、什么是GPIO组3、GPIO的基本结构4、GPIO位结构5、GPIO八种工作模式6、GPIO相关寄存器1. 端口配置低寄存器GPIO[x]_CRL和端口配置高寄存器GPIO[x]_CRH, Config Register High和Config Register Low)2. 端口输入数据寄存器(GPIO[x]_IDR)3. 端口输出数据寄存器…...

鸿蒙移动应用开发--UI组件布局

实验要求&#xff1a; 制作一个B站视频卡片界面&#xff0c;大致如下图所示&#xff0c;要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 &#xff1a;DevEco Studio 实验过程&#xff1a; 步骤1&#xff1a;创建项目 1. 在您的开发环境…...

[MySQL]MySQL数据库基础知识与操作

MySQL基础知识 为什么要有数据库&#xff1f; 文件存储的缺点 1.没有以某种特定的数据格式存储数据&#xff0c;查找不方便&#xff0c;只能遍历2.安全性&#xff1a;数据误操作后不能回滚3.每次操作数据都要用户自己操作4.数据量大的时候&#xff0c;操作的成本很高 创建一…...

卡诺图化简法的原理

引子 若两个最小项只有一个因子不同&#xff0c;则称这两个最小项具有相邻性。 例如&#xff0c; A ′ B C ′ ABC A′BC′和 A B C ABC ABC两个最小项仅第一个因子不同&#xff0c;所以它们具有相邻性。这两个最小项相加时定能合并成一项并将一对不同的因子消去 A ′ B C ′…...

从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南

本文将深入讲解如何使用Luatools工具烧录一个具体的项目到Air780EPM开发板中。如何使用官方推荐的Luatools工具&#xff08;一款跨平台、命令行驱动的烧录利器&#xff09;&#xff0c;通过“环境配置→硬件连接→参数设置→一键烧录”四大步骤&#xff0c;帮助用户实现Air780E…...

探秘Transformer系列之(18)--- FlashAttention

探秘Transformer系列之&#xff08;18&#xff09;— FlashAttention 文章目录 0x00 概述0.1 问题0.2 其它解决方案0.3 Flash Attention 0x01 背景知识1.1 GPU相关概念硬件概念运行单元内存 软件概念运行模式线程模型Grid & DeviceBlock & SMThread & SPThread &am…...

VUE2导出el-table数据为excel并且按字段分多个sheet

首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…...

Android面试总结之Android RecyclerView:从基础机制到缓存优化

引言 在 Android 开发中&#xff0c;RecyclerView是高效展示列表数据的核心组件。其强大的性能源于独特的视图复用机制和四级缓存体系。本文将结合源码与示例&#xff0c;带你深入理解RecyclerView的工作原理与优化策略。 核心组件 RecyclerView&#xff1a;作为容器视图&am…...

【C#语言】C#文件操作实战:动态路径处理与安全写入

文章目录 ⭐前言⭐一、场景痛点⭐二、完整实现代码⭐三、关键技术解析&#x1f31f;1、动态路径处理&#x1f31f;2、智能目录创建&#x1f31f;3、安全的文件写入 ⭐四、进阶扩展方案&#x1f31f;1、用户自定义路径选择&#x1f31f;2、异常处理增强&#x1f31f;3、异步写入…...

react中 useEffect和useLayoutEffect的区别

useEffect 和 useLayoutEffect 都是 React 中用于处理副作用的 Hook&#xff0c;但它们在执行时机和用途上有一些关键区别。理解这些区别可以帮助你更好地选择适合的 Hook 来实现特定的功能。 1. 执行时机 useEffect&#xff1a; 异步执行&#xff1a;useEffect 是在组件渲染完…...

TDengine 中的系统信息统计

简介 TDengine 3.0 版本开始提供一个内置数据库 performance_schema&#xff0c;Performance_Schema 数据库中存储了系统中的各种统计信息&#xff0c;包括存储及性能有关统计数据。本节详细介绍其中的表和表结构。 PERF_APP 提供接入集群的应用&#xff08;客户端&#xff…...

C++可变参数

可变参数C风格的可变参数C风格可变参数的使用 C11可变参数模板递归展开参数包参数列表展开折叠表达式 STL中的emplace插入接口 可变参数 C风格的可变参数 可变参数是一种语言特性&#xff0c;可以在函数声明中使用省略号...来表示函数接受可变数量的参数。 例如典型的printf…...

建造者模式 (Builder Pattern)

建造者模式 (Builder Pattern) 是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 一、基础 1.1 意图 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 1.2 适用场景 当创建复杂对象的算法应该…...

Thales靶机攻略

1.下载导入VBox&#xff0c;并启动靶机 靶机地址&#xff1a;https://download.vulnhub.com/thales/Thales.zip 解压后&#xff0c;在VBox中导入虚拟电脑。包含所有网卡的MAC地址。 导入完成&#xff0c;设置网卡模式为仅主机网络。开启靶机。 kali网卡更改为桥接模式。点击工…...

【redis】哨兵:搭建主从/哨兵节点详解和细节

文章目录 编排步骤搭建主从节点创建容器启动容器 搭建哨兵节点创建容器哨兵节点配置文件配置节点启动容器 主从/哨兵节点连入同一个局域网 编排步骤 分为两组 yml&#xff0c;先后启动 我们其实也可以用于一个 yml 文件&#xff0c;直接启动 6 个容器&#xff0c;但是&#x…...

零基础上手Python数据分析 (9):DataFrame 数据读取与写入 - 让数据自由穿梭

回顾一下,上篇博客我们学习了 Pandas 的核心数据结构 Series 和 DataFrame。 DataFrame 作为 Pandas 的 “王牌” 数据结构,是进行数据分析的基石。 但 DataFrame 的强大功能,还需要建立在 数据输入 (Input) 和 数据输出 (Output) 的基础上。 数据从哪里来? 分析结果又如何…...

Emacs 折腾日记(十九)——配置输入法和vim操作方式

上一篇文章中&#xff0c;我们将Emacs变得稍微好看了点。换成了自己喜欢的主题和颜色&#xff0c;这样每天用起来也比较养眼&#xff0c;不会特别排斥。本篇文章的主要任务就是配置输入法方便输入中文以及将vim的操作模式搬到Emacs中。进一步提到Emacs的可用性 配置中文输入法…...

Docker 镜像构建与优化

一、Dockerfile 构建镜像 1.1.拉取所需镜像 首先 docker pull 拉取一个 centos7 的镜像。 docker pull centos:7 下载 nginx 源码包。 官网&#xff1a;nginx: download wget https://nginx.org/download/nginx-1.26.3.tar.gz 1.2.解决 CentOS 7 安装源问题 因为原本的 …...

Mininet--moduledeps.py源码解析

整体构架概述 1. What is it moduledeps.py是Mininet网络模拟框架的模块依赖管理工具&#xff0c;用于动态管理Linux内核模块&#xff08;如Open vSwitch、TUN/TAP&#xff09;和验证系统环境。其核心目的是确保Mininet运行所需的底层模块和可执行文件已正确加载或存在&#…...

JAVA EE_多线程-初阶(一)

1.认识线程 1.1概念 1&#xff09;线程是什么 线程是在进程内部中进行运行的&#xff0c;可以把它想成一个“执行流“&#xff0c;每个线程负责执行线程内的部分代码&#xff0c;多个线程之间可以”同时“执行多个代码。 “同时”&#xff1a;指并行&#xff0c;采用分时复用…...

批量优化与压缩 PPT,减少 PPT 文件的大小

我们经常能够看到有些 PPT 文档明明没有多少内容&#xff0c;但是却占用了很大的空间&#xff0c;存储和传输非常的不方便&#xff0c;这时候通常是因为我们插入了一些图片/字体等资源文件&#xff0c;这些都可能会导致我们的 PPT 文档变得非常的庞大&#xff0c;今天就给大家介…...

AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道

文章目录 一、啥是 AI 的 Hallucination&#xff1f;二、啥时候容易出现幻觉&#xff1f;1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现&#xff1f;原理是啥&#xff1f;1. 概率预测的本质2. 训练…...

加载huggingface数据集报token无效错误解决方案

加载huggingface数据集报错 import pandas as pddf pd.read_json("hf://datasets/udell-lab/NLP4LP/data/test.jsonl", linesTrue) print(df)PS C:\Users\pengkangzhen\PythonProjects\llm-ecr> & C:/Users/pengkangzhen/.conda/envs/py3.12_ml/python.exe …...

Java面试题及知识点Day1

自动拆箱和自动装箱 装箱就是自动将基本数据类型转换为包装器类型 拆箱就是自动将包装其类型转化为基本数据类型 重写和重载 重写 1.发生在子类和父类之间 2.参数的方法名&#xff0c;参数&#xff0c;返回值&#xff0c;必须相同 3.权限修饰符不能小于重写方法的权限修饰符…...

【动态规划】-- 三步问题(easy)

文章目录 1. 题目2. 题目解析3. 代码 1. 题目 在线oj 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有 n 阶台阶&#xff0c;小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模 1000000007。…...

字符流Reader/Writer

一、Reader相关介绍及其子类 Reader是所有字符输入流的超类。它提供了读取字符流的基本方法&#xff0c;如read(), read(char[] cbuf, int off, int len)等&#xff1b;由于Reader是抽象类&#xff0c;通常使用它的子类如FileReader, BufferedReader等来创建字符输入流对象。 …...

字符串交替合并问题

问题&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 示例 1&#xff1a; 输入&#xff1a;w…...

shell脚本一键安装docker+docker-compose,支持x86_64、arm64双架构

目录 脚本内容 运行效果 安装包和脚本 脚本内容 [roottest1 docker]# cat install.sh #!/bin/bash set -e export pathpwd export docker_data"/data/docker_data"function check_arch() {if [ -f /etc/redhat-release ]; thenOS"RedHat"elif [ -f /e…...

Elasticsearch 面试备战指南

Elasticsearch 面试备战指南 一、基础概念 什么是Elasticsearch&#xff1f; Elasticsearch是一个基于Lucene的分布式搜索和分析引擎&#xff0c;提供近实时搜索、高可用性和水平扩展能力。常用于日志分析&#xff08;ELK&#xff09;、全文检索、商业智能等场景。 Elasticsea…...

新手村:逻辑回归-理解04:熵是什么?

新手村&#xff1a;逻辑回归04&#xff1a;熵是什么? 熵是什么? 前置条件 在开始学习逻辑回归中的熵理论之前&#xff0c;需要掌握以下基础知识&#xff1a; 概率论与统计学&#xff1a; 概率分布&#xff08;如伯努利分布、正态分布&#xff09;。条件概率和贝叶斯定理。期…...

Javaweb后端登录会话技术jwt令牌

jwt生成与校验 是base4补位的 最后面是签名&#xff0c;签名不是base64&#xff0c;是通过签名算法加密后来的 令牌长度不是固定的&#xff0c;长度取决于原始内容&#xff0c;载荷&#xff0c;大小 头有&#xff0c;类型&#xff0c;签名算法 base64可以对任意的二进制数据进…...

图像对比分析并生成报告

pip install pyautogui """ 图像对比分析工具 功能&#xff1a;实现像素级差异、结构相似性(SSIM)、直方图相似度和特征匹配率四种对比方法 作者&#xff1a;智能助手 版本&#xff1a;1.2 日期&#xff1a;2025-02-27""" import os import cv2 …...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例1,TableView16_01.vue 基础行拖拽排序示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例1,TableView16_01.vu…...

vue-如何将组件内容作为图片生成-html2canvas

1.引入必要的库 这里呢我们使用 html2canvas 库来将 HTML 元素转换为画布&#xff08;canvas&#xff09;&#xff0c;然后再将其导出为图片。首先&#xff0c;确保在项目中安装了 html2canvas&#xff1a; npm install html2canvas 2. 组件结构 然后在我们的vue文件里面&a…...

单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结

RAM 与 内存 RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 和 内存 这两个术语通常是 同义词&#xff0c;即 内存 常常指的就是 RAM。 1. RAM&#xff08;内存&#xff09; 定义&#xff1a;RAM 是计算机中的 主存储器&#xff0c;用于临时存…...

Linux 练习一 NFS和DNS

练习四 任务需求&#xff1a;客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#…...

aab 转 apk

googleplay发布的游戏对外前&#xff0c;测试同学要安装到手机上先行测试&#xff0c;所以就有了这个需求。网上找了一篇文章讲的很详细了&#xff0c;文档是英语的&#xff0c;这里摘抄重要的部分做下记录&#xff1a; https://www.geekdashboard.com/extract-apk-files-from…...

JAVA开发:实例成员与静态成员

判断Java中的实例成员与静态成员 在Java中&#xff0c;可以通过以下几种方式判断一个成员是实例成员还是静态成员&#xff1a; 1. 通过声明方式判断 静态成员使用static关键字修饰&#xff0c;实例成员不使用&#xff1a; public class MyClass {// 实例成员int instanceVa…...

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…...

[项目]基于FreeRTOS的STM32四轴飞行器: 十二.角速度加速度滤波

基于FreeRTOS的STM32四轴飞行器: 十二.滤波 一.滤波介绍二.对角速度进行一阶低通滤波三.对加速度进行卡尔曼滤波 一.滤波介绍 模拟信号滤波&#xff1a; 最常用的滤波方法可以在信号和地之间并联一个电容&#xff0c;因为电容通交隔直&#xff0c;信号突变会给电容充电&#x…...

《基于SpringBoot的图书网购平台的设计与实现》开题报告

个人主页&#xff1a;大数据蟒行探索者 一、选题的依据及意义 1.1选题来源 市场需求驱动&#xff1a;如今&#xff0c;互联网深度融入人们生活&#xff0c;阅读场景愈发多元化&#xff0c;线上购书成为主流趋势之一。读者期望随时随地浏览海量图书资源&#xff0c;对比价格…...

Python 非异步函数执行异步函数的方案

import asyncio import sys from your_module import browser_main # 替换为你的实际模块名 async def _keep_alive(): """保持程序持续运行""" while True: await asyncio.sleep(1) def run_browser(index: int None): """ 执…...

计算机期刊推荐 | 工程技术-电子与电气, 计算机

IET Microwaves Antennas & Propagation的新特刊&#xff1a;《天线与超材料的设计、合成、仿真与实验》 学科领域&#xff1a; 工程技术-电子与电气, 计算机 期刊类型&#xff1a; SCI/SSCI/AHCI 收录数据库&#xff1a; SCI(SCIE) ISSN&#xff1a; 1751-8725 中科院…...

【开源宝藏】30天学会CSS - DAY9 第九课 牛顿摆动量守恒动画

以下是一份逐步拆解教程&#xff0c;带你从零理解并复刻这个牛顿摆&#xff08;Pendulum of Newton&#xff09;动画效果&#xff0c;这是一个经典的物理演示模型&#xff0c;现在通过纯 HTML 和 CSS 实现出来&#xff0c;视觉效果炫酷、结构简洁。 &#x1f3af; 动画效果说明…...

对三维物体模型的阈值操作

对三维物体模型的阈值操作 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头2. point_normal_x、point_normal_y、point_normal_z有什么区别&#xff1f;3. 去除离群点 1. 使用point_coord_x、point_coord_y、point_coord_z阈值分割麻辣兔头 dev_open_win…...