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

递归、搜索与回溯算法 —— 名词解析

目录

一、递归

1、什么是递归?

2、递归的数学类比

3、为什么要用到递归?

问题具有递归结构:

代码简洁易懂:

解决复杂问题:

处理嵌套结构:

4、如何理解递归?

明确基准条件:

将问题分解为子问题:

信任递归:

5、递归的示例:计算阶乘

6、如何写好递归?

1. 明确基准条件

2. 确保问题规模逐步减小

3. 避免重复计算

4. 控制递归深度

5. 清晰定义递归函数的输入和输出

6. 测试边界条件

7、递归的经典示例

示例 1:斐波那契数列

示例 2:二叉树的前序遍历

8、递归与迭代的比较

9、总结

二、搜索&深度优先遍历遍历&深度优先探索&宽度优先遍历&宽度优先探索&暴搜 

1. 搜索(Search)

含义

作用

2. 深度优先搜索(DFS)

含义

特点

代码示例(图的 DFS)

应用场景

3. 广度优先搜索(BFS)

含义

特点

代码示例(图的 BFS)

应用场景

4. 深度优先探索(Depth-First Exploration)

含义

特点

应用场景

5. 广度优先探索(Breadth-First Exploration)

含义

特点

应用场景

6. 暴力搜索(Brute Force)

含义

特点

应用场景

7. 关系图

8. 扩展搜索问题

状态空间搜索

组合优化问题

图论问题

游戏树搜索

9. 总结

三、 回溯与剪枝

1. 回溯(Backtracking)

本质

特点

回溯的步骤

代码示例(全排列问题)

应用场景

2. 剪枝(Pruning)

本质

特点

剪枝的实现方法

代码示例(组合总和问题)

应用场景

3. 回溯与剪枝的关系

关系图

4. 扩展搜索问题

数独问题

八皇后问题

组合优化问题

5. 总结


一、递归

1、什么是递归?

        递归(Recursion)是一种在函数定义中调用自身的技术。在计算机科学中,递归是一种通过将问题分解为更小的、相似的子问题来解决问题的方法。递归函数通常包含两个部分:

  1. 基准条件(Base Case):递归终止的条件。当满足基准条件时,递归不再继续,直接返回结果。

  2. 递归条件(Recursive Case):将问题分解为更小的子问题,并调用自身来解决这些子问题。

2、递归的数学类比

递归的思想类似于数学中的递推关系。例如,斐波那契数列的定义:

  • 基准条件:F(0)=0F(0)=0,F(1)=1F(1)=1。

  • 递归条件:F(n)=F(n−1)+F(n−2)F(n)=F(n−1)+F(n−2)。

在编程中,递归的实现方式与数学中的递推关系非常相似。


3、为什么要用到递归?

递归是一种强大的工具,适用于以下场景:

  1. 问题具有递归结构

    • 如果一个问题可以自然地分解为更小的、相似的子问题,递归是解决它的直观方法。

    • 例如,树的遍历、分治算法(如归并排序、快速排序)等。

  2. 代码简洁易懂

    • 递归代码通常比迭代代码更简洁,更接近问题的数学定义。

    • 例如,计算阶乘、斐波那契数列等问题,递归代码非常直观。

  3. 解决复杂问题

    • 递归可以简化复杂问题的解决过程,例如回溯算法、动态规划等。

  4. 处理嵌套结构

    • 递归非常适合处理嵌套结构,例如树、图、链表等。


4、如何理解递归?

理解递归的关键在于:

  1. 明确基准条件

    • 递归必须有一个明确的终止条件,否则会导致无限递归,最终栈溢出。

  2. 将问题分解为子问题

    • 每次递归调用都应该使问题规模减小,逐步逼近基准条件。

  3. 信任递归

    • 假设递归函数已经能够正确解决子问题,专注于如何利用子问题的结果解决当前问题。

5、递归的示例:计算阶乘

