news 2026/6/1 9:16:16

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/5/28 3:38:31

大模型体验成本对比:云端1小时1块 vs 自建显卡投入

大模型体验成本对比&#xff1a;云端1小时1块 vs 自建显卡投入 引言 作为技术总监&#xff0c;当你计划为团队引入AI能力时&#xff0c;最头疼的问题莫过于&#xff1a;该采购显卡自建算力&#xff0c;还是直接使用云服务&#xff1f; 这个问题看似简单&#xff0c;实则涉及复…

作者头像 李华
网站建设 2026/5/31 8:39:09

Stable Diffusion安全分析实战:云端GPU生成恶意样本,3块钱玩整天

Stable Diffusion安全分析实战&#xff1a;云端GPU生成恶意样本&#xff0c;3块钱玩整天 1. 为什么红队工程师需要云端Stable Diffusion&#xff1f; 作为一名红队工程师&#xff0c;测试防御系统时常常需要生成大量对抗样本。传统方式在本地运行Stable Diffusion面临两个痛点…

作者头像 李华
网站建设 2026/5/28 19:28:04

智能威胁感知实战:从数据到警报全流程3小时速成

智能威胁感知实战&#xff1a;从数据到警报全流程3小时速成 引言&#xff1a;为什么你需要AI驱动的威胁检测&#xff1f; 作为一名刚加入安全团队的新人&#xff0c;面对海量日志和复杂告警系统时&#xff0c;你是否感到无从下手&#xff1f;传统安全培训往往需要数周时间&am…

作者头像 李华
网站建设 2026/5/29 0:24:12

AI安全工程师速成:配套云端靶场,学完直接上岗

AI安全工程师速成&#xff1a;配套云端靶场&#xff0c;学完直接上岗 引言&#xff1a;从军营到网络安全战场的无缝衔接 退伍军人转行网络安全领域有着天然优势&#xff1a;纪律性强、学习能力突出、对系统性思维训练有素。但很多战友在转型过程中遇到一个共同瓶颈——学完理…

作者头像 李华
网站建设 2026/5/28 12:05:39

智能体模型解释性工具:5分钟可视化黑箱,合规审计必备

智能体模型解释性工具&#xff1a;5分钟可视化黑箱&#xff0c;合规审计必备 引言&#xff1a;当银行AI遇上监管问询 去年某商业银行的信贷审批AI系统突然收到监管问询函&#xff0c;要求解释"为什么拒绝张先生的贷款申请"。面对这个黑箱模型&#xff0c;技术团队花…

作者头像 李华
网站建设 2026/5/31 7:11:26

AI视觉模型压缩:云端量化蒸馏教程,体积缩小80%

AI视觉模型压缩&#xff1a;云端量化蒸馏教程&#xff0c;体积缩小80% 引言&#xff1a;为什么物联网设备需要模型压缩&#xff1f; 想象一下&#xff0c;你买了一个智能门铃&#xff0c;它能够识别人脸、检测包裹&#xff0c;还能分辨访客身份。但用了一段时间后发现&#x…

作者头像 李华