深度优先搜索(DFS)在排列组合问题中的应用详解:C++实现与优化
一、排列问题(Permutations)
目标:生成所有可能的排列(元素顺序不同视为不同结果)。
示例:输入 [1,2,3]
,输出所有长度为3的排列,共6种。
C++实现代码
#include <iostream>
#include <vector>
using namespace std;void backtrack(vector<int>& nums, vector<bool>& used, vector<int>& path, vector<vector<int>>& res) {if (path.size() == nums.size()) {res.push_back(path); // 保存当前排列return;}for (int i = 0; i < nums.size(); ++i) {if (!used[i]) { // 选择未使用的元素used[i] = true;path.push_back(nums[i]);backtrack(nums, used, path, res); // 递归path.pop_back(); // 回溯used[i] = false;}}
}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> res;vector<bool> used(nums.size(), false);vector<int> path;backtrack(nums, used, path, res);return res;
}int main() {vector<int> nums = {1, 2, 3};auto permutations = permute(nums);for (auto& p : permutations) {for (int num : p) {cout << num << " ";}cout << endl;}return 0;
}
输出:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
关键点:
-
去重:通过
used
数组标记已使用的元素,避免重复选择。 -
回溯:递归后需撤销当前选择(
path.pop_back()
和used[i] = false
),以尝试其他分支。
二、组合问题(Combinations)
目标:生成所有可能的组合(元素顺序不同视为相同结果)。
示例:从 [1,2,3]
中选2个元素,输出 {1,2}
, {1,3}
, {2,3}
。
C++实现代码
#include <iostream>
#include <vector>
using namespace std;void backtrack(int start, int k, vector<int>& nums, vector<int>& path, vector<vector<int>>& res) {if (path.size() == k) {res.push_back(path); // 保存当前组合return;}for (int i = start; i < nums.size(); ++i) {path.push_back(nums[i]);backtrack(i + 1, k, nums, path, res); // 下一层从i+1开始,避免重复path.pop_back(); // 回溯}
}vector<vector<int>> combine(vector<int>& nums, int k) {vector<vector<int>> res;vector<int> path;backtrack(0, k, nums, path, res);return res;
}int main() {vector<int> nums = {1, 2, 3};int k = 2;auto combinations = combine(nums, k);for (auto& c : combinations) {for (int num : c) {cout << num << " ";}cout << endl;}return 0;
}
输出:
1 2 1 3 2 3
关键点:
-
顺序控制:每次递归从
i+1
开始,避免选择之前的元素,保证组合无序性。 -
剪枝优化:若剩余元素不足以填满组合,可提前终止循环。
三、处理重复元素
1. 含重复元素的排列去重
示例:输入 [1,1,2]
,输出不重复的排列 [1,1,2]
, [1,2,1]
, [2,1,1]
。
优化代码:
void backtrack(vector<int>& nums, vector<bool>& used, vector<int>& path, vector<vector<int>>& res) {if (path.size() == nums.size()) {res.push_back(path);return;}for (int i = 0; i < nums.size(); ++i) {if (used[i] || (i > 0 && nums[i] == nums[i-1] && !used[i-1])) {continue; // 跳过重复元素}used[i] = true;path.push_back(nums[i]);backtrack(nums, used, path, res);path.pop_back();used[i] = false;}
}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end()); // 必须排序vector<vector<int>> res;vector<bool> used(nums.size(), false);vector<int> path;backtrack(nums, used, path, res);return res;
}
关键点:
-
排序:预处理数组,使相同元素相邻。
-
剪枝条件:
nums[i] == nums[i-1] && !used[i-1]
表示跳过重复且未被使用的元素。
2. 含重复元素的组合去重
示例:输入 [1,2,2]
,输出不重复的组合 [1,2]
, [2,2]
。
优化代码:
void backtrack(int start, int k, vector<int>& nums, vector<int>& path, vector<vector<int>>& res) {if (path.size() == k) {res.push_back(path);return;}for (int i = start; i < nums.size(); ++i) {if (i > start && nums[i] == nums[i-1]) {continue; // 跳过重复元素}path.push_back(nums[i]);backtrack(i + 1, k, nums, path, res);path.pop_back();}
}vector<vector<int>> combineUnique(vector<int>& nums, int k) {sort(nums.begin(), nums.end()); // 必须排序vector<vector<int>> res;vector<int> path;backtrack(0, k, nums, path, res);return res;
}
关键点:
-
排序:预处理数组,使相同元素相邻。
-
剪枝条件:
i > start && nums[i] == nums[i-1]
跳过同一层中的重复元素。
四、时间复杂度分析
问题类型 | 时间复杂度 | 空间复杂度 |
---|---|---|
排列(无重复) | O(n×n!) | O(n) |
组合(无重复) | O(C(n,k) ×k) | O(k) |
排列(有重复) | O(n×n!/m!)(m为重复数) | O(n) |
组合(有重复) | O(C(n,k) ×k) | O(k) |
五、应用场景
-
排列:密码破解、任务调度、路径规划。
-
组合:子集生成、商品搭配、团队选拔。
六、总结
-
DFS核心:通过递归和回溯遍历所有可能的分支。
-
排列与组合区别:排列关注顺序,组合不关注顺序。
-
去重关键:排序 + 剪枝条件(跳过重复元素)。
-
优化技巧:剪枝提前终止无效分支,减少递归深度。
七、排列问题例题
1、输出全排列
P1706 全排列问题 - 洛谷
算法代码:
#include<bits/stdc++.h> // 包含常用的C++标准库头文件
using namespace std; // 使用标准命名空间int n; // 定义一个全局变量n,表示排列的长度
int vis[10]; // 定义一个大小为10的数组vis,用于标记某个数字是否已经被使用过
int a[10]; // 定义一个大小为10的数组a,用于存储1到n的数字
int b[10]; // 定义一个大小为10的数组b,用于存储当前生成的排列// 定义一个递归函数dfs,用于生成所有可能的排列
void dfs(int step)
{// 如果step等于n+1,说明已经生成了一个完整的排列if(step==n+1){// 输出当前排列for(int i=1;i<=n;i++){printf("%5d",b[i]); // 每个数字占5个字符宽度}printf("\n"); // 换行return; // 返回上一层递归}// 遍历1到n的所有数字for(int i=1;i<=n;i++){// 如果数字i没有被使用过if(vis[i]==0){b[step]=a[i]; // 将数字i放入当前排列的第step个位置vis[i]=1; // 标记数字i为已使用dfs(step+1); // 递归调用dfs,生成下一个位置的数字vis[i]=0; // 回溯,取消数字i的标记}}return; // 返回上一层递归
}int main()
{cin>>n; // 输入排列的长度n// 初始化数组a,a[i] = ifor(int i=1;i<=n;i++){a[i]=i; }dfs(1); // 从第1个位置开始生成排列return 0; // 程序正常结束
}
图解流程:
2、输出部分排列(需注意)
上述的代码是实现打印n个数的全排列,若我需要打印从 n
个数中任意选取 m
个数的排列,需要做以下两处修改:
-
修改
dfs
函数的终止条件:-
原代码的终止条件是
step == n + 1
,表示生成了完整的n
个数的排列。 -
现在需要改为
step == m + 1
,表示生成了m
个数的排列。
-
-
修改主函数中的输入和初始化:
-
需要额外输入一个变量
m
,表示从n
个数中选取m
个数进行排列。
-
#include<bits/stdc++.h> // 包含常用的C++标准库头文件
using namespace std; // 使用标准命名空间int n, m; // 定义全局变量n和m,n表示总数,m表示选取的数的个数
int vis[10]; // 定义一个大小为10的数组vis,用于标记某个数字是否已经被使用过
int a[10]; // 定义一个大小为10的数组a,用于存储1到n的数字
int b[10]; // 定义一个大小为10的数组b,用于存储当前生成的排列// 定义一个递归函数dfs,用于生成从n个数中选取m个数的排列
void dfs(int step)
{// 如果step等于m+1,说明已经生成了一个完整的m个数的排列if(step == m + 1){// 输出当前排列for(int i = 1; i <= m; i++){printf("%5d", b[i]); // 每个数字占5个字符宽度}printf("\n"); // 换行return; // 返回上一层递归}// 遍历1到n的所有数字for(int i = 1; i <= n; i++){// 如果数字i没有被使用过if(vis[i] == 0){b[step] = a[i]; // 将数字i放入当前排列的第step个位置vis[i] = 1; // 标记数字i为已使用dfs(step + 1); // 递归调用dfs,生成下一个位置的数字vis[i] = 0; // 回溯,取消数字i的标记}}return; // 返回上一层递归
}int main()
{cin >> n >> m; // 输入总数n和选取的数的个数m// 初始化数组a,a[i] = ifor(int i = 1; i <= n; i++){a[i] = i; }dfs(1); // 从第1个位置开始生成排列return 0; // 程序正常结束
}
示例运行:
假设输入:
n = 4 m = 2
输出将是:
1 21 31 42 12 32 43 13 23 44 14 24 3
3、输出组合(打印n个数中m个数的组合)(重要)
在DFS中,选择或者不选择第k个数就实现了各种组合。以下举两个例子:
(1)输出二进制
以打印000~111为例:
#include<bits/stdc++.h> // 包含常用的C++标准库头文件
using namespace std; // 使用标准命名空间int vis[10]; // 定义一个大小为10的数组vis,用于存储当前的状态(0或1)// 定义一个递归函数dfs,用于生成所有可能的二进制组合
void dfs(int k)
{// 如果k等于4,说明已经生成了一个完整的3位二进制组合if(k == 4){// 输出当前生成的3位二进制组合for(int i = 1; i < 4; i++){cout << vis[i]; // 输出vis数组的第1到第3个元素}cout << " "; // 换行}else{vis[k] = 0; // 将当前位设置为0dfs(k + 1); // 递归调用dfs,生成下一位vis[k] = 1; // 将当前位设置为1dfs(k + 1); // 递归调用dfs,生成下一位}
}int main()
{dfs(1); // 从第1位开始生成二进制组合return 0; // 程序正常结束
}
代码功能:
这段代码的功能是生成所有可能的3位二进制组合(从 000
到 111
),并输出这些组合。
代码流程:
-
初始化:
-
定义了一个全局数组
vis
,用于存储每一位的状态(0或1)。 -
数组大小为10,但实际只用到前3位(索引1到3)。
-
-
递归函数
dfs
:-
参数
k
表示当前正在处理的位数。 -
如果
k == 4
,说明已经生成了一个完整的3位二进制组合,输出vis[1]
到vis[3]
的值。 -
否则:
-
将当前位
vis[k]
设置为0,然后递归调用dfs(k + 1)
,生成下一位。 -
将当前位
vis[k]
设置为1,然后递归调用dfs(k + 1)
,生成下一位。
-
-
-
主函数
main
:-
调用
dfs(1)
,从第1位开始生成二进制组合。
-
输出结果:
运行代码后,输出将是所有3位二进制组合:
000 001 010 011 100 101 110 111
如果要反过来,只需交换选择数字0或1的逻辑选择代码行就可以了,输出:111 110 101 100 011 010 001 000,即:
#include<bits/stdc++.h> // 包含常用的C++标准库头文件
using namespace std; // 使用标准命名空间int vis[10]; // 定义一个大小为10的数组vis,用于存储当前的状态(0或1)// 定义一个递归函数dfs,用于生成所有可能的二进制组合
void dfs(int k)
{// 如果k等于4,说明已经生成了一个完整的3位二进制组合if(k == 4){// 输出当前生成的3位二进制组合for(int i = 1; i < 4; i++){cout << vis[i]; // 输出vis数组的第1到第3个元素}cout << " "; // 换行}else{vis[k] = 1; // 将当前位设置为0dfs(k + 1); // 递归调用dfs,生成下一位vis[k] = 0; // 将当前位设置为1dfs(k + 1); // 递归调用dfs,生成下一位}
}int main()
{dfs(1); // 从第1位开始生成二进制组合return 0; // 程序正常结束
}
(2)输出组合
以包含3个元素的集合{a,b,c}为例子,输出它的所有的子集。
#include<bits/stdc++.h> // 包含常用的C++标准库头文件,如iostream、vector、algorithm等
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都要加std::char a[] = {' ', 'a', 'b', 'c'}; // 定义字符数组a,包含空格和字母a、b、c,用于生成组合时选择字符
int vis[10]; // 定义状态数组vis,用于存储当前的状态(0或1),表示是否选择对应位置的字符// 定义一个递归函数dfs,用于生成所有可能的组合
void dfs(int k)
{// 如果k等于4,说明已经生成了一个完整的3位组合if(k == 4){// 输出当前生成的3位组合for(int i = 1; i < 4; i++){if(vis[i])cout << a[i]; // 如果vis[i]为1,输出字符数组a中对应的字符}cout << " "; // 输出空格分隔不同的组合}else{vis[k] = 0; // 将当前位设置为0,表示不选择字符数组a中的对应字符(即选择空格)dfs(k + 1); // 递归调用dfs,生成下一位的组合vis[k] = 1; // 将当前位设置为1,表示选择字符数组a中的对应字符dfs(k + 1); // 递归调用dfs,生成下一位的组合}
}int main()
{dfs(1); // 从第1位开始生成组合return 0; // 程序正常结束
}
代码功能解释:
-
该代码通过递归函数
dfs
生成所有可能的3位组合,组合中的每一位可以是空格或字符a
、b
、c
。 -
vis
数组用于记录每一位是否选择字符(1表示选择,0表示不选择)。 -
当
k == 4
时,表示已经生成了一个完整的3位组合,此时遍历vis
数组,输出对应的字符。 -
递归过程中,每次调用
dfs
时,都会尝试将当前位设置为0或1,然后继续递归生成下一位的组合。
输出示例:
运行该代码会输出所有可能的3位组合,例如:
a b c ab ac bc abc
(其中空格表示未选择字符)
相关文章:
深度优先搜索(DFS)在排列组合问题中的应用详解:C++实现与优化
一、排列问题(Permutations) 目标:生成所有可能的排列(元素顺序不同视为不同结果)。 示例:输入 [1,2,3],输出所有长度为3的排列,共6种。 C实现代码 #include <iostream> #i…...
GeoChat : Grounded Large Vision-Language Model for Remote Sensing论文精读
GeoChat : Grounded Large Vision-Language Model for Remote Sensing 是一个针对遥感场景的llm,提供支持多任务对话(对高分辨率遥感图像)。也造了个数据集。 一些思考: 文中提到的局限性:小物体和多框预测较难。小物…...
Postman使用02、断点、fiddler弱网测试
脚本操作 一、脚本导出 1.导出json脚本 2.打包json文件 3.下载的文件 二 .导入脚本 1.选择文件 2.点击导入 3.导入的接口 三.多接口运行 1.集合右键,点击run ,运行多个接口 2.编辑环境,集合,执行次数等 3.运行多个接口 四.运行…...
深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置
文章目录 1. 什么是 std::bind_front?2. 使用 std::bind_front2.1 基本用法2.2 绑定多个参数 3. 优势与特点3.1 简化代码3.2 支持可调用对象3.3 支持完美转发 4. 实际应用场景4.1 事件处理4.2 算法通用化4.3 成员函数调用 5. 总结 在现代 C 编程中,函数绑…...
Opencv计算机视觉编程攻略-第三节 图像颜色处理
第三节 图像颜色处理 1.颜色比较2.GrabCut分割图像3.色调、饱和度以及亮度 1.颜色比较 主要实现逐像素的颜色比较,其中注意BGR颜色空间不连续,不利于颜色提取和区分,转换到Lab空间: int getColorDistance(const cv::Vec3b& c…...
第十七章:Future Directions_《C++ Templates》notes
Future Directions 核心重难点:示例代码: 设计题多选题答案设计题详解 核心重难点: 泛型非类型模板参数 允许任意类型作为非类型模板参数(如template<typename T, auto N>)需解决类型推导和链接问题 编译期控制…...
ComfyUI-PSD-Replace: 海报与壁纸批量生成
ComfyUI-PSD-Replace: 海报与壁纸批量生成 🚀 插件介绍 ComfyUI-PSD-Replace 是一款强大的图像批量处理插件,专为设计师和创意工作者打造。无论你是想快速生成多款海报、定制壁纸,还是批量更新设计模板,本插件都能帮你轻松实现&a…...
图解预训练模型 ELMo 和 BERT
一、ELMo 二、BERT 以上笔记参考自b站up主 自然卷小蛮(自然卷小蛮的个人空间-自然卷小蛮个人主页-哔哩哔哩视频),感兴趣的可以去深入了解。...
YoloV8训练和平精英人物检测模型
概述 和平精英人物检测,可以识别游戏中所有人物角色,并通过绘制框将人物选中,训练的模型仅仅具有识别功能,可以识别游戏中的视频、图片等文件,搭配Autox.js可以推理,实现实时绘制,但是对手机性…...
基于物联网的智能蔬菜仓库设计(论文+源码)
1系统功能分析 由于蔬菜仓库内部环境直接影响到内部货物的正常存储工作,因此对蔬菜仓库内部环境进行智能化的监控具有重要意义。本次基于物联网的智能蔬菜仓库设计,系统实现的功能如下: (1)对蔬菜仓库内部进行温度检测…...
Java 字符流全解析:核心类实战指南
一、FileReader 与 FileWriter:文本文件基础操作 功能:直接基于字符处理文本文件,自动完成字节到字符的解码(默认使用系统编码)。 适用场景:读写简单的文本文件(如 .txt、.csv)。 …...
SQL Server 2022 安装问题
一、安装与配置问题 1. SQL Server 2022 安装失败怎么办? 常见原因: 硬件或操作系统不满足最低要求(如内存、磁盘空间不足)。未关闭防火墙或杀毒软件。之前版本的 SQL Server 残留文件未清理。 解决方案: 确保硬件配…...
Vue3 实现pdf预览
1.使用到的插件 vue3-pdf-app 以及预览效果 2.下载依赖 // 可以使用npm 以及pnpm // 下载版本1.0.3 pnpm install vue3-pdf-app^1.0.3 3.封装pdfModel组件复用 <template><VuePdfApp :page-scale"pageScale" :theme"theme" :style"width: …...
python网络爬虫开发实战之网页数据的解析提取
目录 1 XPath的使用 1.1 XPath概览 1.2 XPath常用规则 1.3 准备工作 1.4 实例引入 1.5 所有节点 1.6 节点 1.7 父节点 1.8 属性匹配 1.9 文本获取 1.10 属性获取 1.11 属性多值匹配 1.12 多属性匹配 1.13 按序选择 1.14 节点轴选择 2 Beautiful Soup 2.1 简介…...
GitHub Copilot平替:CodeGeeX 2.0实测报告
本文基于20个真实开发场景对CodeGeeX 2.0进行深度评测,涵盖代码生成质量、上下文理解能力、多语言支持度等关键维度。通过Python数据分析、Java微服务、React前端开发三大核心场景的对比实验,揭示其相比GitHub Copilot在中文语境支持、本地化部署、隐私保…...
QT对象模型
信号,槽,函数执行顺序 首先,拖入一个按钮,在转到槽,在click() 转到widget.cpp 在widget.h中 然后在widget.cpp中 运行结果 当发出信号后,先执行槽函数,再执行信号后面的函数(单线程) 在widget.h…...
C++:类型推导规则 unsigned short + 1
在 C/C 中,整数提升(Integer Promotion) 规则决定了 vlan_id 1 的类型: unsigned short 的值在运算时会被 提升(promote) 到 int 或 unsigned int(取决于平台)。 默认情况下&#x…...
PHP接口开发:从基础到高级的全面指南
一、接口基础与核心概念(约800字) 1.1 接口的本质定义 在PHP中,接口(Interface)是一种特殊的抽象结构,它通过interface关键字定义一组方法的契约规范,不包含具体实现。这种设计强制实现类必须遵循统一的调用标准,如: interface PaymentGateway {public function proc…...
C#Dictionary值拷贝还是引用
Dictionary值拷贝还是引用 这可能算是Directionary的一个坑值类型(Value Type)引用类型(Reference Type)总结 关于锁1. **锁对象的可见性**2. **锁对象的唯一性**3. **最佳实践**4. **为什么 readonly 是一个好的选择**5. **总结*…...
deepseek实战教程-第六篇查找源码之仓库地址与deepseek-R1、deepseek-LLM仓库内容查看
上一篇讲了支持deepseek的模型应用的本地安装和部署以及使用。再上一篇讲解了deepseek提供的开放api,便于开发者基于deepseek提供的接口来编写属于自己的业务应用程序。但是前面几篇我们都是在用模型,我们知道deepseek是开源的,那么deepseek的源码在哪里,具体源码是什么样的…...
WELL健康建筑认证是什么?
**WELL健康建筑认证:全方位呵护居住者福祉的权威标准** WELL健康建筑认证,这一源自美国的全球性健康建筑标准,宛如建筑界的璀璨明珠,以其独特的光芒照亮了健康建筑的发展之路。它不仅是全球首部专门针对室内环境提升人体健康与福…...
C++ STL 序列式容器之(三)-- List
一、什么是list? Lists are sequence containers that allow constant time insert and erase operations anywhere within the sequence, and iteration in both directions. 列表是序列容器,允许在序列中的任何位置进行以常量时间插入和擦除操作&…...
CAN基础知识学习二
一、控制器局域网总线(CAN,Controller Area Network); 二、CAN FD 是CAN with Flexible Data rate的缩写,翻译为【可变速率的 CAN】 CAN-FD 采用了两种位速率:从控制场中的 BRS 位到 ACK 场之前(…...
Java编程思想:为何有时要将子类对象赋值给父类引用
为何有时要将子类对象赋值给父类引用,用父类来进行实例化? 这就要说多态的优势: 代码的扩展性和降低耦合度,而不是完全避免修改代码。 TuXing t new Changfangxing(); Changfangxing k (Changfangxing)t;原因1: 代码可拓展性 …...
2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)
龙卷风优化算法(Tornado optimizer with Coriolis force)是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”(IF:11.7)的2025年智能优化算法 01.引言 当自然界的狂暴之力,化身数字世界的智慧引擎&…...
2小样本学习(Few-Shot)之相似度
目录 小样本学习的基本思路: 具体实现方法: 小样本学习的基本思路: 学习一个相似度函数similarity function:sim(x,x) 两个样本越相近,相似度越高。 比如:...
docker-操作实战
前言 C镜像制作 因为我平常不用,所以不书写了 SpringBoot 微服务镜像制作 mkdir java ca java cp /data/maxhou/myapp/xxx.jar . vi Dockerfile FROM openjdk:8 COPY ./xxx.jar /app.jar CMD ["java","-jar","/app.jar"]COPY ./…...
后大模型时代智能体将成为“新宠”
智能体 |未来已来 智能体 |市场井喷 智能体 |定义 智能体 |与大模型的区别 智能体 |与Copilot的区别 智能体 |企业价值 智能体 |个体价值 智能体 |开发流程 智能体 |提示词解读 智能体 |应用场景 智能体 |重难点问题...
【MySQL】监控MySQL
目录 使用状态变量监控MySQL 使用性能模式(Performance Schema)监控MySQL 1.性能模式 2.性能模式设置表 3.sys模式 使用状态变量监控MySQL 使用 show status 语句评估系统运行状况。 可以添加范围修饰符global或session来显示全局或本地状态信息。…...
CTF类题目复现总结-[BSidesSF2020]toast-clicker 1
一、靶场地址 https://buuoj.cn/challenges#[BSidesSF2020]toast-clicker1二、复现步骤 1、下载压缩包,解压是apk文件; 2、利用 jadx apk反编译工具; jadx下载地址:https://github.com/skylot/jadx67, 83, 68, 120, 62, 109, …...
(更新完)Supplementary Material——AZ-NAS
6. Supplementary Material 在本补充材料中,我们提供了 AZ-NAS 在 NDS [18]、NAS-Bench-201 [7] 和 MobileNetV2 [14, 19] 搜索空间上的额外结果和深入分析。 Additional results on the NDS benchmark. 神经设计空间(NDS) [18] 基准提供了…...
基于SSM框架的线上甜品销售系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此网上销售信息的…...
TCP | 序列号和确认号 [逐包分析] | seq / ack 详解
注 : 本文为 “TCP 序号(seq)与确认序号(ack)” 相关文章合辑。 英文引文,机翻未校。 中文引文,略作重排。 如有内容异常,请看原文。 Understanding TCP Seq & Ack Numbers […...
Citus源码(1)分布式表行为测试
最近对citus的实现非常好奇,本篇对citus的行为做一些测试。本篇只测行为,不分析源码。后面会继续写一系列文章分析citus源码。 环境:3节点 PG17 with citus。 SELECT citus_set_coordinator_host(127.0.0.1, 3001); SELECT citus_add_node(1…...
【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解
DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解 一、获取 API Key二、调用 DeepSeek API方法 1:使用 OpenAI Python SDK 调用 DeepSeek API方法 2:使用 requests 库直接发送 HTTP 请求方法 3:使用 curl 命令 相关链接 一…...
Web前端之UniApp、Taro、ReactNative和Flutter的区别
MENU 前言介绍及公司技术差异使用方法使用场景差异注意事项打包与部署差异框架应用实例结语 前言 在移动应用开发领域,跨平台框架已成为开发者的得力工具。UniApp、Taro、ReactNative和Flutter它们在Android(安卓)或iOS(苹果&…...
[leetcode]map的用法
1. 定义和初始化 定义:std::map是一个关联容器,键值对会自动根据键的值进行排序(默认是升序)。 cpp复制 map<char, int> mp; 插入元素:可以通过operator[]或insert方法插入键值对。 cpp复制 mp[a] 1; mp[b] 3…...
PHP大马的使用
BestShell/best_php_shell.php at master Kevil-hui/BestShell 这里用到的是这位师傅的大马(主要是从头开始写一个大马实在太麻烦了) 用pikachu靶场进行上传的测试 在这里传马,这个是简单的前端校验,bp抓包改后缀就好了 上传成…...
【CC2530 教程 十】CC2530 Z-Stack 协议栈
一、Z-Stack 协议栈目录结构: Z-Stack 协议栈可以从 TI 官网免费下载,下载安装完成以后,会默认在 C 盘的根目录下创建 Texas Instruments 目录,该目录下的子目录就是安装的 Z-Stack 文件,并且在该子目录下创建Accessor…...
区间端点(java)(贪心问题————区间问题)
deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到,这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组,每一个一维…...
定长内存池原理及实现
目录 一、池化技术 二、内存池 三、内存池主要解决的问题 四、定长内存池的实现 1.定长内存池的原理 2.框架 3.Delete实现 4.New实现 5.性能测试 五、源码 FixedMemoryPool.h test.cc 一、池化技术 所谓“池化技术”,就是程序先向系统申请过量的资源&…...
通过php连接redis数据库
如上图所示,这是去搭建一个lamp平台, 阿帕奇和php安装好之后,php直接就被安装成阿帕奇的一个功能模块。 如上图所示,这就是php作为阿帕奇的功能模块。 如上图所示,我们去正常启动redis数据库。 如上图所示,…...
3D点云的深度学习网络分类(按照作用分类)
1. 3D目标检测(Object Detection) 用于在点云中识别和定位目标,输出3D边界框(Bounding Box)。 🔹 方法类别: 单阶段(Single-stage):直接预测3D目标位置&am…...
论文解读:《Word embedding factor based multi-head attention》——基于词嵌入因子的多头注意力
原文链接:Word embedding factor based multi-head attention | Artificial Intelligence Review 多头注意力机制线性地将查询、键和值投影到不同的子空间中,允许模型从不同的角度理解输入序列,并利用输入句子序列中有关令牌之间关系的信息。…...
单片机和微控制器知识汇总——《器件手册--单片机、数字信号处理器和可编程逻辑器件》
目录 四、单片机和微控制器 4.1 单片机(MCU/MPU/SOC) 一、定义 二、主要特点 三、工作原理 四、主要类型 五、应用领域 六、选型与设计注意事项 七、发展趋势 4.2 数字信号处理器(DSP/DSC) 编辑编辑 一、定义 二、工作原理 三、结构特点 四、应用领域 五、选型与设计注…...
LeetCode hot 100 每日一题(15)——48.旋转图像
这是一道难度为中等的题目,让我们来看看题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…...
Java多线程精讲:线程操作与状态转换全解析
前言 本章内容为作者结合学习与实践的总结整理,虽力求准确,但疏漏之处在所难免。若有任何疑问或建议,恳请读者朋友们不吝指正,共同完善知识体系,感激不尽! 一、认识多线程(Thread&#…...
HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?
一、HashMap 的位操作设计 HashMap 使用位运算优化哈希计算与索引定位,核心场景如下: 哈希扰动函数 计算键的哈希值时,将高16位与低16位异或: static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hash…...
GitHub开源的容器管理面板-Dpanel
dpanel Docker安装部署二进制部署 GitHub官网 一块轻量化docker可视化管理面板,由国人开发,个人觉得是比较好用的,功能都很齐全,并且可以通过修改源码,自定义前端样式等。 Docker安装部署 官网 部署环境࿱…...
vue-将组件内容导出为Word文档-docx
1. 安装依赖 首先,我们需要安装docx库,以便在前端生成Word文档。可以通过以下命令进行安装: npm install docx 2. 实现导出功能 2.1 初始化文档 使用docx库创建一个新的文档实例,并定义文档的结构和内容。我们使用Document、…...