分治法篇:卷一:最简单的分治法应用例子

2023-11-17

2023年4月25日,周二早上。

我想从最简单的分治法应用例子开始,而不是从经典的例子开始。


用分治法求解数组中的最大值

纯享版

#include <iostream>
using namespace std;

int getMax(int arr[], int start, int end) {
    if (start == end) {
        return arr[start];
    } else {
        int mid = (start + end) / 2;
        int max1 = getMax(arr, start, mid);
        int max2 = getMax(arr, mid+1, end);
        return max(max1, max2);
    }
}

int main() {
    int arr[] = {5, 6, 1, 2, 9, 4, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    int max= getMax(arr, 0, n-1);
    cout << "数组中最大值为:" << max<< endl;
    return 0;
}

博主分析版

#include <iostream>
using namespace std;

int getMax(int arr[], int start, int end) {
	//如果查找范围缩小成了一个数,就直接返回这个数
    if (start == end) {
        return arr[start];
    }
	//否则,就找到数组的中点,
	//然后分别找出从数组最左边到中点(包括中点)这段范围的最大值,
	//和从数组最右边到中点(不包括中点)这段范围的最大值,
	//最后,比较这两段范围的两个最大值,返回较大者。 
	else {
        int mid = (start + end) / 2;
        //可是,关键在于进入递归后发生了什么事情。
		//欲知进入递归后发生什么,请继续看博客的下文
        int max1 = getMax(arr, start, mid);
        int max2 = getMax(arr, mid+1, end);
        return max(max1, max2);
    }
}

int main() {
    int arr[] = {5, 6, 1, 2, 9, 4, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    int max= getMax(arr, 0, n-1);
    cout << "数组中最大值为:" << max<< endl;
    return 0;
}

进入递归后,到底发什么了什么事情呢?

给代码添加监视语句,可以清楚地看到整个递归过程

#include <iostream>
using namespace std;

int getMax(int arr[], int start, int end) {
    if (start == end) {
    	cout<<start<<"=="<<end<<";"<<"return "<<arr[start]<<endl;
        return arr[start];
    }
	else {
        int mid = (start + end) / 2;
        cout<<"max1=getMax(arr,"<<start<<","<<mid<<");"<<endl;
        int max1 = getMax(arr, start, mid);
        cout<<"max2=getMax(arr,"<<mid+1<<","<<end<<");"<<endl;
        int max2 = getMax(arr, mid+1, end);
        cout<<"return max(max1,max2);max("<<max1<<","<<max2<<")="<<max(max1,max2)<<endl;
        return max(max1, max2);
    }
}

int main() {
    int arr[] = {5, 6, 1, 2, 9, 4, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    int max= getMax(arr, 0, n-1);
    cout << "数组中最大值为:" << max<< endl;
    return 0;
}

从控制台反应的结果来看,在递归的过程中,长度为7的数组被分成了7个部分

 

然后这7个部分,进行了6次比较,并在比较的过程中合并成最后的结果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分治法篇:卷一:最简单的分治法应用例子 的相关文章

  • MTU 和 MSS 区别

    MTU Maximum Transmit Unit 最大传输单元 即物理接口 数据链路层 提供给其上层 通常是IP层 最大一次传输数据的大小 以普遍使用的以太网接口为例 缺省MTU 1500 Byte 这是以太网接口对IP层的约束 如果IP
  • HPE Microserver GEN10升级BIOS

    到手的机子BIOS版本还是ZA10A290 非常有必要升级 便从HPE官网下载了最新的版本 ZA10A360 选择UEFI Shell方式更新 官网下载地址 https support hpe com hpesc public km pro

随机推荐

  • Cutter - Web视频剪辑工具原理浅析

    大厂技术 坚持周更 精选好文 最近一直在开发 web视频剪辑工具 cutter 这个工具可以方便老师们编辑拍摄好的视频 这是一个挺有意思的项目 预计分多章和大家分享介绍 本期主要介绍下其大体流程 方便大家对其原理有一个简单认知 Cutter
  • Docker安全设置

    Docker安全 Linux内核的命名空间机制提供的容器隔离安全 Linux控制组机制对容器资源的控制能力安全 Linux内核的能力机制所带来的操作权限安全 Docker程序 特别是服务端 本身的抗攻击性 其他安全增强机制对容器安全性的影响
  • elementui不生效

    1 element依赖vue 引入element js之前要引入vue js 2 element无法脱离Vue使用 html中必须new Vue el app 挂载上去
  • C语言函数大全--f开头的函数(下)

    f开头的函数 下 21 floor floorf floorl 21 1 函数说明 21 2 演示示例 21 3 运行结果 22 flushall 22 1 函数说明 22 2 演示示例 22 3 运行结果 23 fma fmaf fmal
  • php发送请求写请求头,PHP发送请求头和接收打印请求头

    一 发送请求头 发送地址 url http 127 0 0 1 2 php 请求头内容 headers array Authorization basic suibianzhi basic 使用curl发送 ch curl init url
  • 计算机缺失VCRUNTIME140.dll怎么办,那个修复方法可以解决

    计算机提示缺失VCRUNTIME140 dll怎么办 无法启动运行软件程序 如photoshop pr ae等等都是无法启动 打开电脑就报错 由于找不到VCRUNTIME140 dll 无法继续执行此代码 让我们先来了解一下VCRUNTIM
  • Gitee初练 --- 问题合集(一)

    Gitee 一 Windows找不到gpedit msc请确定文件名是否正确的提示 二 windows 10 凭据无法保存 三 解决 git pull push 每次都要输入用户名密码的问题 一 Windows找不到gpedit msc请确
  • C++ 读写二进制文件

    描述 C 来读取二进制文件 二进制文件的格式可以多种多样 比如dat index等 还可以是自行定义的格式 C 来写二进制文件 一 读二进制文件 结构体定义及头文件 include
  • 38 匹配字符串——findall()方法

    文章目录 语法 案例 语法 findall 方法用于在整个字符串中搜索所有符合正则表达式的字符串 并以列表的形式返回 如果匹配成功 则返回包含匹配结构的列表 否则返回空列表 findall 方法的语法格式如下 re findall patt
  • css实现图片叠加的几种思路(记录笔记)

    背景 实现点击事件 触发原图的img透明度降低 成为透明背景 并且加一个不透明的原图 可以用于加水印 一个div覆盖几个样式 使用的是vue vue cli搭建项目 几种思路 1 切换背景样式 设置一个key 当div元素触发点击事件 di
  • (SUB)选择排序时间、空间复杂度

    基本思想 将一组数据分为两部分 前面是已排序部分 后面是未排序部分 初始状态可认为位置 0 为已排序部分 数组下标从0开始 其余为未排序部分 每一次都从未排序部分选择一个最小元素放在已排序部分的末尾 然后已排序部分增加一个元素 未排序部分减
  • 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 黄文俊 腾讯云高级产品经理 曾经历过企业级存储 企业级容器平台等产品的架构与开发 对容器 微服务 无服务器 DevOps等都有浓厚兴趣 由 腾讯云serverless团队 发布在
  • selenium版本不匹配

    window10解决selenium版本不匹配问题 如运行出现以下错误 File C Python37 lib site packages selenium webdriver chrome webdriver py line 73 in
  • 【Google测试之道】 第二章 软件测试开发工程师

  • 方法简单手把手教你,空闲时间在家剪辑视频,一天收入300多

    做一个视频剪辑号 不开玩笑 认真做一个月真的能做到1w 有不少人都不知道 我们平时在手机上刷到的横屏视频都是可以赚钱的 而且也可以不用露脸拍摄视频 下班在家也可以赚取一份额外收入 很多人就会有疑问了 不露脸 不拍摄视频怎么赚钱 其实做视频剪
  • 【netty】netty HashedWheelTimer 延时队列

    1 概述 想要研究这个是因为 Flink Flink 写入 Clickhouse 大对象直接进入老年代 导致OOM 遇到了这个问题 在这个问题中 我将时间轮改小了 时间轮 512改成16个 Netty中提供的HashedWheelTimer
  • 代码实现对selenium的驱动器WebDrive的配置

    1 条件 1 使用的浏览器是Microsoft Edge 2 简述过程 代码实现 1 pip 安装 2 下载 3 解压 4 运行 3 发现一个报错 1 原因 在给出代码之前 我发现一个报错 很离谱 且听笔者慢慢细说 首先 安装了seleni
  • 编译 - Make 命令教程 以及Makefile - 学习/实践

    1 应用场景 主要用于学习和使用make命令进行软件编译安装 2 学习 操作 1 文档阅读 Make 命令教程 阮一峰的网络日志 Make GNU Project Free Software Foundation 第21讲 如何使用脚本语言
  • 关系表的构成要素主键_数据库:关系型数据库的基本术语有哪些?

    一 关系 relation 关系就是二维表 二维表的名字就是关系的名字 二 属性 attribute 二维表中的每个列就称为一个属性 或叫字段 每个属性有一个名字 称为属性名 三 值域 domain 二维表中属性的取值范围称为值域 四 元组
  • 分治法篇:卷一:最简单的分治法应用例子

    2023年4月25日 周二早上 我想从最简单的分治法应用例子开始 而不是从经典的例子开始 用分治法求解数组中的最大值 纯享版 include