五大常用算法(一) 分治算法(1) 二分查找

五大常用算法(一) - 分治算法 分治算法 基本思想 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题类型一致,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 分治是很多高效算法的基础,如排序算法(快速排序,归并... 阅读详情

本文章参考自:http://blog.163.com/wujiaxing009@126/blog/static/71988399201241481757657/

1.最基础的二分查找:

#include <iostream>
using namespace std;

int bsearch(int t[],int k,int n){
   int low = 0;
   int high = n - 1;
   int mid;
   while(low <= high){//等于的情况才是最普遍的情况,不能忘记等于号
      mid = (low + high) / 2;
	  if( k == t[mid])
		  return mid;
	  else if(k < t[mid])
		  high = mid - 1;
	  else
		  low = mid + 1;
   }
   return -1;
}

int main(){
   int t[10];
   for(int i = 0; i < 10; i++){
     cin >> t[i];
   }
   //sort...
   for(int i = 0; i < 10; i++)
	   cout << t[i] << " ";
   cout << endl;
   int k;
   cin >> k;
   cout << bsearch(t,k,10)<<endl;
   return 0;
}

或者写为递归的形式也可以实现二分查找。

若出现了重复的情况:则可以为:

#include <iostream>
using namespace std;

 
int bsearch(int *t,int k,int n)
{
    int low=0,high=n-1,mid;
    while (low<=high)
        {
        mid=(low+high)/2;
        if (k==t[mid]) 
    {
       while(t[mid] == k)
       {
          mid--;
       }
        return mid+1;
    }       
    else if (k<t[mid]) high=mid-1;
        else low=mid+1;
        }
    return -1;
}

int main(){
   int t[10];
   for(int i = 0; i < 10; i++){
     cin >> t[i];
   }
   //sort...
   for(int i = 0; i < 10; i++)
	   cout << t[i] << " ";
   cout << endl;
   int k;
   cin >> k;
   cout << bsearch(t,k,10)<<endl;
   return 0;
}

为了提高效率,我们使用分治的方法改进如下:

#include <iostream>
using namespace std;

 
int bsearch(int *t,int k,int n){
   int high = n - 1;
   int low = 0;
   int mid;
   int flag = -1;
   while(low <= high){
      mid = (low+high) / 2;
	  if(t[mid] == k){
	     flag = mid;//保存上次查找的信息
		 high = mid - 1;//找第一次出现k的位置,所以往左边找
	  }
	  else if(k < t[mid])
		  high = mid - 1;
	  else
		  low = high + 1;
   }
   if(flag == -1)
	   return -1;
   else
	   return flag;
}



int main(){
   int t[10];
   for(int i = 0; i < 10; i++){
     cin >> t[i];
   }
   //sort...
   for(int i = 0; i < 10; i++)
	   cout << t[i] << " ";
   cout << endl;
   int k;
   cin >> k;
   cout << bsearch(t,k,10)<<endl;
   return 0;
}
五大常用算法:分治、动态规划、贪心、回溯和分支界定 分治算法 一、基本概念    在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……     任何一个可以用计算机求解的 阅读详情

相关推荐

五大常用算法(一) 分治算法(2) 大整数乘法

普通算法:参考自:http://wangxiaosu0501.blog.163.com/blog/static/11565259920110495415730/   #include #include #include using namespace std; vector multiply(vector v1,vector v2); int main(){ vector v

1ouis的专栏 6120

五大常用算法

学习算法前,先了解一下五大常用算法,方便后续归类总结及练习,到达触类旁通的效果。 一。分治算法:快速排序、归并排序、大整数乘法、二分查找、递归(汉诺塔) 基本概念:把一个复杂的问题分成若干个相同或相似的子问题,再把子问题分成更小的子问题… , 知道最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 看上去有点类似Fork/Join框架,或map-reduce。 排序算法中的快速排序、归并排序都是使用的分治算法。 分治算法的适用场景: 1)当问题规模缩小到一定的程度就可以很容易解决 2)

qq_43517257的博客 4317

【五大常用算法】一文搞懂分治算法

