【C/C++算法】从浅到深学习--- 二分查找(图文兼备 + 源码详解)

绪论:冲击蓝桥杯一起加油!!
在这里插入图片描述
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论​:
本章是算法篇章的第三章二分算法,本章主要是通过题目的形式来进行学习,通过八道题让你基本了解二分法算法以及它的许多细节,在简介部分将会一定性的总结二分算法编写时的细节,通过这些了解这些细节,然后再通过前两道题了解二分算法的常见三种模板,再通过6道题巩固相信你对二分算法就会有很大的提升,后面将持续更新前缀和算法,敬请期待~
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。


二分查找算法简介

对于二分查找是什么,它的由来啥的就不过诉了,这是一个算法快速学习文章,我们通过几道题其实就能很好的理解什么事二分算法了!

特点:

  1. 最恶心、细节最多
  2. 最容易写出死循环算法
  3. 掌握后 ----》 最简单

学习的侧重点:

  1. 算法原理:数组有序的情况(不准确),应该是:发现数组有二段性规律就能使用二分
  2. 模板(不要死记硬背,理解后记忆)
    1. 朴素二分(简单但局限)
    2. 查找左边界的二分模板
    3. 查找有边界的二分模板(后面两个,较为万能,但细节很多)

注意:

  1. 从有一定单调性中的数据中,直接通过答案分析二段性(中间值,左端点,右端点)

  2. 二段性并不代表:

    1. 它不一定只是左边小右边大的
    2. 它本质是通过分析题目画出图形,查看是否能通过两个公式得出所有情况

总结(如何分析是否使用二分算法):

  1. 分析题目,画出图形
  2. 直接根据答案分析图形,看看是否能写出二段性公式
  3. 最终确定二段性,然后根据二段性情况分析使用模板一、二、三

具体训练:

1. 二分查找(非常重要的模板二分题)

题目:

在这里插入图片描述

分析题目并提出,解决方法:

  1. 暴力解法:很简单就是直接遍历一遍数组即可

但还有更加优秀的算法分析题目:
在这里插入图片描述

  • 对于暴力解法来说,他每次比较仅仅只能排除一个数
  • 但题目是有序的,却没用到,这里可以利用起来
  1. 现在随便获取一个数4 拿 target 与它进行比较
  2. 发现能一次排除多个数(如下图)
    在这里插入图片描述
  3. 取出 4 < t(target) ,那么 4 左边区间的都可以直接排除了,因为他是升序的,4 都小于target了,那么其左边的值只会更小!

这个方法,画成如下图方框内:发现其实本质通过一个数将数组划分成 “二段性”

通过一次比较将数组一下子划分成两部分:
在这里插入图片描述
二段性的本质并不只是找最中间的值,而是将数组划分成两部分的任意一点(如下图)
在这里插入图片描述
但还是得选择使用第一种最中间的点(因为这种在数学上效率是最高的)

模板一

在这里插入图片描述

二分模板主要以下步骤:

  1. 使用left、right双指针确定区间
  2. 每次从区间中获取mid最中间的值(mid = left + (right - left) / 2),然后和target值进行比较
    在这里插入图片描述
  3. 只会用下面的三种情况
    1. mid < target
    2. mid > target
    3. mid == target
    4. 当为上面三种情况时,他们的区间如何变化
    5. 很好理解 当 x < t 时:代表 mid及左边的区间都无效,那么left指针移动:left = mid + 1
    6. x > t:则类似意思:right = mid - 1(x 及 x右边区间 都无效)
    7. x == t。那就代表找到了正确区间!
      在这里插入图片描述

