【NBUOJ刷题笔记】递推_递归+分治策略2

0. 前言

PS:本人并不是集训队的成员,因此代码写的烂轻点喷。。。本专题一方面是巩固自己的算法知识,另一方面是给NBU学弟学妹们参考解题思路(切勿直接搬运抄袭提交作业!!!)最后,该系列博客AC代码均以Java语言提交,C/C++的可以参考思路编写代码

1. 题目详情

1.1 题目一:第K小的数

1.1.1 题目信息

题目描述
输入n个数,求其中第k小的数。(要求采用分治法完成,不建议采用完整的排序)
输入要求
第一行包含两个整数n和k;n<1000,1<=K<=n
第二行包含n个整数。
输出要求
输出第k小的那个整数_。_
输入样例
15 1
1 3 7 2 4 6 -1 0 9 88 2 5 17 6 1
输出样例
-1
来源
NBUOJ

1.1.2 算法思路(分治法)

本题的一般思路有如下几种:

  • 借助堆/优先级队列实现的TopK问题
  • 基于完整的排序算法
  • 分治策略

由于题目限制使用分治思想,因此这里介绍最后一种方法
分治思想:简单来说就是分而治之,化繁为简,将大问题分解成子问题逐一求解
算法步骤(重要)

  1. 题目要求找到n个数中第k小的元素,我们首先在当前数组中随意选中一个基准元素pivot
  2. 然后使用双指针 区域划分 的思想将数组划分为两部分,其中左半区域的元素比pivot小,右半区域的元素比pivot
  3. 此时假设pivot基准元素的下标是pivotIndexpivot元素就是整个数组中第 pivotIndex + 1 小的元素
  4. 此时令左半区域的元素个数为leftNum,如果 k==leftNum + 1 那么直接返回基准元素,如果 k < leftNum + 1 那么就递归左半部分区域继续找到第k小的元素,如果 k > leftNum + 1 ,那么就递归右半部分区域递归找第k - (leftNum + 1)小的元素

PS:如果不清楚数组区域划分算法的小伙伴可以自行搜索或者直接看下面的代码实现部分
示例:我们使用上述给出的测试用例画图讲解:
image.png

1.1.2 AC代码(Java实现)

NBUOJ上面Java带中文注释会报错!因此这里放了两个版本的代码,前面不带注释的可以直接跑OJ通过,后面的方便读者阅读

1.1.2.1 不带注释版本
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int k = scanner.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}System.out.println(partition(arr, 0, n - 1, k));}private static int partition(int[] arr, int left, int right, int k) {int pivot = arr[right];int prev = left - 1; int cur = left;while (cur <= right) {if (arr[cur] <= pivot) {int tmp = arr[prev + 1];arr[prev + 1] = arr[cur];arr[cur] = tmp;cur++;prev++;} else {cur++;}}int leftNum = prev - left; if (leftNum + 1 == k) {return pivot;} else if (leftNum + 1 > k) {return partition(arr, left, prev - 1, k);} else {return partition(arr, prev + 1, right, k - (leftNum + 1));}}
}
1.1.2.2 带注释版本
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int k = scanner.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}System.out.println(partition(arr, 0, n - 1, k));}/*** 在数组arr的[left, right]区域找到第k小的数并返回* @return 第k小的数*/private static int partition(int[] arr, int left, int right, int k) {// 选基准元素int pivot = arr[right];int prev = left - 1; // 指向小于pivot的最后元素int cur = left; // 遍历数组while (cur <= right) {if (arr[cur] <= pivot) {// 将小于等于pivot的元素移至前面int tmp = arr[prev + 1];arr[prev + 1] = arr[cur];arr[cur] = tmp;cur++;prev++;} else {// 大于pivot不用移动cur++;}}int leftNum = prev - left; // 左半区域元素个数if (leftNum + 1 == k) {return pivot;} else if (leftNum + 1 > k) {// 递归左半区域return partition(arr, left, prev - 1, k);} else {// 递归右半区域return partition(arr, prev + 1, right, k - (leftNum + 1));}}
}