原创公众号:bigsai 文章收录在 bigsai-algorithm 求个star 前言 分治算法(divide and conquer)是五大常用算法(分治算法、动态规划算法、贪心算法、回溯法、分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算法,本篇就带你较为全面的去认识和了解分治算法。 在学习分治算法之前,问你一个问题,相信大家小时候都有存钱罐的经历,父母亲人如果给钱都会往自己的宝藏中存钱,我们每隔一段时间都会清点清点钱。但是一堆钱让你处理起来你可能觉得很复.

bigsai 3621

二、五大常用算法的简单介绍

1、递归与分治 递归算法:直接或者间接不断反复调用自身来达到解决问题的方法。这就要求原始问题可以分解成相同问题的子问题。 示例:阶乘、斐波纳契数列、汉诺塔问题 斐波纳契数列:又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F1=1,F2=1,Fn=F(n-1)+F(n-2)(n>2,n∈N*))。 ...

weixin_33720452的博客 1394

【愚公系列】五大常用算法(一)-分治算法

五大常用算法的特点如下:分治:将一个大问题拆分成若干个小问题,分别解决,然后将解决结果合并起来得到整个问题的解。分治算法的特点是递归,效率高,但对数据的规律要求比较高,需要较高的算法设计技巧。常见应用领域为排序、查找和统计等。动态规划:将一个大问题分解成若干个小问题,通过寻找子问题之间的递推关系,求解小问题的最优解,然后将小问题的最优解组合起来解决整个大问题。动态规划的特点是可以解决具有重叠子问题的问题,但需要较高的时间和空间复杂度。常见应用领域为求解最大子序列、背包问题等。

愚公智库 5万+

二分查找算法流程图流程图举例

数据结构中简单的二分查找(折半查找)流程图实例

常用五大算法详细介绍

简单介绍: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择,有可能陷入局部最优。 分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 动态规划:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。与分治的区别:经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立

hyqsong的专栏 1223

二分查找算法

根据二分查找算法编制一个字符串类,其中包括普通构造函数,拷贝构造函数,以及析构函数和赋值函数。

学习ing

ghostriderk的专栏 1186

Android 性能之 Game Mode

本文的目的是介绍 AOSP Game Mode 功能。Game Mode 功能的核心是系统服务 GameManagerService,在本文中用 GMS 指代 GameManagerService。在 API 26 之后,应用开发者可以通过将应用的 category 属性设置为 "game",使系统(即 GMS)能够将该应用识别为 "游戏"。GMS 定义了 4 种 game mode,即 1|2|3|4|standard|performance|battery|custom;

专注于系统快稳省领域 3064

从半导体物理到实战:手把手教你测量MOS管体二极管的Vf和Trr

本文深入探讨了MOSFET体二极管的关键参数测量方法,重点讲解了正向压降(Vf)和反向恢复时间(Trr)的测量原理与实战步骤。通过搭建测试平台,使用万用表和示波器等工具,手把手指导如何量化这些影响开关损耗和效率的核心参数,并对比分析了硅基与碳化硅(SiC)器件在体二极管性能上的显著差异。

n7o8p的博客 341

五大类常见算法 (递归与分治,动态规划,贪心,回溯,分支界限法)

