分治法思想-归并排序案例图片详解

news2024/10/7 12:22:29

分治法简介

分治法思想

​ 分治法,就是将一个难以解决的大问题给分成多个规模较小的子问题,分别解决各个子问题,最后合并子问题的解得到原问题的解。

分治法求解过程:

1、划分():

​ 把规模为n的原问题划分为k(通常k=2)个规模较小的子问题,再对子问题继续划分,直到到达最小子问题时终止(比如说元素只剩1个),一般使用递归来实现。

3、合并():

​ 从已知解的最小子问题开始,从底至顶地将子问题的解进行合并,从而构建出原问题的解。合并的代价因情况不同有比较大的差异,分治算法的效率很大程度上依赖合并的实现

分治思想在生活中的应用

1、做饭

​ 在做饭的过程中,需要准备主食、汤、菜。

​ 将整个做饭分解成蒸米饭、煮汤、烧菜三部分,三部分完成后再整合再一起放在桌子上,完成做饭。

2、人口普查

​ 全国人口普查,将问题拆分成省级,市级,区级,乡镇级,街道级,小区级。

​ 然后依次向上汇报进行汇总,然后自下而上统计人数。

如何判断是否为分治问题:

一个问题是否适合使用分治解决,通常可以参考以下几个判断依据。

  1. 问题可以分解:原问题可以分解成规模更小、类似的子问题,以及能够以相同方式递归地进行划分。
  2. 子问题是独立的:子问题之间没有重叠,互不依赖,可以独立解决。
  3. 子问题的解可以合并:原问题的解通过合并子问题的解得来。

经典案例-归并排序

分析:

对于一个无序数组,对其进行排序,其满足分治的三个要求:

  1. 问题可以分解:递归地将数组(原问题)划分为两个子数组(子问题)。
  2. 子问题是独立的:每个子数组都可以独立地进行排序(子问题可以独立进行求解)。
  3. 子问题的解可以合并:两个有序子数组(子问题的解)可以合并为一个有序数组(原问题的解)。

过程图解:

​ 使用递归不断的对原数组进行划分,直到划分为最小子问题(单个元素,单个元素一定是有序的)。

​ 然后再依次合并子数组,将其合并为一个较大的有序数组。
在这里插入图片描述

前面说过,分治算法的效率很大程度上依赖合并的实现,这里合并如何实现是比较重要的。

合并数组操作:

​ 两个子数组从下标0开始,依次比较,拿出其中较小的放入合并后数组中。

​ 最后将剩余子数组的数据依次放入结果数组中。

以上面 {2、3、6、7} 与 {0、1、4、5} 两个有序子数组合并为例:

1、初始化

​ 左边数组、右边数组、合并后数组都从下标0开始,即 leftIndex = rightIndex = resulrIndex = 0

2、第一趟比较

​ 右边数组下标rightIndex=0的位置值小于左边数组下标leftIndex=0位置的值。

​ 先将右边数组下标rightIndex=0的位置值放入结果数组中,然后右边数组下标向后移动一位,结果数组下标向后移动,左边数组下标不动。

​ 即result[resultIndex++] = right[RightIndex++]
在这里插入图片描述

3、第二趟比较

​ 右边数组下标rightIndex=1的位置值小于左边数组下标leftIndex=0位置的值。

​ 先将右边数组下标rightIndex=1的位置值放入结果数组中,然后右边数组下标向后移动一位,结果数组下标向后移动,左边数组下标不动。

​ 即result[resultIndex++] = right[RightIndex++]

在这里插入图片描述

4、第三趟比较
在这里插入图片描述

5、第四躺比较
在这里插入图片描述

6、第五躺比较
在这里插入图片描述

7、第六躺比较
在这里插入图片描述

8、第7躺比较

​ 此时,右边数组遍历结束,左边数组还有剩余。

​ 此时依次将左边数组中数据放入结果数组。

在这里插入图片描述

9、最后

在这里插入图片描述