1.1.3 扩展题

这里放一些跟本题类似的OJ题(读者可自行尝试解题):

  1. LeetCode数组中的第K大元素:https://leetcode.cn/problems/xx4gT2/description/
  2. LeetCode最小k个数:https://leetcode.cn/problems/smallest-k-lcci/description/

1.2 题目二:棋盘覆盖

1.2.1 题目信息

题目描述
在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
image.png
输入要求
输入一个整数k,k<=5;
输入特殊格子的坐标x,y。
输出要求
输出一个由数值表示的二维矩阵。填充规则如下:
(1)用数值填充方格;
(2)特殊方格数值为0;
(3)从中心点开始;然后左上、右上、左下、右下的计数顺序填数;同一块用相同数值表示;
(4)每个数值占4个位置空间;右对齐,左补空格。
输入样例
3
1 2
输出样例
image.png
来源
NBUOJ

1.2.2 算法思路(分治法)

分治策略:首先我们需要明确填充的顺序,根据题目描述填充规则为,从中心点开始,然后按照左上,右上,左下,右下的顺序进行填充
算法步骤

  1. 首先定义出口条件:只有一个元素时不处理
  2. 找到当前区域的中心点,另四个点位坐标分别是(midRow, midCol),(midRow, midCol + 1),(midRow + 1, midCol),(midRow + 1, midCol + 1),分别对应四个方位(左上、右上、左下、右下)按照顺序进行处理,**以左上方位举例:**如果说左上存在特殊点,那么特殊点不变继续递归填充dfs(左上, 原特殊点),但是如果左上方位内部没有特殊点,那么就将当前中心区域的点位作为特殊点继续递归dfs(左上,新特殊点),此时新特殊点为(midRow, midCol)

示例:也许上面的文字描述有点抽象,还是以画图进行举例:
输入:2 0 3
image.png
image.png
image.png
image.png
image.png
注意:如果我们使用成员变量(或者C++中的全局变量),我们需要先维护好中间位置的填充值,然后在递归四个方位,不然有可能出现在递归完左上角后准备填充中间元素的右上区域值时(填充值已经被改变),不过也可以事先全部填充完中间元素再进行递归(看个人习惯)

1.2.3 AC代码(Java实现)

NBUOJ上面Java带中文注释会报错!因此这里放了两个版本的代码,前面不带注释的可以直接跑OJ通过,后面的方便读者阅读

