分治策略求最大子数组

分治法求解最大子数组 本文基于算法导论中分治法求解最大子数组的思想,用C语言进行了算法实现。 阅读详情

《算法导论》第四章
分治法所能解决的问题一般具有以下几个特征:
1. 该问题的规模缩小到一定的程度就可以容易地解决;
2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3. 利用该问题分解出的子问题的解可以合并为该问题的解;
4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

使用分治策略有两个关键点:一是把分解成子问题,二是找准终止条件。

list1 = [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7]
count = len(list1)

def findMaxCrossingSubarray(arr, low, mid, high):
    leftSum = -1000
    tmpSum = 0
    leftIndex = mid

    for i in range(mid, low - 1, -1):
        tmpSum = tmpSum + arr[i]
        if tmpSum > leftSum:
            leftSum = tmpSum
            leftIndex = i

    rightSum = -1000
    tmpSum = 0
    rightIndex = mid + 1

    for i in range(mid + 1, high):
        tmpSum = tmpSum + arr[i]
        if tmpSum > rightSum:
            rightSum = tmpSum
            rightIndex = i
    return leftIndex, rightIndex, leftSum + rightSum

def findMaximumSubarray(arr, low, high):
    if low == high:
        return [low, high, arr[low]]

    mid = (int)((low + high) / 2)

    leftLow, leftHigh, leftSum = findMaximumSubarray(arr, low, mid)
    rightLow, rightHigh, rightSum = findMaximumSubarray(arr, mid + 1, high)
    crossingLow, crossingHigh, crossingSum = findMaxCrossingSubarray(arr, low, mid, high)

    if leftSum > rightSum and leftSum > crossingSum:
        return leftLow, leftHigh, leftSum
    elif rightSum > leftSum and rightSum > crossingSum:
        return rightLow, rightHigh, rightSum
    else:
        return crossingLow, crossingHigh, crossingSum

print(findMaximumSubarray(list1, 0, count - 1))

作者:李印臣,2005年毕业于山东师范大学计算机系,曾三次患有精神分裂症。康复后,做了近四年的软件工程师,然后做了两年精神分裂症领域的公益,现重新回到软件行业,一切从头再开始!
愿这个博客见证我的成长与进步。

c语言实现分治算法求解最大子数组 自己写的分治算法,也包括了暴力求解的部分,并比较两者的运行时间,输出最大子数组的起始位置 立即下载

相关推荐

CorelDRAW 2019安装指南:从下载到激活的完整步骤

本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。

weixin_29213827的博客 833

用递归实现插入排序

list1 = [10,8,7,9,6,5,2,4,3,1]; count = len(list1);def recursiveInsert(list0, len0): if len0 == 1: return recursiveInsert(list0, len0 - 1); index = len0 - 1; tmp = list0[index];

李印臣,从头再来又何妨! 3466

Avalonia跨平台开发入门:从安装到运行第一个应用(Windows/Linux/macOS)

本文详细介绍了Avalonia跨平台开发的基础入门指南,从安装到运行第一个应用的全过程。涵盖Windows、Linux和macOS三大平台的环境配置,特别推荐使用Visual Studio进行开发,并提供常见问题的解决方案,帮助开发者快速上手Avalonia框架。

weixin_28688385的博客 542

分治法解决最大子数组(Maximum subarray)问题

目录 1最大子数组和定义 2 最大子数组和的算法 3 最大子数组和算法伪代码 4 算法性能分析 5 分治问题的特点 1最大子数组和定义 最大子数组是求在数组A中找到一个连续非空且子数组元素具有最大和值的问题。 举个例子,如图所示,有一个数组,其中包含有正数和负数(如果一个数组中只有正数或者只有负数,那么其最大子数组和没有意义),那么其中用红线圈出来的就是其最大子数组,其最大子数...

学如不及,犹恐失之 4968

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2084

RK3568点不亮EK79007 MIPI屏?别急着改时序,先检查这个初始化命令

本文深入解析RK3568开发板调试EK79007 MIPI屏幕时初始化命令的关键作用,揭示80%的时序问题实际源于命令配置不当。通过典型故障案例,详细拆解初始化命令的调试方法、寄存器映射及系统化排查流程,帮助工程师快速定位和解决屏幕点亮问题。

weixin_33657090的博客 349

算法导论----最大子数组问题(分治算法)

摘自算法导论,加上自己的一点理解

m0_74142238的博客 2353

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 715

分治法求最大子数组

求最大子数组: 一给定好的数组,在不改变起排列顺序的情况下,求非空的求和最大的子数组。 思路:把原数组分成两半,分别求两半的最大子数组,再求这两半合并后从中间往两边的最大子数组。然后把这三部分比较,得到整个的最大子数组。 例子:先分,如图 再治: 上代码: #include<iostream> using namespace std; #include<limits.h> int max(int a, int b, int c) { return a > (b >

drdtddtrdr的博客 1702

保姆级教程:用Labelme标注车辆关键点,并一键转成YOLOv8-pose训练格式

本文提供了一份详细的车辆底盘关键点标注教程,从使用Labelme进行标注到一键转换为YOLOv8-pose训练格式的全流程指南。特别针对工业检测和自动驾驶场景,分享了标注规范、格式转换脚本及常见问题解决方案,帮助开发者高效准备训练数据并优化模型性能。

weixin_27419879的博客 307

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1500

分治策略之求连续最大和子数组