细节问题:

  1. 循环结束的条件
    1. left > right 才结束循环(循环条件就是 left <= left
    2. 因为left == right的值可能也需要进行判断,而判断后就会 left > right
    3. 所以不能是 left < right
  2. 求中间的值的mid 可以使用 (right - left)/ 2 + 1
  3. 时间复杂度
    在这里插入图片描述

题解核心逻辑:

该题就是最基础的二分题,直接使用上述模板即可做出:

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0 ,right = nums.size() - 1;int mid,res = -1;while(left <= right){mid = ((right  - left) / 2) + left;//防止溢出if(nums[mid] < target){left = left + 1;}else if(nums[mid] > target){right = right - 1;}else{return mid;}}return -1;}
};

在这里插入图片描述

2. 在排序数组中查找元素的第一个和最后一个位置(非常重要的模板二分题)

题目:

在这里插入图片描述

分析题目并提出,解决方法:

非递减:代表要么递增,要么不变
在这里插入图片描述
暴力解法:遍历得到begin,end位置

题解核心逻辑:

分析本题要找的是一个值的区间:找左端点、右端点

拿左端点为例先直观的看出答案,然后进行分析,分析出其其实也是有二段性的
在这里插入图片描述
那么先使用二分模板一解决:
在这里插入图片描述
发现无法解决:虽然也能通过找到target的位置但还需要遍历左右两边,但这种的最大时间复杂度又变成了O(N)了

模板二:查找左端点的情况

光先看左端点来说:分析出它的二段性(如下图)
在这里插入图片描述

  1. x < t:left = mid + 1( mid + 1 因为结果一定不会在mid及其左边)
  2. x >= t:right = mid( mid 因为结果可能就是当前的值,我们不能跳过)

但其中有很多细节问题:

  1. 循环条件:使用left < right(而不是 left <= right)
    1. 当有结果的时候,若left = right还要进入的话,此时 x >= t 的那么将会执行 right = mid 的操作,这样的话就会导致right值又再一次重复的设置为了 mid,那么就将会死循环,所以说当有结果的时候是不用判断 left == right这个地方的!
      在这里插入图片描述
    2. 当数组中的值全部大于 t,那么right最终将移动到最左端和left相遇,那么其也是一样的不用进去 不然就死循环了
      在这里插入图片描述
    3. 同理 left会不断的移动到最左边,他有两种情况,一种是和right相遇(那么就和上面一样不需要进去),还有就是超过right那么就肯定出循环了 就不用考虑
      在这里插入图片描述
    4. 综合上面3种情况,已经包括了所有的可能,总结出当left = right 的时候是不要进入循环的,那么也就推道出使用 left < right
  2. 求中点mid:使用left + (right - left)/ 2(尽量不要死记)
    1. 对于找右端点来说 left每次移动 mid + 1,right 每次移动 mid
    2. 在我们求中点的操作来说是使用下述两个,但假如使用了第二种:left + (right - left + 1)就会死循环
    3. 为什么呢:因为这两个找中间值的操作本质他们的区别是在偶数时,让mid指向左边还是右边(例如 1 2 3 4 第一种方式就会找到的中点为 2,第二种方式找到的中点就会为3,具体自己算哈~)
    4. 那么回来为什么找到右边就不能用呢,是因为假如在极端情况下只剩两个数字了,left指向第一个数字,right指向第二个数组(具体如下图情况)
    5. 而此时要找的是左端点,就需要left < right 出循环,但因为right的移动是等于mid的
    6. 而此时mid求出来的却是右边和right指向的相同,还是 nums[mid] >= t,right = mid
    7. 那么就会导致right还是没有移动,再次进入循环,算mid还是一样的,right的移动还是前面的,这样就会导致死循环
    8. 这样说可能还是有点抽象,为了方便记忆:可以把 求中点方程式里面的 +1 想象成mid的位置(+1就是在右边,不+1就是在左边,通过下图右边记住mid的位置),本题是 right 移动 mid步(找左端点…),那么mid在右边的话就会和right重叠,所以不能+1;
      在这里插入图片描述

模板三:查找右端点:

和上面就几乎一致了,只不过二段性不一样,并且找中点不一样
在这里插入图片描述
对于找中点来说:因为此处的是left = mid,那么若是用 left + (right - left) / 2的话,就剩两个值时求mid就会移动到左边,和left重叠导致,死循环(和上面左边分析一致就不过诉了,若不懂可以评论细讲哈~)

最终做题,找到左右端点:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int left = 0 , right = nums.size()-1;int mid;vector<int> res;if(nums.size() == 0) return {-1,-1};//找左端点//不要进入,不让 right可能会无限的等于midwhile(left < right){mid = left + (right - left) / 2;//内部不要+1 因为在只有两个值的时会导致 right不断的等于mid 而用于到达不了最左端if(nums[mid] < target){left = mid + 1;}else{right = mid;}}//出循环判断有结果的情况://两种移动情况出循环:// left = mid + 1: left >= right 其中left 不可能大于 right(只能left == right 循环)// 因为要打的前提是 left == right(因为只有 right(left) + 1 > right)// // right = mid 而就肯定是left == right了也不可能越界//所以综上所述 left == rightif(nums[left] == target){res.push_back(left);}else{//若不等则表示没找到return {-1,-1};}//重置left rightleft = 0;right = nums.size()-1;//查找右端点://left < right,相等可能会导致死循环 left 不断的等于 midwhile(left < right){mid = left + (right - left + 1) / 2;// +1 让mid移动到右边,防止和left重叠!!!if(nums[mid] <= target){left = mid;//等于mid是因为防止错过正确的target}else{//nums[mid] > targetright = mid - 1;//right 往右移动 -1}}//出来肯定是left == right,所以随便用,前面使用left这里使用rightif(nums[right] == target){res.push_back(right);}else{//若不等则表示没找到return {-1,-1};}return res;}
};