1.2.3.1 不带注释版本
import java.util.Scanner;public class Main {private static int curValue = 1;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextInt()) {curValue = 1;int k = scanner.nextInt();int specialRow = scanner.nextInt();int specialCol = scanner.nextInt();int edges = (int) Math.pow(2, k);int[][] matrix = new int[edges][edges];matrix[specialRow][specialCol] = 0;partition(matrix, 0, edges - 1, 0, edges - 1, specialRow, specialCol);for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length - 1; j++) {System.out.printf("%4s", matrix[i][j]);}System.out.printf("%4s\n", matrix[i][matrix[i].length - 1]);}}}private static void partition(int[][] matrix, int upRow, int downRow, int leftCol, int rightCol, int specialRow, int specialCol) {if (upRow == downRow && leftCol == rightCol) {return;}int midValue = curValue;curValue++;int midLeftUpRow = (upRow + downRow) / 2;int midLeftUpCol = (leftCol + rightCol) / 2;if (upRow <= specialRow && specialRow <= midLeftUpRow && leftCol <= specialCol && specialCol <= midLeftUpCol) {partition(matrix, upRow, midLeftUpRow, leftCol, midLeftUpCol, specialRow, specialCol);} else {matrix[midLeftUpRow][midLeftUpCol] = midValue;partition(matrix, upRow, midLeftUpRow, leftCol, midLeftUpCol, midLeftUpRow, midLeftUpCol);}int midRightUpRow = midLeftUpRow;int midRightUpCol = midLeftUpCol + 1;if (upRow <= specialRow && specialRow <= midRightUpRow && midRightUpCol <= specialCol && specialCol <= rightCol) {partition(matrix, upRow, midRightUpRow, midRightUpCol, rightCol, specialRow, specialCol);} else {matrix[midRightUpRow][midRightUpCol] = midValue;partition(matrix, upRow, midRightUpRow, midRightUpCol, rightCol, midRightUpRow, midRightUpCol);}int midLeftDownRow = midLeftUpRow + 1;int midLeftDownCol = midLeftUpCol;if (midLeftDownRow <= specialRow && specialRow <= downRow && leftCol <= specialCol && specialCol <= midLeftDownCol) {partition(matrix, midLeftDownRow, downRow, leftCol, midLeftDownCol, specialRow, specialCol);} else {matrix[midLeftDownRow][midLeftDownCol] = midValue;partition(matrix, midLeftDownRow, downRow, leftCol, midLeftDownCol, midLeftDownRow, midLeftDownCol);}int midRightDownRow = midLeftUpRow + 1;int midRightDownCol = midLeftUpCol + 1;if (midRightDownRow <= specialRow && specialRow <= downRow && midRightDownCol <= specialCol && specialCol <= rightCol) {partition(matrix, midRightDownRow, downRow, midRightDownCol, rightCol, specialRow, specialCol);} else {matrix[midRightDownRow][midRightDownCol] = midValue;partition(matrix, midRightDownRow, downRow, midRightDownCol, rightCol, midRightDownRow, midRightDownCol);}}
}
1.2.3.2 带注释版本
import java.util.Scanner;public class Main {private static int curValue = 1;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextInt()) {// 读取k值curValue = 1;int k = scanner.nextInt();int specialRow = scanner.nextInt(); // 特殊点横坐标int specialCol = scanner.nextInt(); // 特殊点纵坐标int edges = (int) Math.pow(2, k);int[][] matrix = new int[edges][edges];matrix[specialRow][specialCol] = 0;partition(matrix, 0, edges - 1, 0, edges - 1, specialRow, specialCol);for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length - 1; j++) {System.out.printf("%4s", matrix[i][j]);}System.out.printf("%4s\n", matrix[i][matrix[i].length - 1]);}}}/**** @param matrix 矩阵* @param upRow 行的上界* @param downRow 行的下界* @param leftCol 列的左边界* @param rightCol 列的右边界* @param specialRow 特殊点横坐标* @param specialCol 特殊点纵坐标*/private static void partition(int[][] matrix, int upRow, int downRow, int leftCol, int rightCol, int specialRow, int specialCol) {if (upRow == downRow && leftCol == rightCol) {// 只有一个元素,直接返回return;}// 计算中心区域// 维护中间区域填充值int midValue = curValue;curValue++;int midLeftUpRow = (upRow + downRow) / 2;int midLeftUpCol = (leftCol + rightCol) / 2;if (upRow <= specialRow && specialRow <= midLeftUpRow && leftCol <= specialCol && specialCol <= midLeftUpCol) {// 特殊点在左上区域partition(matrix, upRow, midLeftUpRow, leftCol, midLeftUpCol, specialRow, specialCol);} else {matrix[midLeftUpRow][midLeftUpCol] = midValue;partition(matrix, upRow, midLeftUpRow, leftCol, midLeftUpCol, midLeftUpRow, midLeftUpCol);}int midRightUpRow = midLeftUpRow;int midRightUpCol = midLeftUpCol + 1;if (upRow <= specialRow && specialRow <= midRightUpRow && midRightUpCol <= specialCol && specialCol <= rightCol) {// 特殊点在右上区域partition(matrix, upRow, midRightUpRow, midRightUpCol, rightCol, specialRow, specialCol);} else {matrix[midRightUpRow][midRightUpCol] = midValue;partition(matrix, upRow, midRightUpRow, midRightUpCol, rightCol, midRightUpRow, midRightUpCol);}int midLeftDownRow = midLeftUpRow + 1;int midLeftDownCol = midLeftUpCol;if (midLeftDownRow <= specialRow && specialRow <= downRow && leftCol <= specialCol && specialCol <= midLeftDownCol) {// 特殊点在左下区域partition(matrix, midLeftDownRow, downRow, leftCol, midLeftDownCol, specialRow, specialCol);} else {matrix[midLeftDownRow][midLeftDownCol] = midValue;partition(matrix, midLeftDownRow, downRow, leftCol, midLeftDownCol, midLeftDownRow, midLeftDownCol);}int midRightDownRow = midLeftUpRow + 1;int midRightDownCol = midLeftUpCol + 1;if (midRightDownRow <= specialRow && specialRow <= downRow && midRightDownCol <= specialCol && specialCol <= rightCol) {// 特殊点在右下区域partition(matrix, midRightDownRow, downRow, midRightDownCol, rightCol, specialRow, specialCol);} else {matrix[midRightDownRow][midRightDownCol] = midValue;partition(matrix, midRightDownRow, downRow, midRightDownCol, rightCol, midRightDownRow, midRightDownCol);}}
}