有这么一个题目: 求某个数组中连续的最大和的子数组,例如输入为:{1, -1, -4, 3, 1, 4, 5, -10, 20},那么要求输出为:{3, 1, 4, 5, -10, 20}。 首先我们使用最暴力的手段来解决,即双重循环遍历: public static void baoliManage(int[] nums) { int ma...

dianpancang9663的博客 253

【Bug已解决】Claude Code Auto-update failed 自动更新失败的解决方案

方案适用场景推荐指数清理残留重新安装已经损坏,需要快速恢复可用⭐⭐⭐⭐⭐修复目录权限权限不足导致更新反复失败⭐⭐⭐⭐⭐关闭自动更新网络/安全软件环境不稳定⭐⭐⭐切换原生安装方式想从根源规避 npm 更新问题⭐⭐⭐⭐自检修复脚本团队/服务器环境需要自动化恢复⭐⭐⭐报错的本质是自动更新过程中的文件替换操作因权限不足或被中断而处于不完整状态,而不是 Claude Code 本身的功能缺陷。遇到问题先清理残留文件再重新安装,不要在损坏状态上反复尝试修复;

一键难忘的博客 1万+

分治策略(求最大子数组和)

分治策略

17的博客 393

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

pscad IEEE标准系统搭建说明

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

【分治策略】用Java求最大子数组和

实现代码 public class FindMaxSubArray { public static void main(String[] args) { int result = findMaxArray(new int[] {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}, 0, 15); System.out.println(result); } //子数组跨越了中点 public static

weixin_44764207的博客 281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用分治策略求最大子数组

int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7 , 12, -5, -22 , 15, -4 , 7};

风不吹雨下的专栏 718

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 算法之分治策略求最大子数组问题

    首先,我们可以使用暴力方式求解最大子数组,编码思路:第一层循环遍历该数组,然后使用第二层循环寻找子数组,用第一层循环的 i 变量来记录寻找位置,然后向后依次遍历,进行累加计算,判断出最大值;java代码如下:    //暴力方式求解(遍历)    static int findMaxArray(int[] arr, int lenth) { int maxSum = 0; int su...

fengwuJ的博客 812

使用分治策略实现求最大子数组——Java版

给定一个数组,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 public class 最大子数组 { public static void main(String[] args) { ...

weixin_30621919的博客 196

【算法导论】分治策略求最大子数组问题分析、伪代码及C代码实现

最大子数组问题分析 寻找A的和最大的非空连续子数组,我们称这样的连续子数组为最大子数组。如下所示,A[1..16]的最大子数组为A[8..11],其和为43,是A的所有子数组中和最大的。 注意: 只有当数组中包含负数时,最大子数组问题才有意义。如果所有数组元素都是非负数,子数组问题没有任何难度,因为整个数组的和肯定最大。 使用分治策略的求解方法 我们要寻找子数组A[low..high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规模尽量相等的子数组...

wgl307293845的博客 2553

算法笔记四:使用分治策略求最大子数组算法

算法思想: //求最大子数组问题:给定一个数组,求出值相加起来的最大的子数组 //当数组中全部是正数时,数组本身就是其最大子数组 //采取分治策略来解答,将数组一分为二,那么,答案要么位于左侧,要么位于右侧,要么横跨分割点。 //横跨分割点时,其解答的代价是线性的 //左侧和右侧又可以采用递归方式继续求解 //不难得出,代价为O(NlgN) //跟传统的依次求每种可能的代价O(n^2

臭脚大仙 871

算法导论-----分治策略----------求最大子数组

问题描述: 在一个包含负数的数组中,找出和最大的子数组。 算法描述: 使用分治策略,将数组划分为两个规模尽量相等的子数组。也就是找到数组的中央位置mid。然后考虑求解A[low..mid],A[mid+1,high]。 最大子数组必然为下列三种情况之一: 1.位于A[low..mid],完全位于左数组 2.位于A[mid+1..high],完全位于右数组 3.位于A[i..m

happyAnger6的专栏 1512

分治策略,求最大子数组的和golang实现

package main import ( "fmt" ) func main() { a := []int{9, 6, -7, 1, 8, -20, 5, 3, 4, 0, 2} l, r, s := FindMaxSubArray(a, 0, 10) fmt.Println("max sum:", s) fmt.Println("l,r loc:", l, ...

lancyxd的博客 333

算法导论-求最大子数组-分治策略 c++版本

#include "stdafx.h" #include #include #include #include using namespace std; typedef struct Max_info { int low; int high; int max_sum; }; //0 //7 15 int a[20] = {13,-3,-25,

copbint 470

[算法导论-分治策略]求最大子数组之各种解法及源代码实现

/* 问题: 已知数组 A = {2,4,-1,-5,3,-4,2,-6,4,1,2,2,4,-2,2}; 求: 最小子数组和 分析: 一:  分治法:把问题分解成若干个简单易解的小问题,最后再把小问题归并起来,找到我们原来要解决问题的解 本问题中,我们把问题分解成两个规模尽量相等的子问题。 A[low...mid] 和 A[mid+1...high] 那最小的子数组

Ubuntu装机必备 750

分治策略--最大子数组问题

在分治策略中,我们递归地求解一个问题,在每层递归中应用如下三个步骤: 分解步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更少。 解决步骤递归地求解出子问题。如果子问题的规模足够小,则停止递归,直接求解。 合并步骤将子问题的解组合成原问题的解。 最大子数组问题 问题描述:某家公司的股票价格是不稳定的,你可以在某个时刻买进一股该公司的股票,并在之后将其卖出,买进卖出都是在当天交易结束后进行。你知道股票的将来价格。你的目标是最大化收益。即“低价买进,高价卖出”。 股票价...

qq_38619449的博客 720
上一篇: 确定n个元素的任何排序中逆序对数量
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值