代码实现:

    /**
     * @param data 待排序数组
     * @param left 待排序数组起始下标
     * @param right 待排序数组终止下标
     * @return
     */
    public static int[] execute(int[] data, int left, int right) {
        // 达到最小子问题,即只有一个元素,那么这个元素一定是有序的
        if (left == right) {
            return new int[]{data[left]};
        }
        /**
         * 定义临时变量
         * midIndex:数组中间值,即将数组划分为 left -> midIndex 和 midIndex+1 -> right 两部分
         * leftIndex:合并两个有序子数组时,记录 left -> midIndex 数组的下标
         * rightIndex:合并两个有序子数组时,记录 midIndex+1 -> right 数组的下标
         * resultIndex:合并两个有序子数组时,记录 合并后有序数组 的下标
         */
        int midIndex = (right - left) / 2 + left, 
                leftIndex = 0, rightIndex = 0, resultIndex = 0;
        // 递归求解 left -> midIndex 部分,使这部分有序
        int[] leftResult = execute(data, left, midIndex);
        // 递归求解 midIndex+1 -> right 部分,使这部分有序
        int[] rightResult = execute(data, midIndex + 1, right);
        // 存储合并后的有序数组
        int[] result = new int[right - left + 1];
        // 合并
        while (leftIndex < leftResult.length && rightIndex < rightResult.length) {
            result[resultIndex++] = 
                    leftResult[leftIndex] <= rightResult[rightIndex] ? 
                            leftResult[leftIndex++] : rightResult[rightIndex++];
        }
        // left -> midIndex 部分有剩余,依次填入合并后有序数组
        while (leftIndex < leftResult.length) {
            result[resultIndex++] = leftResult[leftIndex++];
        }
        // midIndex+1 -> right 部分有剩余,依次填入合并后有序数组
        while (rightIndex < rightResult.length) {
            result[resultIndex++] = rightResult[rightIndex++];
        }
        return result;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEO ISP图像调试-PFC(蓝紫边校正)

目录 1、简单介绍 2、调试策略 3、输出结果 1、简单介绍 GEO中中调整图像蓝紫边可分为两步&#xff0c;第一步&#xff1a;调整蓝紫边检测区域&#xff0c;第二步&#xff1a;设置去蓝紫边强度。 2、调试策略 图1 该图像蓝紫边较严重 主要原因是由于蓝紫边检测不准导致的&…

怎么买充电宝不踩雷?六大充电宝选购攻略,1分钟选对充电宝!

充电宝是选快充好还是慢充好呢&#xff1f;充电宝的充电速度取决于多个因素&#xff0c;包括充电宝的容量、输入电流、充电线的质量等。一般来说&#xff0c;充电宝的充电速度可以通过输入电流来衡量&#xff0c;输入电流越大&#xff0c;充电速度越快。当我们面临选择充电宝的…

常说的上游服务和下游服务如何区分?

目录 上游和下游 &#xff08;upstream and downstream&#xff09;从信息的流向方向来看从依赖规则和价值规则来看 总结参考 上游和下游 &#xff08;upstream and downstream&#xff09; 一般在谈论服务和调用关系的时候&#xff0c;我们会使用上游和下游来表示服务间的相关…

【后端开发】服务开发场景之高可用(冗余设计,服务限流,降级熔断,超时重试,性能测试)

【后端开发】服务开发场景之高可用&#xff08;冗余设计&#xff0c;服务限流&#xff0c;降级熔断&#xff0c;超时重试&#xff0c;性能测试&#xff09; 文章目录 序&#xff1a;如何设计一个高可用的系统&#xff1f;可用性的判断指标是什么&#xff1f;哪些情况会导致系统…

小学姐教你HarmonyOS开发-02-ArkTS语言基础

简单介绍基于TypeScript扩展的ArkTS语言。 ArkTS是鸿蒙生态的应用开发语言&#xff0c;由ArkUI框架提供&#xff0c;以声明式开发范式来开发界面&#xff0c;让开发者可以更简洁、更自然的方式开发高性能应用。 源课程&#xff1a;d2school(第2学堂) 什么是ArkTS&#xff1f; …

免费的维吾尔语翻译工具,汉维翻译软件只推荐这一个《维汉翻译通App》,维吾尔文OCR字母识别!

免费维吾尔语翻译&#xff0c;真好用 《维汉翻译通》App提供免费的短文本翻译服务&#xff0c;支持翻译维吾尔语和汉语&#xff0c;无论是日常对话还是学术研究的内容&#xff0c;都能轻松应对。 维吾尔文OCR&#xff0c;文字识别新体验 高精度维文文字识别技术&#xff0c;让…

跟着AI学AI_11 PyTorch, TensorFlow 和JAX 功能对比简介

PyTorch, TensorFlow 和 JAX 功能对比简介 PyTorch、TensorFlow 和 JAX 是当前最流行的深度学习框架。它们各自具有独特的特性和优势&#xff0c;适合不同的应用场景和开发者需求。下面是对这三个框架的功能对比。 1. 基本概念和特性 PyTorch&#xff1a; 动态计算图&#xf…

王炸ChatGPT学术应用!从文献综述至定稿,轻松完成优质学术论文

智写论文 智写论文&#xff08;chatyy.cn&#xff09;是一款专注AI科研和学术写作的专业平台&#xff0c;AI论文写作、AI学术润色修改、科研分析、文献搜索和综述撰写&#xff0c;科研数据分析、英文学术润色&#xff0c;中英学术互译&#xff0c;文献查询和综述撰写&#xff…

知识图谱的应用---智慧外交

文章目录 智慧外交典型应用 智慧外交 智慧外交是指通过事件分析的手段&#xff0c;从历史、政治、经济、军事、文化等多个层面对各个国家的关系进行定量分析&#xff0c;提供智能化的外交关系研判和外交决策支撑。依托公开媒体、互联网及内部信息等海量资源数据&#xff0c;综合…

vivado HW_SIO_RX

HW_SIO_RX 描述 在硬件设备上&#xff0c;每个GT包括一个独立的接收器hw_sio_rx 由一个PCS和一个PMA组成。高速串行数据从板上的迹线流入 GTX/GTH收发器RX的PMA&#xff0c;进入PCS&#xff0c;最后进入FPGA逻辑。 相关对象 HW_SIO_RX对象与HW_server、HW_target、HW_device、H…

STM32F103 ADC

STM32 ADC 12位ADC是一种逐次逼近型模拟数字转换器,和比较型ADC相比&#xff0c;逐次逼近型ADC的优点是低功耗&#xff0c;缺点是速度慢。下图为逐次逼近型ADC。 ​ STM32F103的ADC有单次和连续转换两种模式&#xff0c;有通道扫描和单独工作两种模式&#xff0c;并且有校准和…

Gi标签管理

文章目录 前言理解标签创建标签操作标签总结 前言 理解标签 标签&#xff0c;可以理解为对某次commit的一次标识&#xff0c;相当于起起了一个别名。 例如&#xff0c;在项目发布某个版本时候&#xff0c;针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。 这有什…

inferCNV:scRNA-seq数据推断染色体拷贝数变化

inferCNV分析简介 inferCNV用于探索肿瘤单细胞RNA-Seq 数据&#xff0c;以确定体细胞大规模染色体拷贝数改变的证据&#xff0c;例如整个染色体或大片段染色体的增益或缺失。这是通过与一组参考“正常”细胞&#xff08;这里的正常细胞可自行定义&#xff09;进行比较&#xf…

【STM32】输入捕获应用-测量脉宽或者频率(方法2)

链接&#xff1a;https://blog.csdn.net/gy3509/article/details/139629893?spm1001.2014.3001.5502&#xff0c;讲述了只使用一个捕获寄存器测量脉宽和频率的方法&#xff0c;其实测量脉宽和频率还有一个更简单的方法就是使用PWM输入模式&#xff0c;PWM输入模式需要占用两个…

Imagic: Text-Based Real Image Editing with Diffusion Models

Imagic: Text-Based Real Image Editing with Diffusion Models Bahjat Kawar, Google Research, CVPR23, Paper, Code 1. 前言 在本文中&#xff0c;我们首次展示了将复杂&#xff08;例如&#xff0c;非刚性&#xff09;基于文本的语义编辑应用于单个真实图像的能力。例如…

Java NIO ByteBuffer 使用方法

前言 最近在使用spring boot websocket xterm.js 给 k8s pod做了个在线的 web 终端&#xff0c;发现websocket的类核心方法&#xff0c;用的都是ByteBuffer传递数据&#xff0c;如下&#xff1a; OnMessagepublic void onMessage(Session session, ByteBuffer byteBuffer) {…

MySQL-分组函数

041-分组函数 重点&#xff1a;所有的分组函数都是自动忽略NULL的 分组函数的执行原则&#xff1a;先分组&#xff0c;然后对每一组数据执行分组函数。如果没有分组语句group by的话&#xff0c;整张表的数据自成一组。 分组函数包括五个&#xff1a; max&#xff1a;最大值mi…

智造新篇章:MicroAlign融资助推高精度FA技术革新

随着智能化浪潮的汹涌澎湃&#xff0c;全球制造业正经历着前所未有的技术革新。MicroAlign&#xff0c;一家专注于高精度功能组装&#xff08;FA&#xff09;技术的创新企业&#xff0c;近日宣布完成了高达100万欧元的种子轮融资。这一轮融资不仅为MicroAlign注入了加速商业化的…

java基于Vue+Spring boot前后端分离架构开发的一套UWB技术高精度定位系统源码

java基于VueSpring boot前后端分离架构开发的一套UWB技术高精度定位系统源码 系统采用UWB高精度定位技术&#xff0c;可实现厘米级别定位。UWB作为一种高速率、低功耗、高容量的新兴无线局域定位技术&#xff0c;目前应用主要聚焦在室内外精确定位。在工业自动化、物流仓储、电…

【产品经理】发票系统简述

一、发票类型 增值税电子普通发票&#xff1a;简称电票 增值税普通发票和增值税专用发票&#xff0c;简称&#xff1a;纸票 蓝票&#xff1a;开票金额为正值的发票。红票&#xff1a;发票金额为负值的发票。 注&#xff1a;专票电子化系统国家目前在推&#xff0c;后续有更新…