1.3 题目三:求逆序对

1.3.1 题目信息

题目描述
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
要求用分治法求解。
输入要求
第一行为n,表示序列长度;
接下来的n行,第i+1行表示序列中的第i个数。/或者第2行有n个数。
输出要求
所有逆序对总数
输入样例
4
3
2
3
2
输出样例:
3
来源
NBUOJ

1.3.2 算法思路(分治法)

这里直接给大家介绍算法思路了:
模板:归并排序
算法步骤(重要)

  1. 我们设计一个递归函数partition(int[] arr, int left, int right)求解区间内逆序对的个数并且完成排序功能
  2. 然后我们将数组划分为两个区间[left, mid],[mid + 1, right]
  3. 递归调用partition(arr, left, mid)此时将左半部分区间逆序对统计完毕并且排序完成,递归调用partition(arr, mid + 1, right)此时将右半部分区间逆序对统计完毕并且排序完成
  4. 此时我们只需要统计排序完毕的左区间和排序完毕后右区间之间的逆序对个数了

PS:上述代码基于归并排序的模板实现,下面着重讲解如何统计两个排序完毕区间之间的逆序对个数
示例:测试用例:[1, 5, 2, 7, 4, 3, 0, 6] 画图讲解:
image.png
上图所示是递归与回溯的示意图:下面我们专门讲解两个有序区间内部如何统计逆序对的问题

PS:与上图示意图有所不一致的是,统计逆序对的问题在归并排序的时候最好使用降序排序,至于为什么,大家下来自己尝试一下嘻嘻!

image.png
此时相比聪明的大家已经可以想明白过程了(事实上就是在二路归并中进行逆序对的统计,并且只有左区间的当前元素大于右区间当前元素时才会统计),当左区间全部遍历完毕后,两个区间之间的逆序对个数就统计完毕了!

1.3.3 AC代码(Java实现)

NBUOJ上面Java带中文注释会报错!因此这里放了两个版本的代码,前面不带注释的可以直接跑OJ通过,后面的方便读者阅读

