news 2026/5/23 16:04:48

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/11 18:59:58

零基础学AI绘画:Stable Diffusion云端版,30分钟出第一张图

零基础学AI绘画&#xff1a;Stable Diffusion云端版&#xff0c;30分钟出第一张图 1. 为什么选择Stable Diffusion云端版&#xff1f; 退休后想学点新东西&#xff1f;AI绘画是个不错的选择。但传统安装方式需要配置Python环境、下载几十GB模型文件、调试显卡驱动...光是这些…

作者头像 李华
网站建设 2026/5/20 19:32:34

情感分析系统数据标注:StructBERT辅助

情感分析系统数据标注&#xff1a;StructBERT辅助 1. 中文情感分析的现实挑战与技术需求 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;中文情感分析是企业洞察用户反馈、监控舆情、优化服务体验的核心手段。无论是电商平台的商品评论、社交媒体的公众…

作者头像 李华
网站建设 2026/5/20 16:42:36

RPA+AI体自动化教程:小白1小时打造智能工作流

RPAAI体自动化教程&#xff1a;小白1小时打造智能工作流 1. 什么是RPAAI智能体&#xff1f; 想象一下&#xff0c;你有一个24小时不休息的数字化助手&#xff0c;它能帮你完成那些重复枯燥的办公室工作——整理Excel表格、回复固定格式邮件、处理PDF文件&#xff0c;甚至还能…

作者头像 李华
网站建设 2026/5/15 16:32:04

云原生AI安全:K8s威胁检测模型部署详解

云原生AI安全&#xff1a;K8s威胁检测模型部署详解 引言&#xff1a;当AI遇上云原生安全 想象一下&#xff0c;你的Kubernetes集群就像一座繁忙的机场&#xff0c;每天有成千上万的"旅客"&#xff08;容器&#xff09;进进出出。传统的安检方式&#xff08;基于规则…

作者头像 李华
网站建设 2026/5/1 2:37:35

AI智能体异常检测实战:云端GPU 10分钟出结果,新手友好

AI智能体异常检测实战&#xff1a;云端GPU 10分钟出结果&#xff0c;新手友好 引言&#xff1a;为什么需要AI智能体做异常检测&#xff1f; 想象你是一名数据分析师&#xff0c;每天要面对海量的系统日志。这些日志就像是一个不停说话的"话痨"&#xff0c;每秒都在…

作者头像 李华
网站建设 2026/4/30 21:29:07

深度测评9个AI论文平台,专科生搞定毕业论文必备!

深度测评9个AI论文平台&#xff0c;专科生搞定毕业论文必备&#xff01; AI 工具如何助力专科生高效完成毕业论文 在当前的学术环境中&#xff0c;越来越多的学生开始借助 AI 工具来提升论文写作效率。对于专科生而言&#xff0c;撰写一篇结构严谨、内容充实的毕业论文不仅是对…

作者头像 李华