分治策略求最大子数组

分治法求解最大子数组 本文基于算法导论中分治法求解最大子数组的思想,用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语言实现分治算法求解最大子数组 自己写的分治算法,也包括了暴力求解的部分,并比较两者的运行时间,输出最大子数组的起始位置 立即下载

相关推荐

从理论到代码:手把手教你用Matlab复现MMC的HSS阻抗模型(附避坑指南)

本文详细介绍了如何使用Matlab复现MMC的HSS阻抗模型,涵盖谐波状态空间(HSS)理论、代码实现步骤及常见问题解决方案。通过谐波线性化和序阻抗建模技术,帮助工程师准确分析MMC的阻抗特性,并提供避坑指南以解决矩阵维度错误、收敛性问题和频域转换陷阱等难点。

weixin_42561040的博客 357

用递归实现插入排序

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

soul聊天协议逆向

通过观察上面的CFG发现,该混淆符合以下逻辑,整体思路就是先查找主分发器,一般被引用次数最多的那个块就是主分发器,引用主分发器的块大概率是真实块,再使用unicorn模拟执行,遍历每一个分支,记录每一个块,如果某一个块是上次记录的块则也为真实块,无后继的块则为retn块,剩下的就是无用块。通过Frida Hook libc.so后发现,聊天协议走的是JAVA层的socket,然后Hook JAVA层相关函数得到如下调用堆栈。里面调用的函数不是很多,所以。不行不行,革命要彻底!

2503_90751789的博客 3209

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

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

学如不及,犹恐失之 4968

Qt C++:跨平台开发利器

摘要: Qt C++是基于C++的跨平台开发框架,通过元对象系统、信号槽机制及模块化架构实现"一次编写,多端部署"。核心特性包括: 跨平台能力:覆盖桌面(Windows/macOS/Linux)、移动端(iOS/Android)、嵌入式及WebAssembly; 信号与槽:替代传统回调,实现对象间高效通信; UI组件库:200+预制组件支持QSS样式定制; 工具链:Qt Creator集成开发环境提供可视化设计、调试及多平台编译。 广泛应用于工业控制、车载系统、医疗设备及跨平台应用开发,

2202_75382767的博客 1682

基于STM32与ESP8266的MQTT协议实现阿里云物联网平台远程LED控制

本文详细介绍了如何利用STM32单片机与ESP8266 Wi-Fi模块,通过MQTT协议连接阿里云物联网平台,实现远程控制LED灯的完整物联网项目。内容涵盖硬件连接、阿里云平台配置、MQTT协议与AT指令解析、STM32代码实战以及数据解析与调试技巧,为嵌入式开发者提供了一个清晰、实用的物联网入门实践指南。

svm4gardener的博客 791

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

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

m0_74142238的博客 2353

麒麟系统grub被锁怎么办?双密码遗忘救援指南(实测V10 SP3版本)

本文详细介绍了麒麟系统V10 SP3版本在GRUB和root密码双遗忘情况下的救援指南。通过ISO镜像进入救援模式,结合单用户模式操作,实现密码重置与系统权限恢复,特别适用于等保合规环境。

384

分治法求最大子数组

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

drdtddtrdr的博客 1702

自动化Google Chrome的强大工具:chromedriver下载、安装、简单使用

本文介绍了 ChromeDriver 的基本概念和安装配置方法,重点讲解了如何通过 Selenium 实现 Chrome 浏览器的自动化测试。内容涵盖了 ChromeDriver 下载、版本匹配、依赖引入和简单的自动化测试脚本示例,帮助读者快速上手并避免常见问题。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 88万+

NSIS教程(2): 传统用户界面(Classic UI)

NSIS教程: 《NSIS用户手册 中文版》 《NSIS图文教程集锦 - 轻狂志》 本文以一个完整的、传统界面的网易云音乐安装包的脚本为示例,来介绍NSIS传统用户界面的开发流程。 NSIS脚本 # 单行注释用井号"#"或分号";",跨行注释用可以用C/C++中注释语法。 # 使用!define定义一些常量(如安装包的版本号等) # 对常量或变量的引用可以使用如${PROD

while(1) { smile(); } 8万+

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

有这么一个题目: 求某个数组中连续的最大和的子数组,例如输入为:{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

CANoe-vTESTstudio之Test Diagram编辑器

总之,CANoe-vTESTstudio的Test Diagram编辑器提供了一个直观且强大的工具,用于创建和管理测试用例。通过图形化的界面和丰富的功能,测试工程师可以更轻松地编写复杂的测试脚本,并有效地进行测试开发。在上面的示例中,我们创建了一个名为"MyTestCase"的测试用例,并定义了两个测试步骤"Step1"和"Step2"。在上面的示例中,我们在执行"Step1"之后使用条件语句来确定是否执行"Step2"。在每次迭代中,我们创建一个新的测试步骤,并根据迭代次数动态生成相应的日志和验证消息。

TcData的博客 248

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

分治策略

17的博客 393

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

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

【分治策略】用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

温度PID控制PLC程序

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

用分治策略求最大子数组

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

风不吹雨下的专栏 718

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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、付费专栏及课程。

余额充值