在这里插入图片描述
在这里插入图片描述

3. x 的平方根

题目:

在这里插入图片描述

分析题目并提出,解决方法:

分析暴力解法:从1并计算出平方,会有两种情况:

  1. 平方 小于 目标值,继续找
  2. 平方 等于 目标值,那么就找到了
  3. 平方 大于 目标值,那么表示超过了,那么就取该值前面的那个数
    在这里插入图片描述

优化,分析上图:

  1. 首先他是有序的
  2. 并且发现是有二段性的:
    在这里插入图片描述
    而此处分析题目可知:
    答案可能是:在小于区间的和刚好找到的,所以也就是找左端点的移动情况(具体如下图)
    在这里插入图片描述

题解核心逻辑:

class Solution {
public:int mySqrt(int x) {if(x < 0) return 0;//找左端点long long left = 0,right = x;int i  = 0;//使用mid中点的平方来进行快速的查找while(left < right) {long long mid = left + (right - left + 1) / 2;//因为是left 所以mid要 +1,防止重叠if((long long)mid * mid <= x){left = mid;}else{right = mid - 1;}}return left;}
};

在这里插入图片描述

4. 搜索插入位置

题目:

在这里插入图片描述

分析题目并提出,解决方法:

本题是一个非常明显的二分:有序 + 查找值(只不过是查找目标位置)
分析本题:需要找到是插入的位置,分析示例:
在这里插入图片描述
直接看出插入的位置,分析他插入的位置:是大于等于的区间,所以也就是找右端点
在这里插入图片描述

题解核心逻辑:

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0,right = nums.size() -1;while(left < right){int mid = left + (right - left) / 2;//这里是找right,所以不+1if(nums[mid] < target){left = mid + 1;}else right = mid;}if(nums[left] < target)return left + 1;//处理示例三,但需要放到最后时return left;}
};

在这里插入图片描述

5. 山脉数组的峰顶索引

题目:

在这里插入图片描述

分析题目并提出,解决方法:

分析题目:不难想出暴力解法,遍历数组找到第一个 arr[i] > arr[i+1]的值即可
在这里插入图片描述
但分析下其中本质也是有二段性的:在峰顶左边:arr[i] >= arr[i-1],峰顶右边:arr[i] < arr[i-1](具体如下图)
在这里插入图片描述

题解核心逻辑:

通过上面的分析出了二段性:
其中再次强调二段性本质是通过某个式子将数组分组两块,而这个式子就是left、right的移动方法,其中包含答案的区域移动就是mid步!
而本题答案是在左端点的所以left = mid(这题右端点也能使用,不过左端点更符合思考逻辑)

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 0,right = arr.size()-1;if(arr.size() == 1) return 0;while(left < right){int mid = left + (right - left + 1) / 2;if(arr[mid] >= arr[mid-1]){left = mid;}else{//arr[mid] < mid - 1right = mid - 1;}}return left;}
};//右端点解法:
class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 0,right = arr.size()-1;while(left < right){int mid = left + (right - left) / 2;if(arr[mid] >= arr[mid+1]){right = mid;}else{//arr[mid] < mid - 1left = mid + 1;}   }return left;}
};

在这里插入图片描述

6. 寻找峰值

题目:

在这里插入图片描述

分析题目并提出,解决方法:

分析题目:不难想出其暴力解法的三种情况:
在这里插入图片描述
分析题目:
其实也对于某个点 i 来说,它的左右相邻的数无非两种情况:

  1. arr[i] > arr[i + 1]:此时峰值在 i 的左区间一定会出现,所以再次查找左区间就够了,如果要找左区间对于 right= mid(i) 即可(mid已经指向了左区间)
  2. arr[i] < arr[i+1]:此时峰值在 i 的右区间一定会出现,所以查找右区间就够了,查找右区间:因为 i 位置肯定不是所以 left = mid + 1
  3. 最终当left 和 right 相遇则找到了结果
    在这里插入图片描述
    将上图二段性再分析下得二分中指针移动情况:
    在这里插入图片描述
    本题也能很好的说明:二分查找并不一定只是在有序的地方使用的,本题就是一个无序的数列
    本题和上一题本质非常像,只不过分析不一样,但我们一定要注意分析的过程,通过简单的例子直接看出答案进行分析,得出二段性(能区间划分成两块的式子)

题解核心逻辑:

class Solution {
public:int findPeakElement(vector<int>& nums) {int left = 0,right = nums.size()-1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] >= nums[mid + 1]){right = mid;}else{left = mid + 1;}}return left;}
};

