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

【算法】二分

二分

  • 1.二分查找
    • 1.在排序数组中查找元素的第一个和最后一个位置
    • 2.牛可乐和魔法封印
    • 3.A-B 数对
    • 4.烦恼的高考志愿
  • 2.二分答案
    • 1.木材加工
    • 2.砍树
    • 3.跳石头

1.二分查找

当我们的解具有二段性(根据最终答案所在的位置判断是否具有二段性)时,就可以使用二分算法找出答案:

  1. 根据待查找区间的中点位置,分析答案会出现在哪一侧。
  2. 接下来舍弃一半的待查找区间,转而在有答案的区间内继续使用二分算法查找结果。

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

1.在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述

解法:二分

class Solution 
{
public:vector<int> searchRange(vector<int>& nums, int target) {int n = nums.size();//处理边界情况if(n == 0) return {-1, -1};//1.求起始位置int left = 0, right = n - 1;while(left < right){int mid = (right + left) / 2;if(nums[mid] >= target) right = mid;else left = mid + 1;}//left和right所指的位置可能不是最终结果if(nums[left] != target) return {-1, -1};int begin = left; //记录起始位置//2.求终止位置left = 0, right = n - 1;while(left < right){int mid = (left + right + 1) / 2;if(nums[mid] <= target) left = mid;else right = mid - 1;}int end = right; //记录终止位置return {begin, end};}
};

2.牛可乐和魔法封印

牛可乐和魔法封印

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

解法:二分

二分查找算法模版题,直接上手模版即可。但是需要注意,有可能并没有这个区间,需要在二分结束之后判断一下。

#include<iostream>
using namespace std;const int N = 1e5 + 10;int n;
int a[N];int BinarySearch(int x, int y)
{int left = 1, right = n;//查找大于等于x所在的位置while(left < right){int mid = (left + right) / 2;if(a[mid] >= x) right = mid;else left = mid + 1;}if(a[left] < x) return 0;int begin = left;//查找小于等于y所在的位置left = 1, right = n;while(left < right){int mid = (left + right + 1) / 2;if(a[mid] <= y) left = mid;else right = mid - 1;}if(a[left] > y) return 0;int end = right;return end - begin + 1;
}int main()
{cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];int q; cin >> q;while(q--){int x, y; cin >> x >> y;cout << BinarySearch(x, y) << endl;}return 0;
}

3.A-B 数对

P1102 A-B 数对

在这里插入图片描述

解法:排序 + 二分

由于顺序不影响最终结果,所以可以先把整个数组排序。由 A - B = C 得:B = A - C,由于 C 是已知的数,我们可以从前往后枚举所有的 A,然后去前面找有多少个符合要求的 B,正好可以用二分快速查找出区间的长度。

#include<iostream>
#include<algorithm>
using namespace std;typedef long long LL;const int N = 2e5 + 10;LL n, C;
LL a[N];int BinarySearch(int target)
{//查找target左端点int left = 1, right = n;while(left < right){int mid = (left + right) / 2;if(a[mid] >= target) right = mid;else left = mid + 1;}if(a[left] != target) return 0;  //找不到返回0int begin = left;//查找target右端点left = 0, right = n;while(left < right){int mid = (left + right + 1) / 2;if(a[mid] <= target) left = mid;else right = mid - 1;}int end = right;return end - begin + 1;
}int main()
{cin >> n >> C;for(int i = 1; i <= n; i++) cin >> a[i];sort(a + 1, a + 1 + n);//枚举所有的ALL ret = 0;for(int i = 1; i <= n; i++) {LL B = a[i] - C;ret += BinarySearch(B);}cout << ret;return 0;
}

【STL的使用】

  1. lower_bound:传入要查询区间的左右迭代器(注意是左闭右开的区间,如果是数组就是左右指针)以及要查询的值 k,然后返回该数组中 ≥ k 的第一个位置。
  2. upper_bound:传入要查询区间的左右迭代器(注意是左闭右开的区间,如果是数组就是左右指针)以及要查询的值 k,然后返回该数组中 > k 的第一个位置。