1.3.3.1 不带注释版本
import java.util.Scanner;public class Main {private static int reversePairCount = 0;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextInt()) {reversePairCount = 0;int n = scanner.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}partition(arr, 0, n - 1);System.out.println(reversePairCount);}}private static void partition(int[] arr, int left, int right) {if (left >= right) {return;}int mid = (left + right) / 2;partition(arr, left, mid);partition(arr, mid + 1, right);int[] tmp = new int[right - left + 1];int tmpIndex = 0;int left1 = left;int right1 = mid;int left2 = mid + 1;int right2 = right;while (left1 <= right1 && left2 <= right2) {if (arr[left1] > arr[left2]) {tmp[tmpIndex++] = arr[left1];left1++;reversePairCount += (right2 - left2 + 1);} else {tmp[tmpIndex++] = arr[left2];left2++;}}while (left1 <= right1) {tmp[tmpIndex++] = arr[left1];left1++;}while (left2 <= right2) {tmp[tmpIndex++] = arr[left2];left2++;}for (int i = 0; i < tmpIndex; i++) {arr[left + i] = tmp[i];}}
}
1.3.3.2 带注释版本
import java.util.Scanner;public class Main {private static int reversePairCount = 0;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextInt()) {reversePairCount = 0;int n = scanner.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}partition(arr, 0, n - 1);System.out.println(reversePairCount);}}/*** 统计区间[left, right]内部逆序对的个数* @param arr 数组元素* @param left 左区间* @param right 右区间*/private static void partition(int[] arr, int left, int right) {if (left >= right) {return;}// 计算中心下标int mid = (left + right) / 2;partition(arr, left, mid); // 统计左区间逆序对个数并排序partition(arr, mid + 1, right); // 统计右区间逆序对个数并排序int[] tmp = new int[right - left + 1]; // 临时数组int tmpIndex = 0;int left1 = left;int right1 = mid;int left2 = mid + 1;int right2 = right;while (left1 <= right1 && left2 <= right2) {if (arr[left1] > arr[left2]) {tmp[tmpIndex++] = arr[left1];left1++;reversePairCount += (right2 - left2 + 1);} else {tmp[tmpIndex++] = arr[left2];left2++;}}while (left1 <= right1) {tmp[tmpIndex++] = arr[left1];left1++;}while (left2 <= right2) {tmp[tmpIndex++] = arr[left2];left2++;}// 拷贝回原数组for (int i = 0; i < tmpIndex; i++) {arr[left + i] = tmp[i];}}
}

1.3.4 扩展题

这里放一些跟本题类似的OJ题(读者可自行尝试解题):

  1. LeetCode交易逆序对的总数:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/description/
  2. LeetCode翻转对:https://leetcode.cn/problems/reverse-pairs/description/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2871069.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【matlab】如何批量修改图片命名

【matlab】如何批量修改图片命名 (●’◡’●)先赞后看养成习惯😊 假如我的图片如下,分别是1、2、3、4、5的命名 需求一:假如现在我需要在其后面统一加上_behind字符串,并且保留原命名,同时替换掉原先的图片,也就是不copy新的一份,直接在原文件夹中处理,我们可以进行…

软件杯 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

openEuler学习总结1(仅供学习参考)

华为的openEuler内核是源于Linux。 openEuler操作系统安装流程 第一步&#xff1a;开启虚拟化 第二步&#xff1a;安装一个虚拟化软件virtualbox 第三步&#xff1a;镜像 第四步&#xff1a;配置 设置虚拟机所在的目录 把网卡类型选择成桥接网卡 挂载镜像 设置完成&#xff0…

YOLOv9详解

1.概述 在逐层进行特征提取和空间转换的过程中&#xff0c;会损失大量信息&#xff0c;例如图中的马在建模过程中逐渐变得模糊&#xff0c;从而影响到最终的性能。YOLOv9尝试使用可编程梯度信息PGI解决这一问题。 具体来说&#xff0c; PGI包含三个部分&#xff0c;&#xff0…

【你也能从零基础学会网站开发】Web建站之jQuery进阶篇 jQuery常见属性和方法概述与使用

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 jQuery创建新的…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2010-3863)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.1.0以前的版本中&#xff0c;shiro 进行权限验证前未对url 做标准化处理&#xff0c;攻击者可以构造/、//、…

交流互动系统|基于springboot框架+ Mysql+Java+Tomcat的交流互动系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

redis学习-String类型的命令介绍以及特殊情况分析

目录 1. set key value 2. get key 3. append key string 4. strlen key 5. incr key 和 decr key 6. incrby key num 和 decrby key num 7. getrange key start end 8. setrange key start string 9. setex key time value 10. setnx key value 11. mset key1 val…

【Web开发】CSS教学(超详细,满满的干货)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Web开发】CSS教学(超详细,满满的干货) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 CSS一. 什么是CSS?1.1 基本语法规范1.2 引入方式1.3 规范 二. CSS选…

【第三章-1】面向对象——类与对象基本概念

