news 2026/3/26 5:49:51

c++分治算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++分治算法

分治算法的策略

简单来说,分治算法的基本思想就是:
规模大的问题不断分解为子问题,使得问题规模减小到可以直接求解为止。


分治算法

基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。
求出子问题的解,就可得到原问题的解。
即一种分目标完成程序算法,简单问题可用二分法完成。


分治思想的经典应用

-二分查找
-归并排序
-快速排序
-大整数乘法
-Strassen矩阵乘法


二分查找

二分查找的定义
-二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法
-核心思想:每次将查找范围缩小一半,直到找到目标元素或确定目标元素不存在
二分查找的前提条件
-数组必须是有序的(升序或降序)
-数组元素支持随机访问(如数组,而不是链表)
二分查找的优势
-时间复杂度为O(log n),远优于线性查找的O(n)
-空间复杂度低,迭代实现为O(1).递归实现为O(log n)


二分查找算法原理

算法步骤
1.初始化查找范围:左边界left=0,右边界right=数组长度-1
2.当left ≤ right时,执行以下操作:
-计算中间位置mid = left +(right - left)/ 2(避免整数溢出)
-如果arr[mid] == 目标值,返回mid
-如果arr[mid] < 目标值,说明目标值在右半部分,更新left = mid + 1
-如果arr[mid] > 目标值,说明目标值在左半部分,更新right = mid - 1
3.如果循环结束仍未找到目标值,返回-1表示不存在


迭代实现

#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int a[1000]; int n; int bfind(int,int,int); int main() { cin>>n; for(int i = 0;i<n;i++) { cin>>a[i]; } sort(a+0,a+n); int x; cin>>x; cout<<bfind(x,0,n-1); return 0; } int bfind(int x,int l,int r) { while(l<=r) { int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]<x) l = mid+1; else if(a[mid]>x) r = mid-1; } return -1; }

递归实现

#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int a[1000]; int n; int bfind(int,int,int); int bfind2(int,int,int); int main() { cin>>n; for(int i = 0;i<n;i++) { cin>>a[i]; } sort(a+0,a+n); int x; cin>>x; cout<<bfind2(x,0,n-1); return 0; } int bfind(int x,int l,int r) { while(l<=r) { int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]<x) l = mid+1; else if(a[mid]>x) r = mid-1; } return -1; } int bfind2(int x,int l,int r) { if(l>r) return -1; int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]>x) return bfind2(x,l,mid-1); else if(a[mid]<x) return bfind2(x,mid+1,r); }

练习题

查找最后一个出现的target

题目描述
给你有序一个数组,级一个target,数据量很大,请你使用二分查找法,查找最后一个出现的target所在的位置(数组索引)
输入格式
2行
第一行一个整数n,数组长度
第二行n个整数,数组元素,空格隔开
第三行—个整数target
输出格式
输出一个整数,最后一个出现的target所在的位置(数组索引),如果没有,输出-1
提示

找到以后,继续向右查找

用例输入
5
1 2 2 3 4
2
用例输出
2

#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int a[1000]; int n; int bfind(int,int,int); int bfind2(int,int,int); int bfind3(int,int,int); int main() { cin>>n; for(int i = 0;i<n;i++) { cin>>a[i]; } sort(a+0,a+n); int x; cin>>x; cout<<bfind2(x,0,n-1); return 0; } int bfind(int x,int l,int r) { while(l<=r) { int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]<x) l = mid+1; else if(a[mid]>x) r = mid-1; } return -1; } int bfind2(int x,int l,int r) { if(l>r) return -1; int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]>x) return bfind2(x,l,mid-1); else if(a[mid]<x) return bfind2(x,mid+1,r); } int bfind3(int x,int l,int r) { int result = -1; while(l<=r) { int mid = l + (r-l)/2; if(a[mid]>x) r = mid-1; else if(a[mid]<x) l = mid+1; else if(a[mid]==x) { if(a[mid-1]!=x) return mid; else l = mid+1; } } return result; }

查找第一个大于等于target的数据

题目描述
给你有序一个数组,级一个target,数据量很大,请你使用二分查找法,查找第一个大于等于目标值的元素的索引
输入格式
2行
第一行一个整数n,数组长度
第二行n个整数,数组元素,空格隔开
第三行一个整数target
输出格式
输出一个整数,第一个大于等于目标值的元素的索引,如果没有,输出-1

用例输入
5
1 2 2 3 4
2
用例输出
1

#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int a[1000]; int n; int bfind(int,int,int); int bfind2(int,int,int); int bfind3(int,int,int); int main() { cin>>n; for(int i = 0;i<n;i++) { cin>>a[i]; } sort(a+0,a+n); int x; cin>>x; cout<<bfind3(x,0,n-1); return 0; } int bfind(int x,int l,int r) { while(l<=r) { int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]<x) l = mid+1; else if(a[mid]>x) r = mid-1; } return -1; } int bfind2(int x,int l,int r) { if(l>r) return -1; int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]>x) return bfind2(x,l,mid-1); else if(a[mid]<x) return bfind2(x,mid+1,r); } int bfind3(int x,int l,int r) { int result = -1; while(l<=r) { int mid = l + (r-l)/2; if(a[mid]>x) r = mid-1; else if(a[mid]<x) l = mid+1; else if(a[mid]==x) { if(a[mid-1]>=x) return mid; else l = mid+1; } } return result; }