比如:a = [10, 20, 20, 20, 30, 40] ,设下标从 1 开始计数,在整个数组中查询 20:

  1. lower_bound(a + 1, a + 1 + 6, 20) ,返回 a + 2 位置的指针。
  2. upper_bound(a + 1, a + 1 + 6, 20) ,返回 a + 5 位置的指针。
  3. 然后两个指针相减,就是包含 20 这个数区间的长度。

在这里插入图片描述
【注意】:STL用起来很爽,但是 STL 的使用范围很「局限」,查询「有序序列」的时候才有用,数组无序的时候就无法使用。但是二分模板也能在「数组无序」的时候使用,只要有「二段性」即可。

#include<iostream>
#include<algorithm>
using namespace std;typedef long long LL;const int N = 2e5 + 10;LL n, C;
LL a[N];int main()
{cin >> n >> C;for(int i = 1; i <= n; i++) cin >> a[i];sort(a + 1, a + 1 + n);//枚举所有的ALL ret = 0;for(int i = 1; i <= n; i++) {LL B = a[i] - C;ret += upper_bound(a + 1, a + 1 + n, B) - lower_bound(a + 1, a + 1 + n, B);}cout << ret;return 0;
}

4.烦恼的高考志愿

P1678 烦恼的高考志愿

在这里插入图片描述

解法:排序 + 二分

先把学校的录取分数「排序」,然后针对每一个学生的成绩 b,在「录取分数」中二分出 ≥ b 的「第一个」位置 pos,那么差值最小的结果要么在 pos 位置,要么在 pos - 1 位置。取 abs(a[pos] − b) 与abs(a[pos − 1] − b) 两者的「最小值」即可。

细节问题:

  1. 如果所有元素都大于 b 的时候,pos − 1 会在 0 下标的位置,有可能结果出错。
  2. 如果所有元素都小于 b 的时候,pos 会在 n 的位置,此时结果倒不会出错,但是我们要想到这个细节问题,这道题不出错不代表下一道题不出错。

加上两个左右护法,结果就不会出错了。

#include<iostream>
#include<algorithm>
using namespace std;typedef long long LL;const int N = 1e5 + 10;int m, n;
LL a[N];//查找大于等于b的最小值,返回该值所在数组的下标
int find(int b)
{int left = 1, right = m;while(left < right){int mid = (left + right) / 2;if(a[mid] >= b) right = mid;else left = mid + 1;}return left;
}int main()
{cin >> m >> n;for(int i = 1; i <= m; i++) cin >> a[i];sort(a + 1, a + 1 + m);//加上左护法a[0] = -1e7 - 10;LL ret = 0;while(n--){LL b; cin >> b;int pos = find(b);ret += min(abs(a[pos] - b), abs(a[pos - 1] - b));}cout << ret << endl;return 0;
}

2.二分答案

准确来说,应该叫做「二分答案 + 判断」。

  1. 二分答案可以处理大部分「最大值最小」以及「最小值最大」的问题。如果「解空间」在从小到大的「变化」过程中,「判断」答案的结果出现「二段性」,此时我们就可以「二分」这个「解空间」,通过「判断」,找出最优解。
  2. 刚接触的时候,可能觉得这个「算法原理」很抽象。没关系,3 道题的练习过后,你会发现这个「二分答案」的原理其实很容易理解,重点是如何去「判断」答案的可行性。

1.木材加工

P2440 木材加工

在这里插入图片描述

解法:二分

学习「二分答案」这个算法,基本上都会把这道比较简单的题当成例题。
设要切成的长度为 x,能切成的段数为 c 。根据题意,我们可以发现如下性质:

  1. 当 x 增大的时候,c 在减小。也就是最终要切成的长度越大,能切的段数越少。
  2. 当 x 减小的时候,c 在增大。也就是最终要切成的长度越小,能切的段数越多。

那么在整个「解空间」里面,设最终的结果是 ret,于是有:

  1. 当 x ≤ ret,c ≥ k 时:也就是「要切的长度」小于等于「最优长度」的时候,最终切出来的段数「大于等于」k。
  2. 当 x > ret,c < k时:也就是「要切的长度」大于「最优长度」的时候,最终切出来的段数「小于」k。