int factorial(int n) {// 基准条件if (n == 0) return 1;// 递归条件return n * factorial(n - 1);
}
  • 基准条件:n=0n=0 时,返回 11。

  • 递归条件:n>0n>0 时,返回 n×factorial(n−1)n×factorial(n−1)。


6、如何写好递归?

写好递归代码需要遵循以下原则:

1. 明确基准条件

  • 基准条件是递归的终止条件,必须清晰明确。

  • 例如,在计算阶乘时,基准条件是 n=0n=0。

2. 确保问题规模逐步减小

  • 每次递归调用都应该使问题规模减小,否则会导致无限递归。

  • 例如,在计算阶乘时,每次递归调用 nn 都会减小。

3. 避免重复计算

  • 如果递归过程中存在重复计算,可以使用记忆化(Memoization)或动态规划来优化。

  • 例如,斐波那契数列的递归实现可以通过记忆化避免重复计算。

4. 控制递归深度

  • 递归深度过大会导致栈溢出。可以通过尾递归优化或转换为迭代来减少递归深度。

5. 清晰定义递归函数的输入和输出

  • 递归函数的输入参数和返回值应该清晰明确,便于理解和使用。

6. 测试边界条件

  • 递归代码容易在边界条件下出错,因此需要仔细测试基准条件和边界情况。


7、递归的经典示例

示例 1:斐波那契数列

int fibonacci(int n) {// 基准条件if (n == 0) return 0;if (n == 1) return 1;// 递归条件return fibonacci(n - 1) + fibonacci(n - 2);
}
  • 问题:存在大量重复计算,效率低。

  • 优化:使用记忆化或动态规划。

示例 2:二叉树的前序遍历

struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};void preorder(TreeNode* root) {if (root == nullptr) return; // 基准条件cout << root->val << " ";    // 访问当前节点preorder(root->left);        // 递归遍历左子树preorder(root->right);       // 递归遍历右子树
}
  • 基准条件:当前节点为空时返回。

  • 递归条件:访问当前节点,然后递归遍历左子树和右子树。


8、递归与迭代的比较

特性递归迭代
代码简洁性更简洁,接近数学定义通常更冗长
可读性更易理解可能需要更多注释
性能可能有栈溢出风险,效率较低通常效率更高
适用场景树、图、分治、回溯等问题线性问题、需要控制栈空间的问题

9、总结

  • 递归是一种通过将问题分解为更小的子问题来解决问题的方法。

  • 使用递归的场景包括问题具有递归结构、代码简洁性要求高、处理嵌套结构等。

  • 理解递归的关键是明确基准条件、将问题分解为子问题,并信任递归。

  • 写好递归需要明确基准条件、确保问题规模逐步减小、避免重复计算、控制递归深度等。

  • 递归和迭代各有优缺点,应根据具体问题选择合适的方法。

二、搜索&深度优先遍历遍历&深度优先探索&宽度优先遍历&宽度优先探索&暴搜 

1. 搜索(Search)

含义

搜索是指在给定的问题空间中,通过某种策略寻找目标解的过程。搜索算法可以分为:

  • 系统性搜索:按照一定的规则遍历问题空间(如 DFS、BFS)。

  • 启发式搜索:利用启发信息指导搜索方向(如 A* 算法)。

作用

  • 解决组合优化问题(如路径规划、状态空间搜索)。

  • 遍历数据结构(如树、图的遍历)。

  • 寻找满足条件的解(如数独、八皇后问题)。


2. 深度优先搜索(DFS)

含义

        深度优先搜索是一种系统性搜索算法,其核心思想是尽可能深地探索某一条路径,直到无法继续为止,然后回溯并尝试其他路径

特点

  • 使用(递归或显式栈)实现。

  • 适合解决连通性问题回溯问题

  • 可能陷入无限循环(如果问题空间无限且未剪枝)。

代码示例(图的 DFS)