查找最后一个小于等于target的数据

题目描述
给你有序一个数组,级一个target,数据量很大,请你使用二分查找法,查找最后一个小于等于目标值的元素的索引
输入格式
2行
第一行一个整数n,数组长度
第二行n个整数,数组元素,空格隔开
第三行一个整数target
输出格式
输出一个整数,最后一个小于等于目标值的元素的索引,如果没有,输出-1

用例输入
5
1 2 2 3 4
2
用例输出
2

#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int a[1000]; int n; int bfind(int,int,int); int bfind2(int,int,int); int bfind3(int,int,int); int main() { cin>>n; for(int i = 0;i<n;i++) { cin>>a[i]; } sort(a+0,a+n); int x; cin>>x; cout<<bfind2(x,0,n-1); return 0; } int bfind(int x,int l,int r) { while(l<=r) { int mid = l + (r-l)/2; if(a[mid] == x) return mid; else if(a[mid]<x) l = mid+1; else if(a[mid]>x) r = mid-1; } return -1; } int bfind2(int x,int l,int r) { if(l>r) return -1; int mid = l + (r-l)/2; if(a[mid] <= x) return mid; else if(a[mid]>x) return bfind2(x,l,mid-1); else if(a[mid]<x) return bfind2(x,mid+1,r); } int bfind3(int x,int l,int r) { int result = -1; while(l<=r) { int mid = l + (r-l)/2; if(a[mid]>x) r = mid-1; else if(a[mid]<x) l = mid+1; else if(a[mid]==x) { if(a[mid-1]>=x) return mid; else l = mid+1; } } return result; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 19:06:40

智能监控系统DIY教程:200元预算玩转AI异常识别

智能监控系统DIY教程&#xff1a;200元预算玩转AI异常识别 1. 为什么选择云端AI监控方案&#xff1f; 农场主老王最近很头疼&#xff1a;仓库总有人偷饲料&#xff0c;装了几个普通摄像头只能事后查录像&#xff0c;根本防不住。专业安防系统动辄上万元&#xff0c;而树莓派跑…

作者头像 李华
网站建设 2026/3/16 8:54:23

AI模型开箱即用指南:10个预装镜像,免配置直接运行

AI模型开箱即用指南&#xff1a;10个预装镜像&#xff0c;免配置直接运行 1. 为什么你需要预装镜像&#xff1f; 作为一名产品经理&#xff0c;周末想自学AI却被GitHub上复杂的安装说明劝退&#xff1f;这就像想学开车却被要求先造一台发动机。传统AI开发需要&#xff1a; 安…

作者头像 李华
网站建设 2026/3/22 10:04:23

StructBERT实战:社交媒体情感监控系统部署案例

StructBERT实战&#xff1a;社交媒体情感监控系统部署案例 1. 引言&#xff1a;中文情感分析的现实需求 在社交媒体、电商平台和用户反馈系统中&#xff0c;海量的中文文本数据每天都在产生。如何快速识别用户情绪倾向&#xff0c;成为企业洞察舆情、优化服务的关键能力。传统…

作者头像 李华
网站建设 2026/3/23 0:11:08

AI安全入门必看:2024最经济学习方案,1小时1块钱

AI安全入门必看&#xff1a;2024最经济学习方案&#xff0c;1小时1块钱 1. 为什么AI安全成为求职加分项&#xff1f; 最近几年&#xff0c;随着AI技术的快速发展&#xff0c;AI安全问题也日益突出。各大企业都在积极招聘懂AI安全的人才&#xff0c;尤其是应届毕业生如果掌握这…

作者头像 李华
网站建设 2026/3/23 7:49:16

BIOS界面设置虚拟机为enabled然后就可以进行WSL2的升级了

昨天进入电脑的BIOS界面设置虚拟机为enabled&#xff0c;然后就可以进行WSL2的升级了。从系统的角度讲一讲这是怎样的过程&#xff1f;分为operating system&#xff0c; users level&#xff0c; and hardware分析这到底是怎么回事儿 WSL升级与虚拟化技术&#xff1a;从操作系…

作者头像 李华
网站建设 2026/3/9 7:30:12

实时交易智能体开发:毫秒级响应云主机,成本仅为自建集群15%

实时交易智能体开发&#xff1a;毫秒级响应云主机&#xff0c;成本仅为自建集群15% 引言&#xff1a;当量化交易遇上AI智能体 想象一下&#xff0c;你正在参与一场赛车比赛&#xff0c;但你的对手开的是F1赛车&#xff0c;而你却骑着一辆自行车。这就是许多量化团队在回测高频…

作者头像 李华