在解空间中,根据 ret 的位置,可以将解集分成两部分,具有「二段性」,那么我们就可以「二分答
案」。当我们每次二分一个切成的长度 x 的时候,如何算出能切的段数 c ?很简单,遍历整个数组,针对每一根木头,能切成的段数就是 a[i] / x。

#include<iostream>
using namespace std;typedef long long LL;const int N = 1e5 + 10;LL n, k;
LL a[N];//计算当切割长度为 x 的时候,最多能切出来多少段
LL calc(LL x)
{LL cnt = 0;for(int i = 1; i <= n; i++){cnt += a[i] / x;}return cnt;
}int main()
{cin >> n >> k;for(int i = 1; i <= n; i++) cin >> a[i];LL left = 0, right = 1e8;while(left < right){LL mid = (left + right + 1) / 2;if(calc(mid) >= k) left = mid;else right = mid - 1;}cout << left << endl;return 0;
}

2.砍树

P1873 [COCI 2011/2012 #5] EKO / 砍树

在这里插入图片描述

解法:二分

设伐木机的高度为 H,能得到的⽊材为 C。根据题意,我们可以发现如下性质:

  1. 当 H 增大的时候,C 在减小。
  2. 当 H 减小的时候,C 在增大。

那么在整个「解空间」里面,设最终的结果是 ret,于是有:

  1. 当 H ≤ ret ,C ≥ M 时。也就是「伐木机的高度」大于等于「最优高度」时,能得到的木材「小于等于」M。
  2. 当 H > ret ,C < M 时。也就是「伐木机的高度」小于「最优高度」时,能得到的木材「大于」M。

在解空间中,根据 ret 的位置,可以将解集分成两部分,具有「二段性」,那么我们就可以「二分答
案」。当我们每次二分一个伐木机的高度 H 的时候,如何算出得到的木材 C ?很简单,遍历整个数组,针对每一根木头,能切成的木材就 a[i] − H。

#include<iostream>
using namespace std;typedef long long LL;const int N = 1e6 + 10;LL n, m;
LL a[N];//当伐木机的高度为 x 时,所能获得的木材
LL calc(LL x)
{LL ret = 0;for(int i = 1; i <= n; i++){if(a[i] > x){ret += a[i] - x;}}return ret;
}int main()
{cin >> n >> m;for(int i = 1; i <= n; i++) cin >> a[i];LL left = 1, right = 4e5;while(left < right){LL mid = (left + right + 1) / 2;if(calc(mid) >= m) left = mid;else right = mid - 1;}cout << left << endl;return 0;
}

3.跳石头

P2678 [NOIP2015 提高组] 跳石头

在这里插入图片描述

解法:二分

设每次跳的最短距离是 x,移走的石头块数为 c。根据题意,我们可以发现如下性质:

  1. 当 x 增大的时候,c 也在增大。
  2. 当 x 减小的时候,c 也在减小。

那么在整个「解空间」里面,设最终的结果是 ret,于是有:

  1. 当 x ≤ ret,c ≤ M 时。也就是「每次跳的最短距离」小于等于「最优距离」时,移走的石头块数「小于等于」M。
  2. 当 x > ret,c > M 时。也就是「每次跳的最短距离」大于「最优距离」时,移走的石头块数「大于」M。

在解空间中,根据 ret 的位置,可以将解集分成两部分,具有「二段性」,那么我们就可以「二分答
案」。当我们每次二分一个最短距离 x 时,如何算出移走的石头块数 c?

  1. 定义前后两个指针 i, j 遍历整个数组,设 i ≤ j,每次 j 从 i 的位置开始向后移动。
  2. 当第一次发现 a[j] − a[i] ≥ x 时,说明 [i + 1, j − 1] 之间的石头都可以移走。
  3. 然后将 i 更新到 j 的位置,继续重复上面两步。
#include<iostream>
using namespace std;typedef long long LL;const int N = 5e4 + 10;LL l, n, m;
LL a[N];//当最短跳跃距离为 x 时,移走的岩石数目
LL calc(LL x)
{LL ret = 0;for(int i = 0; i <= n; ){int j = i + 1;while(j <= n && a[j] - a[i] < x) j++;ret += j - i - 1;i = j;}return ret;
}int main()
{cin >> l >> n >> m;for(int i = 1; i <= n; i++) cin >> a[i];a[n + 1] = l;n++;LL left = 1, right = l;while(left < right){LL mid = (left + right + 1) / 2;if(calc(mid) <= m) left = mid;else right = mid - 1;}cout << left << endl;return 0;
}

相关文章:

【算法】二分

二分 1.二分查找1.在排序数组中查找元素的第一个和最后一个位置2.牛可乐和魔法封印3.A-B 数对4.烦恼的高考志愿 2.二分答案1.木材加工2.砍树3.跳石头 1.二分查找 当我们的解具有二段性&#xff08;根据最终答案所在的位置判断是否具有二段性&#xff09;时&#xff0c;就可以使…...

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…...

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…...

Scade 表达式 - 使用索引的迭代器

Scade 表达式中的 map, fold, mapfold&#xff0c;会对输入数组参数中的元素逐个作处理&#xff0c;不需要数组元素的索引信息。若在处理数组元素时&#xff0c;需要数组元素相应的索引信息&#xff0c;则可使用迭代器算子 mapi, foldi, mapfoldi。 mapi 算子 mapi 算子的行为…...

K8s学习

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xf…...

面试--你的数据库中密码是如何存储的?

文章目录 三种分类使用 MD5 加密存储加盐存储Base64 编码:常见的对称加密算法常见的非对称加密算法https 传输加密 在开发中需要存储用户的密码&#xff0c;这个密码一定是加密存储的&#xff0c;如果是明文存储那么如果数据库被攻击了&#xff0c;密码就泄露了。 我们要对数据…...

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …...

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...

【云岚到家】-day03-门户缓存实现实战

【云岚到家】-day03-门户缓存实现实战 1.定时任务更新缓存 1.1 搭建XXL-JOB环境 1.1.1 分布式调度平台XXL-JOB介绍 对于开通区域列表的缓存数据需要由定时任务每天凌晨更新缓存&#xff0c;如何实现定时任务呢&#xff1f; 1.使用jdk提供的Timer定时器 示例代码如下&#xf…...

Ubuntu 24.04 LTS 开启 SMB 服务,并通过 windows 访问

Ubuntu 24.04 LTS 背景资料 Ubuntu服务器折腾集Ubuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locations Ubuntu开启samba和window共享文件 Ubuntu 配置 SMB 服务 安装 Samba 确保 Samba 已安装。如果未安装&#xff0c;运行以下命令进行安装&#xff…...

“AI人工智能内容辅助创作平台:让创意不再“卡壳”

在如今这个信息爆炸的时代&#xff0c;内容创作成了每个人的“必修课”。无论是自媒体大V、文案策划&#xff0c;还是普通学生写作文&#xff0c;大家都会遇到一个让人抓狂的问题——“创意枯竭”。有时候&#xff0c;脑袋里空空如也&#xff0c;一个字都写不出来&#xff0c;那…...

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…...

VUE之Router使用及工作模式

1、路由的使用 【两个注意点】 1)路由组件通常放在pages 或 views文件夹,一般组件通常放在components文件夹。 2)通过点击导航,视觉效果上"消失"了的路由组件,默认是被"卸载"掉的,需要的时候再去挂载。 // 创建一个路由器,并暴露出去// 第一步:…...