在这里插入图片描述

7. 寻找旋转排序数组中的最小值

题目:

在这里插入图片描述

分析题目并提出,解决方法:

其中暴力解法很简单:简单遍历计数器记录得出结果(但本题要去logn的时间复杂度那么很明显可能就是二分)
在这里插入图片描述
分析题目画出如下折线图(明显的二段性):
在这里插入图片描述
既然是二段性不妨好好的看一下图形,分析出其中的如何通过式子得出二段性
分析可知其中可以使用D点,进行和mid的值进行比较,就会只有两种可能(具体如下图)

  1. 当mid指向A ~ B区间的时候, mid的值一定大于D点的值
  2. 当mid指向C~D区间的时候,mid值是小于等于D点的值的

题解核心逻辑:

最终通过二段性也得出二分的公式:
在这里插入图片描述

class Solution {
public:int findMin(vector<int>& nums) {int left = 0,right = nums.size() - 1;int d = nums[right];while(left < right){int mid  = left + (right - left) / 2;//不用 + 1 right = midif(nums[mid] > d){left = mid + 1;}else{right = mid;}}return nums[right];}
};

在这里插入图片描述
此处不直接拿A点是因为假如它没有选择那么就是一个递增的,就会出现一定的问题!
在这里插入图片描述
但也能做出来只需要将这种情况给排除即可:

class Solution {
public:int findMin(vector<int>& nums) {int left = 0,right = nums.size() - 1;int a = nums[0];if(a < nums[right]){//判断第一个点和最后一个点,若小则代表没有旋转过return a;}while(left < right){int mid  = left + (right - left) / 2;//不用 + 1 right = midif(nums[mid] >= a){//在A~B区间left = mid + 1;}else{right = mid;}}return nums[right];}
};

8. 点名特别奇怪的二段性!

题目:

在这里插入图片描述

分析题目并提出,解决方法:

分析题目不难想出下面4种解法:
在这里插入图片描述

题解核心逻辑:

而本题仍然可以二段性:
这个二段性比较奇怪,我们借助数组小标来查看它的二段性,发现:

  1. 前半段下标和数字一致
  2. 后半段下标比数字小1(具体如下图)
    在这里插入图片描述
    那么就推出二分公式:
    在这里插入图片描述

其中注意一个边界情况:
在这里插入图片描述
当缺失的是最后的值,那么需要出循环后,因为他是不断的向右移动的,最终会到达最后然后出循环,此时判断最后一个值它的下标是否符合,若相等则表示缺少是最后的值(也就是上图的4),反之若不相等则表示正常出循环

class Solution {
public:int takeAttendance(vector<int>& records) {int left = 0,right = records.size()-1;while(left < right){int mid = left + (right - left) / 2;if(records[mid] == mid){left = mid + 1;//在左区间}else right = mid;}//如果right 到达最后 再次判断是否和下标相等,若相等则表示是 最后值的 下一个 缺少了if(records[right] == right) return right + 1;return right;}
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql之联合索引

文章目录 一&#xff1a;联合索引二&#xff1a;创建联合索引三&#xff1a;删除索引四&#xff1a;总结&#xff1a; 一&#xff1a;联合索引 联合索引又称组合索引或者复合索引&#xff0c;是建立在俩列或者多列以上的索引。 二&#xff1a;创建联合索引 语法&#xff1a…

51单片机09 DS1302时钟

测试一 测试代码&#xff1a;别忘了之前调整点阵的跳线 #include <STC89C5xRC.H> #include "LCD1602.h"void main() {LCD_Init();LCD_ShowString(1,1,"RTC");while(1){} } ------------------------------------ 测试二 DS1302.C #include &l…

【前端OCR】如何用paddlejs开发一个属于前端本地的OCR文本识别功能

之前出过一篇关于用tesseract纯前端实现文本识别功能的文档&#xff0c;经测试之后&#xff0c;用是能用&#xff0c;但识别准确率并不高&#xff0c;而且耗时也相对比较久。 于是又找了一个paddlejs做开发测试&#xff0c;但是整体上来说&#xff0c;其实两个差不多。而且初始…

Spring IoC的实现机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Spring IoC的实现机制是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; Spring IoC的实现机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring IoC&#xff08;Inversion of Control…

Web3 开发者周刊 36 | 构建自主未来:Agent、可扩展性与赏金

欢迎来到 Web3 开发者周刊 36&#xff0c;这里汇聚了赋能您的 Web3 构建之旅的各种资源。本周我们将剖析基于Agent的系统&#xff0c;讨论来自 Vitalik 关于以太坊 L1 和 L2 的最新思考&#xff0c;并提供最新高价值Bounty消息。 开始Build吧&#xff01; ✅ One Trillion Age…

网络安全-防御 第一次作业(由于防火墙只成功启动了一次未补截图)

防火墙安全策略课堂实验报告 一、拓扑 本实验拓扑包含预启动设备、DMZ区域&#xff08;含OA Server和Web Server&#xff09;、防火墙&#xff08;FW1&#xff09;、Trust区域&#xff08;含办公区PC和生产区PC&#xff09;等。具体IP地址及连接关系如给定拓扑图所示&#xf…

Vue.js 与低代码开发:如何实现快速应用构建

在当今数字化时代&#xff0c;企业对应用开发的效率要求越来越高。传统开发模式往往耗时费力&#xff0c;难以满足快速变化的市场需求。而 Vue.js 与低代码开发的结合&#xff0c;为快速构建应用提供了新的解决方案&#xff0c;让企业能够更敏捷地响应市场变化&#xff0c;抢占…

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…

朝天椒USB服务器解决前置机U盾虚拟机远程连接

本文探讨朝天椒USB服务器用Usb Over Network技术&#xff0c;解决前置机虚拟化部署后U盾的远程连接问题。 在金融、电信等关键行业&#xff0c;后台核心处理系统承担着至关重要的业务数据交互职责。为保障系统安全&#xff0c;这些单位要求企业通过前置机与他们的内网进行数据…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)

拉票 亲爱的小伙伴们或者童鞋们&#xff0c;喜欢宏哥文章的&#xff0c;请动动你们发财小手&#xff0c;给我投投票票 。 祝2025小伙伴们工作顺利&#xff0c;家庭和睦&#xff0c;心想事成&#xff0c;财源滚滚&#xff01; 我的票还有7票&#xff0c;互票的朋友私信给我。 投…

教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南

文章目录 1. 什么是 DeepSeek R1&#xff1f;a. 主要介绍a. 版本区别 2. 部署资源要求a. 硬件资源要求 3. 本地安装DeepSeek-R1a. 为什么选择本地部署&#xff1f;b. 部署工具对比c. 演示环境配置d. Ollama安装流程 4. 可视化工具a. 工具对比b. Open-WebUI部署 5. AI API应用a.…

学习总结2.14

深搜将题目分配&#xff0c;如果是两个题目&#xff0c;就可以出现左左&#xff0c;左右&#xff0c;右左&#xff0c;右右四种时间分配&#xff0c;再在其中找最小值&#xff0c;即是两脑共同处理的最小值 #include <stdio.h> int s[4]; int sum0; int brain[25][25]; …

Qt Creator 5.0.2 (Community)用久了突然变得很卡

目录 1.现象 2.解决方案 1.现象 很久没有用Qt Creator开发项目了&#xff0c;刚刚结束的项目又是用VS2019开发的&#xff1b;这两天刚好有时间去学习一下Qt&#xff0c;刚好要用Qt Creator&#xff0c;结果一打开就没反应&#xff0c;主界面显示出来要好几分钟&#xff0c;最…

DeepSeek的深度解析:由来、研发过程、公司背景、优势、劣势与总结

DeepSeek的由来 DeepSeek&#xff0c;中文名“深度求索”&#xff0c;是一个在人工智能领域崭露头角的创新项目。其英文名“DeepSeek”由“深思”&#xff08;Deep&#xff09;与“探索”&#xff08;Seek&#xff09;组合而成&#xff0c;寓意着凭借深度学习技术不断探索未知…

初阶c语言(练习题,猜随机数)

前言&#xff1a; 学习c语言&#xff0c;学习来源b站鹏哥&#xff0c;37天吧应该是 内容&#xff1a; 这集内容挺多&#xff0c;源代码放到文章最后 题目是&#xff0c;使用函数编写一个随机数&#xff0c;然后自己猜&#xff0c;猜随机数 这里囊括了很多的知识点&#xf…

w206基于Spring Boot的农商对接系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下载Continue插件 安装 下载中 下载完成后,点击OK 配…

鸿蒙开发:了解@Builder装饰器

前言 本文代码案例基于Api13&#xff0c;温馨提示&#xff1a;内容相对来说比较简单&#xff0c;如果您已掌握&#xff0c;略过即可。 如果说一个页面中组件有很多&#xff0c;我们都统一写到build函数中&#xff0c;显而易见&#xff0c;会导致build函数代码非常冗余&#xff…

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…

Linux进程管理

一、进程查看 1、进程 进程 process 计算机执行任务的最小单位 2、进程查看 ps auxa&#xff1a;all u&#xff1a;user x&#xff1a;所有终端 所有用户所有终端的所有进程 COMMAND&#xff1a; 进程名称 USER&#xff1a; 启动进程的用户&…