算法分析02--分治法

news2024/12/26 21:10:39

3.分治法

3.1递归

递归是指子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己, 是一种描述问题和解决问题的常用方法。使用递归技术往往使函数的定义和算法的描述简洁且易千理解。
递归有两个基本要素:边界条件,即确定递归到何时终止,也称为递归出口;递归模式,即大问题是如何分解为小问题的,也称为递归体。
阶乘函数:在这里插入图片描述

阶乘函数的自变量n的定义域是非负整数。递归式的第一式给出了这个函数的一个初始值,是递归的边界条件。递归式的第二式是用较小自变量的函数值来表示较大自变量的函数值的方式来定义n的阶乘, 是递归体。

3.2分治法的基本思想

分治与递归就像一对李生兄弟, 经常同时应用于算法设计之中, 并由此产生许多高效的算法。分治法的设计思想是将一个难以直接解决的大问题分解成一些规模较小的相同问题, 以便各个击破, 分而治之。如果规模为n的问题可分解成K个子问题, 1<k≤n, 这些子问题互相独立且与原问题相同。分治法产生的子问题往往是原问题的较小模式, 这就为递归技术提供了方便。
一般来说, 分治算法在每一层递归上都有3个步骤。
(1) 分解。将原问题分解成一系列子问题。
(2) 求解。递归地求解各子问题。若子问题足够小, 则直接求解。
(3) 合并。将子问题的解合并成原问题的解。

3.3 分治法的典型实例

3.3.1 归并排序算法

归并排序是成功应用分治法的一个完美的例子, 其基本思想是将待排序元素分成大小大致相同的两个子序列,分别对这两个子序列进行排序, 最终将排好序的子序列合并为所要求的序列。归并排序算法完全依照上述分治算法的3个步骤进行。
(1) 分解。将n个元素分成各含n/2个元素的子序列。
(2) 求解。用归并排序对两个子序列递归地排序。
(3) 合并。合并两个已经排好序的子序列以得到排序结果。

Java代码如下

public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {54,87,56,36,12,7,35,27,48,98,67,72};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    static void sort(int[] arr) {
        sort(0, arr.length - 1, arr);
    }

    static void sort(int start, int end, int[] arr) {
        //递归终止条件
        if (start < end) {
            int mid = (start + end) / 2;
            sort(start, mid, arr);
            sort(mid + 1, end, arr);
            merge(start, mid, end, arr);
        } else {
            return; 
        }
    }

    static void merge(int start, int mid, int end, int[] arr) {
        int[] temp = new int[end - start + 1];
        int k = 0;
        int i = start;
        int j = mid + 1;
        while (i <= mid && j <= end) {
            if (arr[i] < arr[j]) {
                temp[k++] = arr[i++];
            }else {
                temp[k++] = arr[j++];
            }
        }
        //当i或j指针超出范围时
        while(i<=mid){
            temp[k++] = arr[i++];
        }
        while (j<=end){
            temp[k++] = arr[j++];
        }
        System.arraycopy(temp, 0, arr, start, end - start + 1);
    }
}

Merge显然可在O(n) 时间内完成, 因此归并排序算法对n个元素进行排序所需的计算时间T(n)满足:在这里插入图片描述用主方法解这个递归式得:T(n)=O(nlogn)

3.3.2 最大子段和问题

给定由n个整数(可能有负整数)组成的序列a1,a2,…,an,求该序列子段和的最大值。当序列中所有整数均为负整数时,其最大子段和为0。

java代码:

public class MaxSubSum {
    public static void main(String[] args) {
        int[] arr =  { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
        System.out.println(maxSub(arr));
    }
    public static int maxSub(int[] arr) {
        return maxSub(arr, 0, arr.length - 1);
    }

    public static int maxSub(int[] arr, int left, int right) {
        if (left == right) {
            return arr[left];
        }
        int mid = left + (right - left) / 2 ;
        int leftMax = maxSub(arr, left, mid);
        int rightMax = maxSub(arr, mid + 1, right);
        int crossMax = maxCross(arr, left, right, mid);
        int max = Math.max(Math.max(leftMax, rightMax), crossMax);
        if(max >0){
            return max;
        }else {
            return 0;
        }
    }

    public static int maxCross(int[] arr, int left, int right, int mid) {
        int leftMax = Integer.MIN_VALUE;
        int rightMax = Integer.MIN_VALUE;
        int sum = 0;
        for (int i = mid; i >= left; i--) {
            sum += arr[i];
            leftMax = Math.max(leftMax, sum);
        }
        sum = 0;
        for (int i = mid + 1; i <= right; i++) {
            sum += arr[i];
            rightMax = Math.max(rightMax, sum);
        }
        return leftMax + rightMax;
    }
}

分析时间复杂度:在这里插入图片描述

解此递归式可知T(n)=O(nlgn)

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

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

相关文章

告别固定字体大小:CSS使用相对单位提升网页可访问性和兼容性

在 Web 开发领域中&#xff0c;有很多误解流传&#xff0c;即使它们被反驳了很多次也仍然存在。"外部链接应该总是在新标签页中打开" 就是一个很好的例子。CSS Tricks 在将近十年前就对此进行了详细的解释&#xff08;简而言之&#xff1a;大多数情况下是错误的&…

沃尔玛、亚马逊跨境境电商如何实现自养账号采退、海淘及测评的

今天曹哥还是针对下亚马逊、沃尔玛跨境平台如何实现自己养买家号可以给自己采购、海淘及测评等技术问题 首先你要有一个稳定的环境方案&#xff0c;这个是做自养号采购、海淘及测评的基础。环境有很多&#xff0c;从早期的虚拟机&#xff0c;模拟机&#xff0c;云手机&#xf…

MATLAB | 绘图复刻(十) | 旋转45度的相关系数热图绘制

我们在论文里经常能见到这样三角形的相关性热图&#xff0c;这样的热图绘制出来会更节省空间&#xff1a; 这期就教大家如何绘制三角形的热图&#xff0c;绘制效果如下&#xff1a; 以下是教程部分&#xff1a; 0 数据准备 这里随便生成了一组数据&#xff0c;计算了相关系数&…

C++——vector迭代器失效与深浅拷贝问题

目录 1. vector迭代器失效问题 1.1 insert迭代器失效 1.1.1 扩容导致野指针 1.1.2 意义变了 1.1.3 官方库windows下VS和Linux下对insert迭代器失效的处理 1.2 erase迭代器失效 1.2.1 失效原因分析 1.2.2 官方库windows下VS和Linux下对erase迭代器失效的处理 1.2.3 测试…

0基础学习VR全景平台篇第46篇:底部菜单- 【开场地图】与【高清矩阵】的对比

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 这期 &#xff0c;我们将为大家讲解蛙色VR平台-【开场地图】与【高清矩阵】功能的区别 功能位置示意 一、功能具体应用 开场地图分为两种&#xff0c;分别是高德地图和手绘地图。 高德地图点位目前系统…

【Linux】MySQL 存储引擎

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MySQL 存储引擎 MyISAM 表支持 3 种不同的存储格式常用存储引擎&#xff1a;InnoDB、MyISAM查看系统支持的存储引擎查看表使用的存储引擎修改存储引擎死锁如何尽可能避免死锁…

每日学术速递6.7

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.The ObjectFolder Benchmark: Multisensory Learning with Neural and Real Objects(CVPR 2023) 标题&#xff1a;ObjectFolder 基准测试&#xff1a;使用神经和真实对象进行多感官…

计算机网络管理- SNMP协议报文和报文格式分析,SNMP PDU分析

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

【玩转Linux操作】Linux服务管理

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;服务(service)管理⭐service管理指令 &…

《网络安全0-100》网络安全技术

网络安全技术 防火墙 入侵检测系统 防火墙(Firewall)是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护网络免受未经授权的访问和攻击。防火墙通过过滤网络流量&#xff0c;阻止潜在的攻击流量进入网络。它可以实现基于端口、协议、IP地址和应用程序的…

chatgpt赋能python:Python指定日期的后一天:介绍与解析

Python指定日期的后一天&#xff1a;介绍与解析 Python是广泛使用的编程语言之一&#xff0c;在数据科学、机器学习、人工智能和网络开发等众多领域都有重要的应用。本文将要讨论的问题是&#xff1a;如何使用Python来获取一个指定日期的后一天&#xff1f;这个问题看似简单&a…

QT找不到python27.dll或python36.dll解决办法

缺少python27.dll 点开QT时出现上述问题&#xff0c;一种方法就是找python27.dll文件进行替换。 1.进入网站下载相关文件 windll.com/dll/python-… 2.之后将文件移动到下面的路径里&#xff0c;C:\Windows\SysWOW64\ 3.然后重启 试了4种方案&#xff0c;把32位放在System32…

【操作系统】哲学界进餐问题实现

目录 实验原理&#xff1a; 实验目的&#xff1a; 实验数据及结果分析&#xff1a; 实验原理&#xff1a; 哲学家进餐问题可以通过限制同时进餐人数为4解决&#xff0c;为此需要设置一个值为4的互斥信号量sem_eaters,并且每根筷子只能同时由一个人使用&#xff0c;需要设置…

kafka的初步认识

什么是Kafka&#xff1f; Kafka的增长很快。财富500强企业中超过三分之一使用卡夫卡。这些公司包括十大旅游公司&#xff0c;十大银行中的七家&#xff0c;十大保险公司中的八家&#xff0c;十大电信公司中的九家&#xff0c;等等。LinkedIn&#xff0c;微软&#xff08;Micro…

【CV 向】如何打造一个“数串串神器“

导言 最近&#xff0c;我看到了这样一个视频&#xff0c;觉得很有意思&#xff0c;就随手保存下来了。&#x1f601;&#x1f601;&#x1f601; 之前吃串串火锅&#xff0c;老板数竹签不是称重就是用手慢慢数&#xff0c;但是称重似乎总是得不到正确的竹签数目&#xff0c;而…

C++技能系列 ( 7 ) - 右值引用、移动语意、完美转发

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 右值引用、移动语意、完美转发 1、右值引用2、完美转发 1、右值引用 右值引用&#xff08;rvalue refe…

Redux的纯函数、中间件

当我们的应用随着业务的发展&#xff0c;变得越来越复杂的时候&#xff0c;组件之间的状态也是越来越复杂。 reducer函数 之前说过redux中的action&#xff0c;是用来描述一种变化。但是完成变化并且生辰新的数据数据状态的是reducer方法。 reducer方法&#xff0c;必须是纯…

SQL注入攻击与防护

目录 一、SQL注入攻击概述 1.1 SQL注入概念 1.1.1 标准查询过程 1.1.2 SQL注入定义 1.2 SQL注入根本原因 1.3 SQL注入条件 1.4 SQL注入防范 1.4.1 根本原因&#xff1a;过滤不严 1.4.2 安全设计原则&#xff1a;数据与代码分离 1.5 SQL注入流程 1.6 SQL注入分类 1.…

vue3+vite+ts项目配置开发环境和生产环境 打包命令配置

开发环境和生产环境的配置和打包方式有所不同&#xff0c;下面是基于vue3vitets项目的开发环境和生产环境配置及打包方式的详细说明。 开发环境配置 开发环境的配置主要是为了方便开发者进行调试和测试&#xff0c;以下是开发环境的配置步骤&#xff1a; 1.1 安装依赖 首先…

DAY27:回溯算法(二)组合问题及其优化

文章目录 77.组合&#xff08;一定要注意逻辑问题&#xff09;思路for循环嵌套的情况回溯算法模拟for循环K层嵌套 回溯法步骤伪代码完整版debug测试逻辑问题&#xff1a;没有输出逻辑问题&#xff1a;为什么是递归传入i1而不是startIndex1&#xff1f;重要&#xff1a;为什么会…