day25_HTML

今日内容 零、 复习昨日 一、HTML 零、 复习昨日 一、Web开发 前端 HTML ,页面展现CSS , 样式JS (JavaScript) , 动起来 二、HTML 2.1 HTML概念 ​ 网页&#xff0c;是网站中的一个页面&#xff0c;通常是网页是构成网站的基本元素&#xff0c;是承载各种网站应用的平台。通俗…...

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…...

【AI日记】25.01.20

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales 读书 书名&#xff1a;自由宪章阅读原因&#xff1a;作者哈耶克&#xff0c;诺贝尔经济学奖得主&#xff0c;之前读过他的 《通往奴役…...

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...

AI生成内容——JavaScript中的Promise、async和wait

一、Promise *1. 概念&#xff1a; Promise 是 JavaScript 中处理异步操作的一种对象&#xff0c;它表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。一个 Promise 对象处于以下三种状态之一&#xff1a; Pending&#xff08;进行中&#xff09;&#…...

Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)

Java基于SSM框架的社区团购系统小程序设计与实现 博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f4…...

Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】

Git 理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件 标签管理理解标签创建标签操作标签删除标签 理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#x…...

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网&#xff0c;登录&#xff08;如果没有gitee账号的就自行注册一下&#xff09;。 点击号-->新建仓库 填写好必填信息&#xff0c;然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…...

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作&#xff0c;包括CRUD&#xff08;增加、读取、更新、删除&#xff09;。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…...