void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {visited[node] = true; // 标记当前节点为已访问for (int neighbor : graph[node]) {if (!visited[neighbor]) {dfs(neighbor, graph, visited); // 递归访问邻居节点}}
}

应用场景

  • 图的连通性检测。

  • 拓扑排序。

  • 回溯问题(如八皇后、数独)。


3. 广度优先搜索(BFS)

含义

广度优先搜索是一种系统性搜索算法,其核心思想是从起点开始,逐层扩展,直到找到目标解

特点

  • 使用队列实现。

  • 适合解决最短路径问题(在无权图中)。

  • 不会陷入无限循环(如果问题空间有限)。

代码示例(图的 BFS)

void bfs(int start, vector<vector<int>>& graph) {queue<int> q;vector<bool> visited(graph.size(), false);q.push(start);visited[start] = true;while (!q.empty()) {int node = q.front();q.pop();for (int neighbor : graph[node]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}
}

应用场景

  • 无权图的最短路径问题。

  • 状态空间搜索(如迷宫问题)。

  • 社交网络中的最短关系链。


4. 深度优先探索(Depth-First Exploration)

含义

        深度优先探索是深度优先搜索的一种扩展,通常用于探索未知的问题空间。它不仅限于图或树的遍历,还可以用于解决更复杂的问题(如状态空间搜索)。

特点

  • 强调探索而非简单的遍历。

  • 通常结合剪枝回溯技术。

应用场景

  • 解决组合优化问题(如旅行商问题)。

  • 游戏树搜索(如围棋、象棋)。


5. 广度优先探索(Breadth-First Exploration)

含义

        广度优先探索是广度优先搜索的一种扩展,通常用于在未知问题空间中寻找最优解。它逐层扩展,确保找到的解是最优的。

特点

  • 强调最优性

  • 适合解决最短路径问题最小步数问题

应用场景

  • 迷宫问题。

  • 社交网络中的最短关系链。


6. 暴力搜索(Brute Force)

含义

暴力搜索是一种穷举法,通过遍历所有可能的解来寻找目标解。

特点

  • 简单直接,但效率低。

  • 适合问题规模较小的情况。

应用场景

  • 小规模组合问题(如排列、组合)。

  • 密码破解。


7. 关系图

以下是搜索算法的关系图:


8. 扩展搜索问题

状态空间搜索

  • 问题描述:在状态空间中寻找从初始状态到目标状态的路径。

  • 解决方法:DFS、BFS、A* 算法。

组合优化问题

  • 问题描述:在组合问题中寻找最优解(如旅行商问题)。

  • 解决方法:DFS + 剪枝、动态规划。

图论问题

  • 问题描述:在图中寻找路径、连通分量、最短路径等。

  • 解决方法:DFS、BFS、Dijkstra 算法。

游戏树搜索

  • 问题描述:在游戏树中寻找最优策略(如围棋、象棋)。

  • 解决方法:DFS + 剪枝、Alpha-Beta 剪枝。


9. 总结

算法/方法核心思想数据结构适用场景
深度优先搜索(DFS)尽可能深地探索某一条路径栈(递归)连通性问题、回溯问题
广度优先搜索(BFS)逐层扩展,寻找最短路径队列最短路径问题、状态空间搜索
深度优先探索探索未知问题空间,结合剪枝和回溯栈(递归)组合优化问题、游戏树搜索
广度优先探索逐层扩展,确保最优解队列最短路径问题、最小步数问题
暴力搜索穷举所有可能的解无特定数据结构小规模组合问题、密码破解

        通过理解这些搜索算法的含义、作用、区别和应用场景,可以更好地选择合适的方法解决实际问题。

三、 回溯与剪枝

1. 回溯(Backtracking)

本质

        回溯是一种系统性搜索算法,其核心思想是尝试所有可能的候选解,并在发现当前候选解不满足条件时,回退到上一步并尝试其他选择

特点

  • 递归实现:回溯通常通过递归实现,每次递归调用尝试一个候选解。

  • 状态空间树:回溯可以看作是对状态空间树的深度优先遍历。

  • 剪枝优化:通过剪枝减少不必要的搜索,提高效率。

回溯的步骤

  1. 选择:从候选解中选择一个可能的选项。

  2. 递归:基于当前选择,递归尝试下一步。

  3. 撤销:如果当前选择不满足条件,撤销选择并尝试其他选项。

代码示例(全排列问题)

void backtrack(vector<int>& nums, vector<vector<int>>& result, vector<int>& path, vector<bool>& used) {if (path.size() == nums.size()) {result.push_back(path); // 找到一个全排列return;}for (int i = 0; i < nums.size(); i++) {if (used[i]) continue; // 跳过已使用的元素used[i] = true; // 选择当前元素path.push_back(nums[i]);backtrack(nums, result, path, used); // 递归尝试下一步path.pop_back(); // 撤销选择used[i] = false;}
}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> result;vector<int> path;vector<bool> used(nums.size(), false);backtrack(nums, result, path, used);return result;
}

应用场景

  • 全排列、组合问题。

  • 数独、八皇后问题。

  • 子集生成、分割问题。


2. 剪枝(Pruning)

本质

        剪枝是一种优化技术,其核心思想是在搜索过程中提前排除不可能产生有效解的分支,从而减少搜索空间

特点

  • 减少搜索空间:通过剪枝,避免对无效路径的搜索。

  • 提高效率:显著降低算法的时间复杂度。

  • 结合回溯使用:剪枝通常与回溯结合使用,进一步优化回溯算法。

剪枝的实现方法

  1. 可行性剪枝:在搜索过程中,如果当前选择不满足问题的约束条件,则提前终止该分支的搜索。

  2. 最优性剪枝:在搜索过程中,如果当前选择已经不可能产生更优的解,则提前终止该分支的搜索。

代码示例(组合总和问题)

void backtrack(vector<int>& candidates, int target, vector<vector<int>>& result, vector<int>& path, int start) {if (target == 0) {result.push_back(path); // 找到一个有效组合return;}for (int i = start; i < candidates.size(); i++) {if (candidates[i] > target) continue; // 剪枝:跳过不可能的选择path.push_back(candidates[i]); // 选择当前元素backtrack(candidates, target - candidates[i], result, path, i); // 递归尝试下一步path.pop_back(); // 撤销选择}
}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> result;vector<int> path;backtrack(candidates, target, result, path, 0);return result;
}

应用场景

  • 组合优化问题(如背包问题、旅行商问题)。

  • 数独、八皇后问题。

  • 子集生成、分割问题。


3. 回溯与剪枝的关系

回溯和剪枝通常结合使用:

  • 回溯提供了一种系统性搜索的方法。

  • 剪枝通过减少搜索空间,优化回溯算法的效率。

关系图


4. 扩展搜索问题

数独问题

  • 问题描述:填充数独棋盘,满足每行、每列、每个 3x3 子网格都包含 1-9 的数字。

  • 解决方法:回溯 + 剪枝。

八皇后问题

  • 问题描述:在 8x8 棋盘上放置 8 个皇后,使得它们互不攻击。

  • 解决方法:回溯 + 剪枝。

组合优化问题

  • 问题描述:在给定的候选集中寻找满足条件的组合(如组合总和、子集生成)。

  • 解决方法:回溯 + 剪枝。


5. 总结

技术核心思想实现方法应用场景
回溯尝试所有可能的候选解,发现不满足条件时回退递归全排列、组合问题、数独
剪枝提前排除不可能产生有效解的分支可行性剪枝、最优性剪枝组合优化问题、八皇后问题

        通过理解回溯与剪枝的本质、作用、实现方法以及应用场景,可以更好地解决复杂的组合优化问题和搜索问题。

相关文章:

递归、搜索与回溯算法 —— 名词解析

目录 一、递归 1、什么是递归&#xff1f; 2、递归的数学类比 3、为什么要用到递归&#xff1f; 问题具有递归结构&#xff1a; 代码简洁易懂&#xff1a; 解决复杂问题&#xff1a; 处理嵌套结构&#xff1a; 4、如何理解递归&#xff1f; 明确基准条件&#xff1a; …...

【docker】docker swarm lock和unlock的区别,以及旧节点重启的隐患

docker swarm lock/unlock 的作用 Docker Swarm 提供了**加密集群状态&#xff08;Encrypted Raft logs&#xff09;**的功能&#xff0c;可以防止 Swarm 集群的管理数据&#xff08;如任务分配、集群配置等&#xff09;在磁盘上被未授权访问。 docker swarm lock&#xff1a…...

Grafana使用日志5--如何重置Grafana密码

背景 有时候当账号太多的时候&#xff0c;根本记不住所有的账号密码&#xff0c;这时候就很容易登录失败&#xff0c;这时候怎么办呢&#xff1f; 接下来就让我来给大家演示一下Grafana的账号如果忘记了的话&#xff0c;该怎么找回自己的账号密码 操作 让我们来看一下具体的…...

ELK搭建初入

ELK搭建&#xff1a; 1、安装ElasticSearch &#xff08;用于存储收集到的日志信息&#xff09; 解压安装包 tar -xzvf elasticsearch-8.17.2-linux-x86_64.tar.gz 启动es&#xff1a;bin/elasticsearch –d&#xff08;默认端口号9200&#xff09; 浏览器输入es地址。出现…...

JVM 高级面试题及答案整理,最新面试题

JVM中的垃圾收集器有哪些&#xff0c;它们的工作原理是什么&#xff1f; JVM中的垃圾收集器主要包括以下几种&#xff1a; 1、 Serial收集器&#xff1a;它是一个单线程收集器&#xff0c;工作时会暂停所有其他工作线程&#xff08;"Stop-The-World"&#xff09;&a…...

第9章:LangChain结构化输出-示例5(基于大模型如何精确匹配POJO的字段)

如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于LangChain调用大模型如何进行结构化输出的真实…...

ref和reactive的区别 Vue3

Vue3中ref和reactive的区别 ref 可以定义基本数据类型&#xff0c;也可定义对象类型的响应式数据 reactive 只能定义对象类型的响应式数据 ref和reactive定义对象类型的响应式数据有什么不同 不同点1 ref定义的响应式数据&#xff0c;取值时需要先 .value 不同点2 替换整…...

基于MATLAB的OFDM通信系统仿真设计

下面将为你详细介绍基于MATLAB的OFDM通信系统仿真设计的步骤和示例代码。 1. OFDM系统原理概述 正交频分复用&#xff08;OFDM&#xff09;是一种多载波调制技术&#xff0c;它将高速数据流通过串并转换&#xff0c;分配到多个正交的子载波上进行传输&#xff0c;这样可以有效…...

地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析

本文旨在分享一套地铁站内导航系统技术方案&#xff0c;通过蓝牙Beacon技术与AI算法的结合&#xff0c;解决传统导航定位不准确、路径规划不合理等问题&#xff0c;提升乘客出行体验&#xff0c;同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文…...

JS复习练习题目、完整nodejs项目以及Commons、Es

### JS复习练习 - ![20250220204925](/up-z0.qiniup.com20250220204925.png) 1. 任务1&#xff1a;创建一个简单的问候函数 - 编写一个函数greet&#xff0c;接受一个名字作为参数&#xff0c;并返回一个问候语&#xff0c;例如&#xff1a;“Hello, [名字]! Welcome to Jav…...

Linux:理解O(1)调度算法的设计精髓

目录 一、从厨房看调度器本质 二、O(1)算法的核心架构 1.时间复杂度的革命 2.动态优先级魔法 三、算法运行的全景图 1.时间片分配策略 2.上下文切换的艺术 前言&#xff1a;前面文章提到关于并发的概念&#xff0c;并发针对的是单核的CPU上同时运行很多情况&#xff0c…...

[C++][cmake]使用C++部署yolov12目标检测的tensorrt模型支持图片视频推理windows测试通过

最近悄悄出了yolov12框架&#xff0c;标志着目标检测又多了一个检测利器&#xff0c;于是尝试在windows下部署yolov12的tensorrt模型&#xff0c;并最终成功。 重要说明&#xff1a;安装环境视为最基础操作&#xff0c;博文不做环境具体步骤&#xff0c;可以百度查询对应安装步…...

Uppy - 免费开源、功能强大的新一代 web 文件上传组件,支持集成到 Vue 项目

Uppy 这个优质的前端组件&#xff0c;可以解决几乎所有的文件上传问题&#xff0c;最近发布了 TS 重写的 4.0 新版本&#xff0c;实用性更强了。 Uppy 是一个 UI 外观时尚、模块化的 JavaScript 文件上传组件&#xff0c;这个组件可以与任何 web 技术栈集成&#xff0c;不仅轻…...

【游戏——BFS+分层图】

题目 分析 但凡是最优方案可能需要访问同一个点的情况&#xff0c;都需要应用“拆点”&#xff0c;或者说分层图的技巧。多出来的维度主要是区分同一个点的不同状态而用。 对于本题&#xff0c;访问的时机便是一个区分点。 对于类似题“AB路线”&#xff0c;同一个K段的位置是…...

SSL 证书是 SSL 协议实现安全通信的必要组成部分

SSL证书和SSL/TLS协议有着密切的关系&#xff0c;但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格&#xff1a; 属性SSL/TLS 协议SSL证书英文全称SSL&#xff08;Secure Sockets Layer&#xff09;&#xff0c;TLS&#xff08;Transport Layer Security&am…...

Spring 源码硬核解析系列专题(七):Spring Boot 与 Spring Cloud 的微服务源码解析

在前几期中,我们从 Spring 核心的 IoC、AOP、事务管理,到 Spring Boot 的自动装配,逐步揭示了 Spring 生态的底层原理。随着微服务架构的流行,Spring Boot 结合 Spring Cloud 成为了构建分布式系统的主流选择。本篇将深入 Spring Cloud 的核心组件,以服务注册与发现(Eure…...

嵌入式开发:傅里叶变换(5):STM32和Matlab联调验证FFT

目录 1. MATLAB获取 STM32 的原始数据 2. 将数据上传到电脑 3. MATLAB 接收数据并验证 STM32进行傅里叶代码 结果分析 STM32 和 MATLAB 联调是嵌入式开发中常见的工作流程&#xff0c;通常目的是将 STM32 采集的数据或控制信号传输到 MATLAB 中进行实时处理、分析和可视化…...

C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手

在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中&#xff0c;我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手&#xff0c;但是需要运行Py脚本&#xff0c;还比较麻烦&#xff0c;下面我们用C#依据Ollama提供的API接口开发一个本地A…...

洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】 https://www.luogu.com.cn/problem/P8705 【题目描述】 把 1∼2020 放在 21010 的矩阵里。要求同一行中右边的比左边大&#xff0c;同一列中下边的比上边的大。一共有多少种方案? 答案很大&#xff0c;你只需要给出方案数除以 2020 的余数即可。 【答案提交】 …...

我的AI工具箱Tauri版-FluxCharacterGeneration参考图像生成人像手办(Flux 版)

本教程基于自研的AI工具箱Tauri版进行ComfyUI工作流FluxCharacterGeneration参考图像生成人像手办&#xff08;Flux 版&#xff09;。 我的AI工具箱Tauri版 - FluxCharacterGeneration参考图像生成人像手办&#xff08;Flux版&#xff09; 基于先进的FLUX模型&#xff0c;通过…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...