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

C++数据结构与二叉树详解

前言:

在C++编程的世界里,数据结构是构建高效程序的基石,而二叉树则是其中最优雅且应用广泛的数据结构之一。本文将带你深入理解二叉树的本质、实现与应用,助你在算法设计中游刃有余。

一、二叉树的基本概念

1. 什么是二叉树

二叉树是一种特殊的树形结构,其中每个节点最多只能有两个子节点,分别称为左子节点和右子节点。

想象一个家族族谱,每个人最多只能有两个直系后代。从祖先开始,家族成员按照特定规则(如年龄、性别)分布在左右两侧,形成一个有序的家族网络。这就像一棵二叉树,族长是根节点,每代传承形成不同的层级。

struct TreeNode {int val;           // 节点存储的值TreeNode* left;    // 指向左子节点的指针TreeNode* right;   // 指向右子节点的指针// 构造函数TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}};

2. 二叉树的基本特性

- 最多有2^h-1个节点(h为树高)

- 第i层最多有2^(i-1)个节点

- 对于完全二叉树,若有n个节点,则树高h = ⌈log₂(n+1)⌉

这就像一个完美的金字塔结构,每向下一层,可容纳的人数就翻倍。最顶层只有一个法老,第二层可有两个大臣,第三层可有四个将军...层级越低,容纳的人数越多,但权力越小。

3. 二叉树的种类

- 满二叉树:除最后一层外,每层节点都填满,且最后一层所有节点都在最左边

- 完全二叉树:除了最后一层外,其他层的节点数都达到最大,且最后一层的节点都靠左排列

- 平衡二叉树:任意节点的左右子树高度差不超过1

- 二叉搜索树:左子树上所有节点的值都小于根节点,右子树上所有节点的值都大于根节点

想象一个井然有序的图书馆,不同类型的二叉树代表不同的图书排列方式。满二叉树就像是每个书架都完全装满了书;完全二叉树则是除了最后一个书架,其他都满了,且最后书架的书都靠左放置;平衡二叉树则确保每个主题区域的书籍数量大致相当;而二叉搜索树就像按照书名字母顺序排列的书架,使得查找特定书籍变得高效。

二、二叉树的遍历方式

1. 前序遍历(根-左-右)

前序遍历先访问根节点,然后遍历左子树,最后遍历右子树。

想象你是一名探险家,探索一座古老的家族城堡。前序遍历就像你先参观城堡主厅(根节点),然后探索左侧的房间群(左子树),最后才去右侧的花园区域(右子树)。

void preorder(TreeNode* root) {if (root == nullptr) return;cout << root->val << " ";  // 访问根节点preorder(root->left);      // 遍历左子树preorder(root->right);     // 遍历右子树}

2. 中序遍历(左-根-右)

中序遍历先遍历左子树,然后访问根节点,最后遍历右子树。对于二叉搜索树,中序遍历会产生有序序列。

这就像按照时间轴阅读一个家族故事,先了解祖先(左子树)的历史,然后聚焦于当代族长(根节点)的事迹,最后展望家族的未来发展(右子树)。

void inorder(TreeNode* root) {if (root == nullptr) return;inorder(root->left);       // 遍历左子树cout << root->val << " ";  // 访问根节点inorder(root->right);      // 遍历右子树}

3. 后序遍历(左-右-根)

后序遍历先遍历左子树,然后遍历右子树,最后访问根节点。

想象你在拆除一座大楼,必须先拆除左侧的附属建筑(左子树),再拆除右侧设施(右子树),最后才能动摇中央主体结构(根节点)。这种"自底向上"的访问方式在释放树形结构的内存时特别有用。

void postorder(TreeNode* root) {if (root == nullptr) return;postorder(root->left);     // 遍历左子树postorder(root->right);    // 遍历右子树cout << root->val << " ";  // 访问根节点}

4. 层序遍历

层序遍历按照从上到下、从左到右的顺序访问树的节点,通常使用队列实现。

这就像参观一座多层建筑,你必须先参观完一层所有房间,才能乘电梯上到下一层。在每层内,你总是从左边开始,依次向右参观每个房间。

void levelOrder(TreeNode* root) {if (root == nullptr) return;queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* node = q.front();q.pop();cout << node->val << " ";  // 访问当前节点if (node->left) q.push(node->left);    // 将左子节点入队if (node->right) q.push(node->right);  // 将右子节点入队}}

三、二叉搜索树(BST)的操作

1. 查找操作

在BST中查找值为key的节点,如果找到则返回该节点,否则返回nullptr。

想象你在查找一本特定的书,在有序书架上,你可以通过比较书名来快速缩小范围 —— 如果目标书比当前查看的书名小,就去左边找;如果更大,就去右边找。这种"二分查找"的思路使得BST的查找非常高效。

TreeNode* search(TreeNode* root, int key) {// 基本情况:树为空或找到节点if (root == nullptr || root->val == key)return root;// 如果key小于当前节点值,去左子树查找if (key < root->val)return search(root->left, key);// 如果key大于当前节点值,去右子树查找return search(root->right, key);}

2. 插入操作

在BST中插入值为key的新节点。

就像在有序书架上添加新书,你需要找到正确的位置 —— 比较书名,决定是放在左边还是右边,直到找到一个空位置。

TreeNode* insert(TreeNode* root, int key) {// 如果树为空,创建新节点作为根节点if (root == nullptr)return new TreeNode(key);// 递归插入if (key < root->val)root->left = insert(root->left, key);else if (key > root->val)root->right = insert(root->right, key);// 如果key已存在,不做任何操作return root;}

3. 删除操作

从BST中删除值为key的节点,这是最复杂的操作,需要考虑多种情况。

删除一本书时,你需要考虑这本书在书架上的位置:如果它没有"关联书籍"(子节点),直接移除即可;如果它只有一侧有关联书籍,让这些书籍"上升一级";如果两侧都有关联书籍,则需要找到"最接近"的那本书来代替它的位置。

TreeNode* deleteNode(TreeNode* root, int key) {// 基本情况:空树if (root == nullptr) return root;// 寻找要删除的节点if (key < root->val)root->left = deleteNode(root->left, key);else if (key > root->val)root->right = deleteNode(root->right, key);else {// 找到了要删除的节点// 情况1:没有子节点或只有一个子节点if (root->left == nullptr) {TreeNode* temp = root->right;delete root;return temp;}else if (root->right == nullptr) {TreeNode* temp = root->left;delete root;return temp;}// 情况2:有两个子节点// 找到右子树中的最小节点(中序后继)TreeNode* temp = minValueNode(root->right);// 用中序后继的值替换当前节点的值root->val = temp->val;// 删除中序后继root->right = deleteNode(root->right, temp->val);}return root;}// 辅助函数:查找最小值节点TreeNode* minValueNode(TreeNode* node) {TreeNode* current = node;// 找到最左侧的节点while (current && current->left != nullptr)current = current->left;return current;}

四、平衡二叉树与旋转操作

1. 为什么需要平衡二叉树

当BST严重不平衡时(如退化成链表),其操作的时间复杂度会从O(log n)变为O(n),大大降低效率。

想象一个只有左侧书架的图书馆,所有书都排成一列,你必须从头到尾线性查找,无法利用二分查找的优势。这就是为什么我们需要保持树的平衡 —— 确保左右两侧的"高度"大致相当。

2. AVL树与红黑树

这两种都是自平衡的二叉搜索树,通过特定规则和旋转操作保持树的平衡。

它们就像有严格整理规则的智能书架系统,不断自我调整,确保任何时候都不会出现一边"堆积如山"而另一边"空空如也"的情况。

3. 旋转操作:左旋与右旋

旋转是保持二叉树平衡的基本操作。

想象一个机械书架系统,当发现左侧书太多时,会将部分书架向右旋转调整;当右侧过重时,则向左旋转调整。这些精密的"旋转"操作确保了整个系统的平衡性。

// 右旋操作TreeNode* rightRotate(TreeNode* y) {TreeNode* x = y->left;TreeNode* T2 = x->right;// 执行旋转x->right = y;y->left = T2;// 返回新的根节点return x;}// 左旋操作TreeNode* leftRotate(TreeNode* x) {TreeNode* y = x->right;TreeNode* T2 = y->left;// 执行旋转y->left = x;x->right = T2;// 返回新的根节点return y;}

五、二叉树的实际应用

1. 表达式解析与编译器设计

二叉树广泛应用于解析算术表达式,操作符作为节点,操作数作为叶子节点。

编程语言的编译过程中,源代码首先被解析成"语法树",这是一种特殊的树形结构,帮助编译器理解代码的逻辑结构,就像我们理解句子的语法结构一样。

2. 文件系统设计

计算机文件系统在逻辑上通常表现为树形结构,尽管物理存储可能不同。

你的电脑文件夹系统就是一个树形结构,根目录(如C盘)是树的根,每个文件夹可以包含文件(叶子节点)和子文件夹(子树),形成了一个直观易用的层次化存储系统。

3. 路由算法与网络设计

在网络路由中,决策树帮助路由器确定数据包的最佳转发路径。

数据包在互联网上传输,就像在一个巨大的迷宫中导航,路由器在每个"分叉点"(节点)做出选择,决定下一步走哪条路,这些决策路径形成了一个树形结构。

4. 游戏AI与决策树

电子游戏中的人工智能常使用决策树来模拟"思考过程"。

国际象棋AI思考下一步棋时,会构建一个决策树 —— 自己走A路线,对手可能会有B、C两种应对,对于每种应对我又有不同选择...这个"多步思考"的过程实际上就是在构建和评估一棵庞大的决策树。

六、高级二叉树结构与应用

1. Trie(前缀树)

Trie是一种特殊的树形数据结构,特别适合处理字符串集合,常用于自动补全和拼写检查。

想象一本字典,每个单词的字母沿着特定路径排列。如果多个单词有相同前缀(如"program"和"programming"),它们会共享相同的初始路径,既节省空间又加速查找。

struct TrieNode {bool isEndOfWord;TrieNode* children[26]; // 假设只有小写字母TrieNode() {isEndOfWord = false;for (int i = 0; i < 26; i++)children[i] = nullptr;}};// 插入操作void insert(TrieNode* root, string key) {TrieNode* pCrawl = root;for (int i = 0; i < key.length(); i++) {int index = key[i] - 'a';if (!pCrawl->children[index])pCrawl->children[index] = new TrieNode();pCrawl = pCrawl->children[index];}// 标记当前节点为单词结尾pCrawl->isEndOfWord = true;}// 查找操作bool search(TrieNode* root, string key) {TrieNode* pCrawl = root;for (int i = 0; i < key.length(); i++) {int index = key[i] - 'a';if (!pCrawl->children[index])return false;pCrawl = pCrawl->children[index];}return (pCrawl != nullptr && pCrawl->isEndOfWord);}

2. 线段树(Segment Tree)

线段树是一种用于处理区间查询和更新的树形数据结构。

设想一个长长的图书架,如果你想知道从第3本到第15本书的总价值,或者想更新第7本到第12本书的价格,线段树可以高效完成这些"区间操作",而不需要遍历每一本书。

3. B树与B+树

这两种树结构主要用于数据库索引和文件系统,能有效处理大量数据且支持高效的磁盘访问。

它们就像图书馆的多级索引系统,一个总索引指向各个主题索引,主题索引再指向具体书架,层层递进,使得即使在海量图书中也能快速定位到特定书籍。B+树特别适合范围查询,如"找出所有1990-2000年出版的书"。

七、优化与实战技巧

1. 空间优化技巧

在内存受限的环境中,可以通过多种方式优化二叉树的空间使用。

一种常见技巧是使用数组实现完全二叉树,对于索引为i的节点,其左子节点索引为2i+1,右子节点索引为2i+2。这就像在一排连续的格子中按特定规则存放物品,省去了存储"指向下一个格子"的指针,大大节省了空间。

2. 多线程环境下的二叉树操作

在并发编程中,需要特别关注二叉树的线程安全问题。

想象多个图书管理员同时操作同一个书架系统,如果没有协调机制,可能导致混乱 —— A正在调整第三层书籍时,B可能正在移动整个书架。通过锁机制、不可变数据结构或特殊的并发友好树型数据结构(如RCU-protected trees),可以安全地在多线程环境中使用树形数据结构。

3. 序列化与反序列化

在分布式系统或需要持久化存储时,能够将二叉树转换为线性结构(序列化)并能还原(反序列化)是关键能力。

这就像需要将一个立体拼图(树)拆解成一维序列以便邮寄,并确保收件人能按照特定规则重新组装成原来的立体结构。

// 二叉树的序列化(前序遍历方式)string serialize(TreeNode* root) {if (!root) return "X,"; // X表示null节点string result = to_string(root->val) + ",";result += serialize(root->left);result += serialize(root->right);return result;}// 二叉树的反序列化TreeNode* deserialize(string data) {queue<string> nodes;string val;// 将序列化字符串分割为节点值队列for (char c : data) {if (c == ',') {nodes.push(val);val.clear();} else {val.push_back(c);}}return buildTree(nodes);}TreeNode* buildTree(queue<string>& nodes) {string val = nodes.front();nodes.pop();if (val == "X") return nullptr;TreeNode* node = new TreeNode(stoi(val));node->left = buildTree(nodes);node->right = buildTree(nodes);return node;}

八、未来展望与高级话题

1. 量子计算对树结构的潜在影响

随着量子计算的发展,传统的树形数据结构可能需要重新设计以适应量子环境。

传统计算机处理树形结构时是按照特定路径遍历的,而量子计算具有同时探索多条路径的能力(量子叠加态),这可能彻底改变我们思考和实现树形数据结构的方式。

2. 神经网络与决策树的融合

机器学习中,决策树与神经网络各有优势,未来可能看到更多融合这两种方法的混合模型。

决策树提供清晰的决策路径但缺乏灵活性,神经网络具有强大的学习能力但缺乏可解释性。将两者结合的"神经决策森林"试图兼取两种方法的优点,创造既强大又可解释的AI模型。

结语

       二叉树是计算机科学的经典数据结构,它不仅是算法设计的基础,也是解决各种实际问题的有力工具。从简单的二叉搜索树到复杂的B+树,从表达式解析到游戏AI,二叉树无处不在。

掌握二叉树不仅是理解一种数据结构,更是获得一种思维方式 —— 层次化、递归性思考问题的能力。这种思维方式将帮助你在编程道路上走得更远,解决更复杂的问题。

就像一棵树需要强壮的根系支撑茂盛的枝叶,扎实的数据结构基础是构建高效算法和系统的关键。希望本文能帮助你在C++数据结构的探索之旅中打下坚实基础,更自信地应对各种编程挑战。

相关文章:

C++数据结构与二叉树详解

前言&#xff1a; 在C编程的世界里&#xff0c;数据结构是构建高效程序的基石&#xff0c;而二叉树则是其中最优雅且应用广泛的数据结构之一。本文将带你深入理解二叉树的本质、实现与应用&#xff0c;助你在算法设计中游刃有余。 一、二叉树的基本概念 1. 什么是二叉树 二叉树…...

解决6栈6层码头集装箱堆栈翻箱最优解问题

‘’’ con 1 origin_stack = [ [4, 4, 1, 0, 0, 0], # 第一栈 [4, 3, 2, 1, 0, 0], # 第二栈 [4, 2, 2, 1, 0, 0], # 第三栈 [3, 3, 3, 1, 0, 0], # 第四栈 [3, 4, 2, 1, 0, 0], # 第五栈 [4, 2, 3, 2, 0, 0] # 第六栈 ] con 2 origin_stack = [ [4, 4, 3, 0, 0, 0], # 第一栈…...

Java 序列化与反序列化终极解析

Java 序列化与反序列化终极解析 1. 核心概念 (1) 什么是序列化&#xff1f; 定义&#xff1a;将对象转换为字节流的过程&#xff08;对象 → 字节&#xff09; 目的&#xff1a; 持久化存储&#xff08;如保存到文件&#xff09; 网络传输&#xff08;如RPC调用&#xff09…...

YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11、YOLOv12的网络结构图

文章目录 一、YOLOv5二、YOLOv6三、YOLOv7四、YOLOv8五、YOLOv9六、YOLOv10七、YOLOv11八、YOLOv12九、目标检测系列文章 本文将给出YOLO各版本&#xff08;YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11、YOLOv12&#xff09;网络结构图的绘制方法及图。本文所展…...

leetcode0145. 二叉树的后序遍历-easy

1 题目&#xff1a;二叉树的后序遍历 官方标定难度&#xff1a;易 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 解释&#xff1a; 示例 2&#xff1a; 输入…...

【Leetcode 每日一题】2364. 统计坏数对的数目

问题背景 给你一个下标从 0 0 0 开始的整数数组 n u m s nums nums。如果 i < j i < j i<j 且 j − i ≠ n u m s [ j ] − n u m s [ i ] j - i \ne nums[j] - nums[i] j−inums[j]−nums[i]&#xff0c;那么我们称 ( i , j ) (i, j) (i,j) 是一个 坏数对 。…...

完整的 .NET 6 分布式定时任务实现(Hangfire + Redis 分布式锁)

完整的 .NET 6 分布式定时任务实现&#xff08;Hangfire Redis 分布式锁&#xff09; 以下是完整的解决方案&#xff0c;包含所有必要组件&#xff1a; 1. 基础设施层 1.1 分布式锁服务 // IDistributedLockService.cs public interface IDistributedLockService {ValueTa…...

人脸识别联合行为检测的办公管理新模式

基于人脸识别与行为检测的办公智能化解决方案 一、背景 在传统办公场景中&#xff0c;员工考勤管理、工位使用情况统计、安全监控等环节存在诸多痛点。例如&#xff0c;传统考勤方式如指纹打卡、刷卡等存在代打卡现象&#xff0c;考勤数据不准确&#xff1b;对于员工是否在工…...

鸿蒙NEXT开发键盘工具类(ArkTs)

export declare type KeyboardCallBack (show: boolean, height: number) > void; import { AppUtil } from ./AppUtil; import { LogUtil } from ./LogUtil; import { ArrayUtil } from ./ArrayUtil;/*** 键盘工具类* author 鸿蒙布道师* since 2025/04/18*/ export class…...

Python爬虫第17节-动态渲染页面抓取之Selenium使用下篇

目录 引言 一、获取节点信息 1.1 获取属性 1.2 获取文本值 1.3 获取ID、位置、标签名、大小 二、切换Frame 三、延时等待 3.1 隐式等待 3.2 显式等待 四、前进后退 五、Cookies 六、选项卡管理 七、异常处理 引言 这一节我们继续讲解Selenium的使用下篇&#xff0…...

【数据结构】第四弹——LinkedList与链表

文章目录 一. ArrayList 的缺陷二.链表2.1 链表的概念及结构2.2 链表的结构2.2.1 单向或者双向2.2.2 带头或者不带头2.2.3 循环非循环 2.3 链表的实现1. IList接口2. MySingleList 类中具体实现(不带头单向非循环链表)1. 节点抽象成内部类手搓一个链表2. 头插法3. 尾插法4. 指定…...

设计模式从入门到精通之(五)观察者模式

观察者模式&#xff1a;实现高效事件通知的秘诀 在日常生活中&#xff0c;我们经常需要同步通知多方的信息变更。比如天气预报系统、股票价格波动提醒、社交媒体的点赞通知等。这些场景中&#xff0c;通知机制需要高效、灵活&#xff0c;而不会因为通知方的变化影响系统整体。 …...

chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读

加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函数直接用emscripten::function&#xff0c;如&#xff1a; emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…...

使用人工智能大模型kimi,如何免费制作PPT?

使用人工智能大模型kimi&#xff0c;如何免费制作PPT&#xff1f; 手把手操作视频https://edu.csdn.net/learn/40406/666573...

ModbusTCP 转 Profinet 主站网关

一、 功能概述 1.1 设备简介 本产品是 ModbusTCP 和 Profinet(M) 网关&#xff08;以下简称网关&#xff09;&#xff0c;使用数据映射 方式工作。 本产品在 ModbusTCP 侧作为 ModbusTCP 从站&#xff0c;接 PLC 、上位机、 wincc 屏 等&#xff1b;在 Profin…...

进阶篇|CAN FD 与性能优化

引言 1. CAN vs. CAN FD 对比 2. CAN FD 帧结构详解...

6.6 “3步调用ChatGPT打造高可靠Python调度器,零依赖实现定时任务自动化“

3步调用ChatGPT打造高可靠Python调度器,零依赖实现定时任务自动化 关键词:ChatGPT代码生成、Python调度器设计、定时任务自动化、异常处理机制、日志监控系统 需求分析与技术选型 GitHub Sentinel 需要实现两种定时任务模式: #mermaid-svg-prOScv2NNhn6w90N {font-family:…...

HarmonyOS 基础语法概述 UI范式

ArkUI框架 - UI范式 ArkTS的基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component和State都是装饰器&#xff0c;Component表示自定义组件&#xff0c;Entry表示该自定义组件为入口组件&#xff0c;Stat…...

23种设计模式-创建型模式之建造者模式(Java版本)

Java 建造者模式&#xff08;Builder Pattern&#xff09;详解 &#x1f9f1; 什么是建造者模式&#xff1f; 建造者模式用于将一个复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 适用于创建过程复杂、构造顺序稳定但组件变化的对象。…...

【AI提示词】退休规划顾问专家

提示说明 随着人口老龄化的加剧&#xff0c;越来越多的人开始关注退休规划问题。一个专业的退休规划顾问可以帮助用户合理规划退休生活&#xff0c;确保退休后的生活质量。 提示词 # 角色 退休规划顾问专家## 注意 1. 专家设计应符合退休规划的专业性和可靠性&#xff0c;帮…...

文献总结:NIPS2023——车路协同自动驾驶感知中的时间对齐(FFNet)

FFNet 一、文献基本信息二、背景介绍三、相关研究1. 以自车为中心的3D目标检测2. 车路协同3D目标检测3. 特征流 四、FFNet网络架构1. 车路协同3D目标检测任务定义2. 特征流网络2.1 特征流生成2.2 压缩、传输与解压缩2.3 车辆传感器数据与基础设施特征流融合 3. 特征流网络训练流…...

(二十六)Java观察者模式在Android开发中的应用详解

Java观察者模式在Android开发中的应用 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得多个观察者对象可以同时监听一个主题对象。当主题对象的状态发生变化时&#xff0c;所有注册的观察者…...

goland做验证码识别时报“undefined: gosseract.NewClient”

gosseract 应该有 和 c 相关的配置库因此需要安装 cgo 并且启用 CGO_ENABLED 在cmd下面输入这个 go env -w CGO_ENABLED1 接着输入 go env 验证是否设置成功 解决了这个问题后 “undefined: gosseract.NewClient” 又出现了 # runtime/cgo …...

ceph weight 和 reweight 的区别

ceph osd df ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS0 nvme 6.98630 0.95508 7.0 TiB 5.0 TiB 4.9 TiB 13 GiB 33 GiB 2.0 TiB 71.10 0.96 83 up1 nvme 6.98630...

# 使用 PyTorch 构建并训练一个简单的 CNN 模型进行图像分类

使用 PyTorch 构建并训练一个简单的 CNN 模型进行图像分类 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;是处理图像分类任务的强大工具。本文将通过一个简单的示例&#xff0c;展示如何使用 PyTorch 构建、训练和测试一个 CNN 模型&#xff0c;用于对食…...

Linux网络编程 深入解析TFTP协议:基于UDP的文件传输实战

知识点1【TFTP的概述】 学习通信的基本&#xff1a;通信协议&#xff08;具体发送上面样的报文&#xff09;、通信流程&#xff08;按照什么步骤发送&#xff09; 1、TFTP的概述 tftp&#xff1a;简单文件传输协议&#xff0c;**基于UDP&#xff0c;**不进行用户有效性验证 …...

汽车免拆诊断案例 | 2019款大众途观L车鼓风机偶尔不工作

故障现象 一辆2019款大众途观L车&#xff0c;搭载DKV发动机和0DE双离合变速器&#xff0c;累计行驶里程约为8万km。车主进厂反映&#xff0c;鼓风机偶尔不工作。 故障诊断  接车后试车&#xff0c;鼓风机各挡位均工作正常。用故障检测仪检测&#xff0c;空调控制单元&#x…...

编程常见错误归类

上一篇讲了调试&#xff0c;今天通过一个举例回忆一下上一篇内容吧&#xff01; 1. 回顾&#xff1a;调试举例 在VS2022、X86、Debug的环境下&#xff0c;编译器不做任何优化的话&#xff0c;下⾯代码执⾏的结果是啥&#xff1f; #include <stdio.h> int main() {int …...

Python 3.13 support for PyTorch

Python 3.13 support for PyTorch Python 3.13 support for PyTorch 去官网可以查到具体信息&#xff1a;https://pytorch.org/get-started/locally/ 然后选择自己的CUDA版本&#xff0c;下面会显示下载网站&#xff0c;比如我选择12.4&#xff0c;则会出现&#xff1a;pip3 …...

中国联通:《DeepSeek洞察与大模型应用:人工智能技术发展与应用实践》(可下载)

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;尤其是大模型技术的崛起&#xff0c;正在深刻改变各行各业的运营模式和创新路径。作为中国通信行业的领军企业之一&#xff0c;中国联通积极拥抱AI技术变革&#xff0c;结合自身在通信网络、大数…...

k8s 调整Node节点 Max_Pods

默认情况下&#xff0c;Kubernetes集群中一个Node最多能起110个Pod。 这是基于性能和资源管理的考虑&#xff0c;以确保Kubernetes集群的稳定性和可靠性。 查看kht125节点上支持的最大pod数量: kubectl describe node kht125 | grep -i “Capacity|Allocatable” -A 6 调整…...

VR拍摄要点与技巧有哪些?有哪些最佳实践?

VR拍摄要点与技巧&#xff1a;最佳实践 VR技术通过模拟环境&#xff0c;使用户能够沉浸在一个完全由计算机生成的虚拟世界中&#xff0c;进行互动体验。在VR拍摄领域&#xff0c;我们主要利用这一技术来创建360度全景视频或图片&#xff0c;让观众能够全方位、无死角地感受拍摄…...

使用 Docker 安装 Elastic Stack 并重置本地密码

Elastic Stack&#xff08;也被称为 ELK Stack&#xff09;是一个非常强大的工具套件&#xff0c;用于实时搜索、分析和可视化大量数据。Elastic Stack 包括 Elasticsearch、Logstash、Kibana 等组件。本文将展示如何使用 Docker 安装 Elasticsearch 并重置本地用户密码。 ###…...

安卓手机万能遥控器APP推荐

软件介绍 安卓手机也能当“家电总控台”&#xff1f;这款小米旗下的万能遥控器APP&#xff0c;直接把遥控器做成“傻瓜式操作”——不用配对&#xff0c;不连蓝牙&#xff0c;点开就能操控电视、空调、机顶盒&#xff0c;甚至其他品牌的电器&#xff01;雷总这波操作直接封神&…...

PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动

在孩子的成长过程中&#xff0c;总有那么一些“与众不同”的孩子。他们似乎总是坐不住&#xff0c;课堂上小动作不断&#xff0c;注意力难以集中&#xff0c;作业总是拖拖拉拉……这些行为常常被家长和老师简单地归结为“淘气”“不听话”。然而&#xff0c;他们可能并不只是“…...

Linux 系统编程 day4 进程管道

进程间通信&#xff08;IPC&#xff09; Linux环境下&#xff0c;进程地址空间相互独立&#xff0c;任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程和进程之间不能互相访问&#xff0c;要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲区&#xf…...

基于DeepSeek的考研暑假日志分析

注&#xff1a;我去年考研时写了日志&#xff0c;大致记录了我每天的主要活动。由于过于琐碎&#xff0c;一直没有翻看。突发奇想&#xff0c;现在利用deepseek总结其中规律。 从你的日志中可以总结出以下规律和活动兴衰起落&#xff1a; ​​一、学习活动规律与演变​​ ​​…...

Python 写生成 应用商店(2025版) 网页 方便收集应用 ,局域网使用

工具【1】&#xff1a;nginx 配置 nginx.conf 文件 server { listen 8080; server_name example.com; location / { root E:/BIT_Soft_2025; index index.html index.htm; } # 定义错误页面 error_page 404 /4…...

LLaMA Factory多模态微调实践:微调Qwen2-VL构建文旅大模型

LLaMA Factory 是一款开源低代码大模型微调框架&#xff0c;集成了业界最广泛使用的微调技术&#xff0c;支持通过 Web UI 界面零代码微调大模型&#xff0c;目前已经成为开源社区内最受欢迎的微调框架之一&#xff0c;GitHub 星标超过 4.7 万。本教程将基于通义千问团队开源的…...

Ubuntu20.04 部署llama-factory问题集

llama3 微调教程之 llama factory 的 安装部署与模型微调过程&#xff0c;模型量化和gguf转换。_llamafactory 部署-CSDN博客 1.跟着教程 llama-factory下载不下来 来&#xff0c;试着换源&#xff0c;多试几次&#xff0c;就可以成功了。。。 2.跟着教程&#xff0c;发现无法…...

鸿蒙语言基础

准备工作 去鸿蒙官网下载开发环境 点击右侧预浏览&#xff0c;刷新和插销按钮&#xff0c;插销表示热更新&#xff0c;常用按钮。 基础语法 string number boolean const常量 数组 let s : string "1111"; console.log("string", s);let n : number …...

每天一道C语言精选编程题之字符串拷贝

题目描述 写⼀个函数my_strcpy&#xff0c;实现拷⻉字符串的功能&#xff0c;假设给定⼀个字符数组a&#xff0c;再给定⼀个字符数组b&#xff0c;将字符串a中的内容拷⻉到字符串b中&#xff0c;拷⻉内容包含字符串末尾的 \0 字符。 解法思路 使⽤ while 循环通过指针的⽅式逐…...

C#中扩展方法和钩子机制使用

1.扩展方法&#xff1a; 扩展方法允许向现有类型 “添加” 方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法&#xff0c;但可以像实例方法一样进行调用。 使用场景&#xff1a; 1.当无法修改某个类的源代码&#…...

基于CNN与VGG16的图像识别快速实现指南

基于CNN与VGG16的图像识别快速实现指南 以下是从零实现代码到原理剖析的完整流程&#xff0c;包含TensorFlow/Keras框架的代码示例与关键优化技巧&#xff0c;满足快速实验需求。 一、核心原理对比 特性CNN&#xff08;基础模型&#xff09;VGG16结构深度5-10层&#xff08;如…...

中间件--ClickHouse-9--MPP架构(分布式计算架构)

1、MPP 架构基础概念 MPP(Massively Parallel Processing 大规模并行处理) 是一种分布式计算架构&#xff0c;专门设计用来高效处理大规模数据集。在这种架构下*&#xff0c;数据库被分割成多个部分&#xff0c;每个部分可以在不同的服务器节点上并行处理*。这意味着&#xff…...

如何在PDF.js中改造viewer.html以实现PDF的动态加载

在PDF.js中改造viewer.html实现PDF动态加载&#xff0c;需结合参数传递、文件流处理及跨域配置等技术。以下是综合多个技术方案的核心实现步骤&#xff1a; ​一、基础参数传递法​ 1. ​URL参数动态加载​ 通过修改viewer.html的URL参数传递PDF路径&#xff0c;适用于静态文…...

Android——动画

帧动画 帧动画就是很多张图片&#xff0c;一帧一帧的播放&#xff0c;形成的一个动画效果。 frame.xml <?xml version"1.0" encoding"utf-8"?> <animation-list xmlns:android"http://schemas.android.com/apk/res/android">&l…...

基于linux 设置无线网卡Monitor模式 sniffer抓包

硬件 TP-WN722N 开源无线网卡 网卡设置成抓包模式&#xff0c;条件是什么&#xff1f; 硬件条件 网卡芯片支持监听模式&#xff0c;外置天线或高增益天线可提升抓包效果驱动与软件条件&#xff1a;正确的驱动程序系统与权限条件 Linux&#xff1a;原生支持&#xff08;Kali …...

Ubuntu18.04安装Qt5.12

本文介绍了在Ubuntu18.04环境下安装QT QT5.12相关安装包下载地址 https://download.qt.io/archive/qt/5.12/ Linux系统下Qt的离线安装包以.run结尾 (sudo apt-get install open-vm-tools open-vm-tools-desktop解决无法paste的问题) 安装 1.cd命令 终端进入对应的文件夹下面 2.…...

克服储能领域的数据处理瓶颈及AI拓展

对于储能研究人员来说&#xff0c;日常工作中经常围绕着一项核心但有时令人沮丧的任务&#xff1a;处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格&#xff0c;研究人员的大量时间都花在了提取有意义的见解上。长期以来&#xff0c;该领域一直受到对专…...