Brooks MagnaTran LEAP User Manual 指导半导体机械手

Brooks MagnaTran LEAP User Manual 指导半导体机械手...

【Red Hat8】:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…...

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…...

深圳桂湾公园的花海

工作日的午休时间我经常骑行到桂湾公园&#xff0c;时不时都能碰上一些阿姨问&#xff1a;小伙子你知道桂湾公园的花海在哪里吗&#xff1f;我找了半天了哈。我发现不少找花海的人是从桂湾地铁或前湾地铁下车&#xff0c;然后在偌大的桂湾公园找寻。其实只要定位前海紫荆园就好…...

寒假刷题Day10

一、220. 存在重复元素 III 两种解法&#xff1a;并没有弄懂&#xff0c;待复盘 class Solution { public:bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {set<long> st;for (int i 0; i < nums.size(); i) {auto lb st.lower_…...

【Java-图片存储方案】

Java功能相关文章 一、Minio存储大体量图片 上传到Minio指定路径&#xff0c;前端预览时,需要生成临时访问凭证的URL import io.minio.MinioClient; import io.minio.errors.MinioException; import io.minio.http.Method; import io.minio.GetPresignedObjectUrlArgs; impo…...

机器人传动力系统介绍

以下是对机器人驱动系统的分析、最新科技应用以及世界顶级公司机器人型号使用的技术&#xff1a; 机器人驱动系统分析 液压驱动&#xff1a;利用液体压力来传递动力&#xff0c;通过液压泵将液压油从油箱抽出&#xff0c;送至液压缸&#xff0c;推动活塞运动&#xff0c;进而…...

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…...

《Vue3 十》Vue 底层原理

命令式编程和声明式编程&#xff1a; 以计时器为例&#xff1a; // 原生 JavaScript 实现计数器&#xff0c;是命令式编程 <div><h1>当前数字&#xff1a;<span class"count"></span></h1><button class"add" click&qu…...

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…...

【Leetcode 每日一题】2266. 统计打字方案数

问题背景 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母&#xff0c;Alice 需要 按 对应字母 i i i 次&#xff0c; i i i 是该字母在这个按键上所处的位置。 比方说&#xff0c;为了按出字母 ‘s’ &#xff0c;Alice 需要按 ‘7’ 四次…...

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈&#xff0c;帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作&#xff08;cmp & swap&#xff09; 线程控制&#xff1a;两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…...

Nginx调优

Nginx 是一个高性能的反向代理服务器和负载均衡器&#xff0c;在处理大量并发请求时表现出色。但是&#xff0c;随着系统负载的增加&#xff0c;Nginx 的性能可能受到多方面的影响&#xff0c;因此进行适当的调优至关重要。以下是 Nginx 调优的几个方向和关键点&#xff1a; 1…...

自定义UITableViewCell

很多时候&#xff0c;我们是不能直接使用系统自带的UITableViewCell&#xff0c;因为自带的比较简单只有一个UIImageView和两个UILabel&#xff0c;假设需要多个UIImageView或者两个以上UILabel&#xff0c;那就需要自定义了。本文就实现如何自定义UITableViewCell。 假设我们现…...

Java 基于微信小程序的原创音乐小程序设计与实现(附源码,部署,文档)

大家好&#xff0c;我是stormjun&#xff0c;今天为大家带来的是Java实战项目-基于微信小程序的原创音乐小程序设计与实现。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博…...

MySQL —— 事务

概念 事务把组SQL语句打包成为个整体&#xff0c;在这组SQL的执行过程中&#xff0c;要么全部成功&#xff0c;要么全部失败。 这组SQL语句可以是条也可以是多条。 ACID 特性 原子性 Atomicity(原子性)&#xff1a;一个事务中的所有操作&#xff0c;要么全部成功&#xff0…...

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…...

