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

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; }
http://www.cnnetsun.cn/news/556688.html

相关文章:

  • 中文情感分析模型评估:StructBERT测试报告
  • 中文情感分析API实战:StructBERT接口调用示例
  • 智能安防AI体验方案:1块钱起用云端GPU,比买显卡省90%
  • 跨平台AI视觉开发:一套代码云端部署,支持Windows/Linux
  • UEBA模型部署避坑指南:云端预装镜像5分钟跑通全流程
  • 2024必试的AI安全工具:3个预装镜像10块钱全体验
  • StructBERT实战教程:客服对话情感分析系统搭建
  • 实体侦测模型微调指南:小样本学习+低成本GPU方案
  • StructBERT轻量级情感分析:企业指南
  • 强化学习中的蒙特卡洛方法
  • Python真题库之CCF GESP 2024年12月认证 Python 5级试题含正确答案与解析(考级教程与教材)
  • StructBERT情感分析API性能优化与压力测试实战
  • 智能工单处理demo搭建:云端GPU2小时极速验证方案
  • Stable Diffusion安全分析实战:AI生成攻击样本检测教程
  • 中文情感分析实战:StructBERT模型应用全指南
  • 中文情感分析实战:StructBERT轻量版部署案例
  • 导师严选8个一键生成论文工具,专科生轻松搞定论文格式规范!
  • 智能合约安全分析:AI辅助审计云端工作站搭建
  • StructBERT部署实战:客服系统情感分析集成案例
  • StructBERT API开发实战:情感分析服务搭建指南
  • 中文文本情感分析实战:StructBERT WebUI搭建教程
  • AI对抗样本生成:红队武器库云端构建指南
  • AI安全工程师成长路径:从入门到实战资源大全
  • 智能WAF进阶:AI自定义规则云端训练平台
  • 运放:反相电压放大器有什么独特作用?
  • Nodejs+vue大学校园旧物爱心公益捐赠网站设计与实现_20of6
  • AI 伦理治理实操指南:从原则到生产线
  • 零代码体验AI智能体:浏览器直接访问云端GPU服务
  • 中文文本情感分析部署教程:基于StructBERT的轻量级解决方案
  • StructBERT轻量级情感分析:WebUI调优步骤