目录 1.引例 2.类class 3. 面向对象中什么是对象&#xff1f; 4.类和对象的关系 5.面向对象编程 6.IDEA创建类与对象 7.成员变量 8.IDEA上代码练习成员变量 9.什么是方法 10.包Package&#xff08;详细参考&#xff09; 11.访问修饰符 12.面向对象与面向过程 1.引例…

Docker入门二(应用部署、迁移与备份、DockerFile、docker私有仓库、Docker-Compose)

文章目录 一、应用部署1.MySQL部署2.Redis部署3.Nginx部署 二、迁移与备份1.容器做成镜像2.镜像备份和恢复(打包成压缩包&#xff09; 三、DockerFile0.镜像从哪里来&#xff1f;1.什么是DockerFile2.DockerFile 构建特征3.DockerFile命令描述4.构建一个带vim的centos镜像案例5…

PC-DARTS: PARTIAL CHANNEL CONNECTIONS FOR MEMORY-EFFICIENT ARCHITECTURE SEARCH

PC-DARTS&#xff1a;用于内存高效架构搜索的部分通道连接 论文链接&#xff1a;https://arxiv.org/abs/1907.05737 项目链接&#xff1a;https://github.com/yuhuixu1993/PC-DARTS ABSTRACT 可微分体系结构搜索(DARTS)在寻找有效的网络体系结构方面提供了一种快速的解决方案…

[java基础揉碎]断点调试

一个实际需求: 1.在开发中&#xff0c;新手程序员在查找错误时&#xff0c;这时老程序员就会温馨提示&#xff0c;可以用断点调试&#xff0c; 一步一步的看源码执行的过程&#xff0c;从而发现错误所在。 2.重要提示:在断点调试过程中&#xff0c;是运行状态&#xff0c;是以…

TCP-IP 知识汇总

开放式系统互联模型------国际化标准组织ISO提出----协议组&#xff08;协议模型&#xff09; 应用层&#xff1a;接收用户数据&#xff0c;人机交互的接口 表示层&#xff1a;将编码转换为二进制&#xff08;加密、解密&#xff09;---统一格式 会话层&#xff1a;针对传输…

一维差分(模板)

差分是前缀和的逆运算&#xff0c;对于一个数组a&#xff0c;其差分数组b的每一项都是a [ i ]和前一项a [ i − 1 ]的差。 注意&#xff1a;差分数组和原数组必须分开存放&#xff01;&#xff01;&#xff01;&#xff01; #include <iostream> using namespace std;t…

PCL安装(C++)并配置vs

准备工作&#xff1a; 1.PCL下载包(此教程使用PCL1.11.0) 3.visual studio(此教程使用vs2019) PCL下载&#xff1a; 1、找到自己适合的PCL版本,我选择的是PCL1.11.0。 1.1 Github下载&#xff1a;Releases PointCloudLibrary/pcl GitHub 1.2 百度网盘&#xff1a;https://pan…

FDTD液晶折射率各项异性表示方法

由于FDTD的数据都是沿坐标轴的&#xff0c;各向异性材料的参数也需要根据坐标轴来输入。 首先要了解坐标变换。 坐标变换 这里以二维坐标变化为例。 矢量下我们可以发现OP可在两个坐标系下分别表示 接下来将两个坐标相互关联&#xff0c;这里以Xb举例&#xff0c;Yb同理 注…

Transformer中注意力层和位置感知前馈层的分工与合作

1. 注意力层和位置感知前馈层的分工与合作 在Transformer模型中&#xff0c;注意力层&#xff08;自注意力机制&#xff09;和位置感知前馈层&#xff08;Position-wise Feed-Forward Networks, FFNs&#xff09;分别承担着不同的任务&#xff1a; 注意力层&#xff08;自注意…

SQLiteC/C++接口详细介绍之sqlite3类(六)

快速前往文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…

用Windows server2022实现批量装机(原理server系列通用)

本篇文章将手把手教会大家从Windows server的安装到批量安装环境的部署&#xff08;我将使用vmware进行操作&#xff0c;物理机过程相同&#xff09; Windows server2022系统镜像可以从msdn和hellowindows下载 MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) &#xff08…