SpringBoot注入配置文件application.properties中的信息

问题&#xff1a;将可能会变动的配置信息硬编码在代码中&#xff0c;在修改时难以定位&#xff0c;且过于繁琐&#xff0c;怎么办&#xff1f; 解决&#xff1a;自定义application.properties配置文件中的信息&#xff0c;注意严格遵循ab的形式&#xff0c;不要加引号&#xf…...

大数据,Hadoop,HDFS的简单介绍

大数据 海量数据&#xff0c;具有高增长率、数据类型多样化、一定时间内无法使用常规软件工具进行捕捉、管理和处理的数据集 合 大数据的特征: 4V Volume : 巨大的数据量 Variety : 数据类型多样化 结构化的数据 : 即具有固定格式和有限长度的数据 半结构化的数据 : 是…...

第15章:Python TDD应对货币类开发变化(二)

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

黑马点评之导入初始项目(java)

&#xff01;&#xff01;&#xff01;由于我一开始是在网盘上下载的资源&#xff0c;后面忙活半天&#xff0c;发现代码是不完整的&#xff0c;才知道需要在github上面拉取初始代码。 然后第二点是我的本地环境是jdk21&#xff0c;但是他原本的代码为jdk8&#xff0c;所以在换…...

Erlang语言的语法糖

Erlang语言的语法糖&#xff1a;简化编程的灵活工具 Erlang是一种功能强大的编程语言&#xff0c;最初由爱立信&#xff08;Ericsson&#xff09;为电信系统开发。它以其高并发性、容错性和分布式特性而闻名&#xff0c;特别适合构建实时系统。然而&#xff0c;Erlang的语法相…...

数据库基础知识:记录、表、字段、数据类型、约束、主键、外键、规范化、索引、序列

数据库是由一个或多个有组织的数据集合组成&#xff0c;而数据库管理系统&#xff08;DBMS&#xff09;是操作数据库的软件&#xff0c;包括很多人本科上课学过的SQL Server&#xff0c;现在常用的MySQL、Postgresql等&#xff0c;用于提供数据的存储、访问、运行和维护等。学习…...

Centos 8 交换空间管理

新增swap 要增加 Linux 系统的交换空间&#xff0c;可以按照以下步骤操作&#xff1a; 1. 创建一个交换文件 首先&#xff0c;选择文件路径和大小&#xff08;例如&#xff0c;增加 1 GB 交换空间&#xff09;。 sudo fallocate -l 1G /swapfile如果 fallocate 不可用&…...

迈向 “全能管家” 之路:机器人距离终极蜕变还需几步?

【图片来源于网络&#xff0c;侵删】 这是2024年初Figure公司展示的人形机器人Figure 01&#xff0c;他可以通过观看人类的示范视频&#xff0c;在10小时内经过训练学会煮咖啡&#xff0c;并且这个过程是完全自主没有人为干涉的&#xff01; 【图片来源于网络&#xff0c;侵删】…...

Data Filtering Network 论文阅读和理解

目录 一、TL&#xff1b;DR 二、Introduction 2.1 apple的结论 2.2 业界做法&#xff1a; 2.3 我们的做法&#xff08;Apple&#xff09; 2.4 如何获取好的DFN 三、未完待续&#xff08;这周出去购物了&#xff0c;下周继续补充&#xff09; 一、TL&#xff1b;DR 核心…...

KMP算法

KMP算法详解 KMP&#xff08;Knuth-Morris-Pratt&#xff09;算法是一种用于在大串中寻找小串的字符串匹配算法。它通过在字符串匹配过程中避免不必要的重复比较&#xff0c;显著提高了效率。KMP算法的核心思想是利用字符串中已经匹配的部分信息来优化匹配过程&#xff0c;减少…...

分类操作,可以通过引入对 Bean 的前置和后置处理

深入理解 BeanPostProcessor BeanPostProcessor&#xff0c;它主要有两个方法before和after的执行阶段&#xff0c;主要就是明白方法是在谁的前面在谁的后面执行 在你的idea中创建一个项目&#xff0c;你可以通过实现Ordered这个接口来&#xff0c;这样就可以让其实现类去实现…...