五类常见算法 (递归与分治,动态规划,贪心,回溯,分支界限法)经典例题一、递归与分治二、动态规划三、贪心四、回溯五、分支界限法 在系统地刷leetcode算法题之前,先从宏观上了解一下这五大算法 经典例题 列举五大算法及其解决的一些经典问题: 算法 经典例题 递归 Fibonacci数列,阶乘,Hanoi塔 分治 二分法搜索、高速排序、合并排序 动态规划 最长公共子序列; 最大连续子序列和 贪心 哈夫曼编码;单源最短路径(Dijkstra算法);最小生成树(Prim和Kruska

林哲乐的博客 5519

python数据分析与可视化

Python数据分析主要包括数据清洗、数据探索和数据可视化三个部分。数据清洗是数据分析的重要环节,主要是对数据进行预处理,包括缺失值处理、异常值处理、数据类型转换等。数据探索则是通过对数据进行初步分析,了解数据的分布和特征,为后续的数据分析提供基础。数据可视化则是将数据以图形化的方式呈现,帮助人们更好地理解和分析数据。

2301_82032652的博客 7713

分治算法二分查找c语言,五大常用算法(一) 分治算法(1) 二分查找

本文章参考自:http://blog.163.com/wujiaxing009@126/blog/static/71988399201241481757657/1.最基础的二分查找:#include using namespace std;int bsearch(int t[],int k,int n){int low = 0;int high = n - 1;int mid;while(low ...

weixin_35070925的博客 442

瑞萨MCU定时器API实战:从Smart Configurator配置到中断与输入捕获应用

在嵌入式系统开发中,定时器(Timer)是实现精准时序控制、PWM输出和信号测量的核心硬件外设。其工作原理基于计数器在稳定时钟源驱动下递增或递减,达到预设值后触发中断或改变输出电平,从而为系统提供节拍和事件基准。通过图形化配置工具(如瑞萨的Smart Configurator),开发者可以高效地将复杂的硬件寄存器操作转化为清晰、标准化的C语言API函数,这极大地提升了开发效率并降低了出错风险。这种从硬件抽象到软件接口的技术价值在于,它使得开发者能更专注于应用逻辑,而非底层细节,尤其适用于工业控制、汽车电子等

weixin_42519733的博客 274

Linux Namespace隔离实战:dd/mkfs/mount/unshare构建终极沙箱

内存占用 | 512MB+ | **<10MB** | 50倍节省 || 启动时间 | 15-45秒 | **0.1-0.5秒** | 100倍加速 || 磁盘空间 | GB级 | **MB级** | 显著减少 || 系统调用性能 | 有损耗 | **原生速度** | 零损耗 |

Loving_enjoy的博客 398

五大常用经典算法—分治算法

原文作者:bigsai 原文地址:五大常用算法:一文搞懂分治算法 目录 前言 分治算法介绍 分治算法经典问题 二分搜索 快速排序 归并排序(逆序数) 最大子序列和 最近点对 结语 前言 分治算法(divide and conquer)是五大常用算法(分治算法、动态规划算法、贪心算法、回溯法、分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算法,本篇就带你较为全面的去认识和了解分治算法。在学习分治算法之前,问你一个问题,相信大家小时候都有存钱.

sanmi8276的博客 9064

华为OD机试 - 机器人活动区域(Java 双机位C卷 200分)

现有一个机器人,可放置于 M × N的网格中任意位置,每个网格包含一个非负整数编号。之后M行表示网格数值,每行N个数值(数值大小用k表示),数值间用单个空格分隔,行首行尾无多余空格。说明:图中绿色区域,相邻网格差值绝对值都小于等于1,且为最大区域,对应网格点数目为6。M、N、k均为整数,且1

学Java,找哪吒 916

五大常用算法之一:分治算法

分治算法 一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关...

CSer 3万+

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点

AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。

qq_36130719的博客 159

五大算法思想(一)分治算法及常见例子

五大算法思想 分治算法介绍 二分搜索、大整数乘法、Strassen矩阵乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔

HK的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

五大常用算法-分治算法

基本思想: 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解发在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把他们组合成整个问题的解法,如果这些子问题还比较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。 二分法: 利用分治法求解时,所需时间取决于分解后子问题的个数,子问题的规模大小等因素,而二分法,由于其划分简单和均匀的特点,是经常采用的一种有

无简介 3489

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

五大常用算法总结(穷举法, 贪婪算法,动态规划算法,分治算法,分支限界算法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/changyuanchn/article/details/51476281 </div> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/templ...

古月哲亭 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

游戏与常用的五大算法---上篇

前言:       什么时候,我们之间竟然变得这么生疏       什么时候,我想见到你,却又害怕见到你       什么时候,才能在我身边,告诉我。其实,你一直都在                                    -----------《仙剑奇侠传》 PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示

Loving_Forever_的博客 3万+
上一篇: 五大常用算法(一) 分治算法
下一篇: 五大常用算法(一) 分治算法(2) 大整数乘法
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值