分治策略求最大子数组

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

相关推荐

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 387

用递归实现插入排序

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

不只是抓取:用五指灵巧手(ROH-A001/RH56)玩转ROS2下的力控与混合控制

本文深入探讨了在ROS2环境下使用五指灵巧手(ROH-A001/RH56)实现力控与混合控制的实战技巧。从硬件通信协议解析到ROS2节点开发,详细介绍了力感知架构、实时数据处理和混合控制策略,帮助开发者在Ubuntu系统中高效实现精密操作。通过鸡蛋抓取等实例,展示了力控技术在机器人灵巧操作中的关键作用。

weixin_28221501的博客 286

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

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

学如不及,犹恐失之 4968

CGNS快速入门到实战(一):CGNS静态链接库编译

近期,由于需要将CGNS格式加入到教研组自编CFD求解器DUBHE中,所以本人展开了对于CGNS的学习。CGNS快速入门到实战这一系列分成三篇文章展开叙述,具体有:(一)CGNS静态链接库编译;(二)VS配置调用CGNS静态链接库编写;(三)CGNS文件及案例展示。本篇文章重点讲述CGNS静态链接库编译。

ahang_99的博客 3819

WebRTC TURN协议初识及turnserver实践

但是TURN协议对服务器有很高的依赖,服务器在带宽和集群上有很大的压力,所以TURN协议通常是当作ICE协议中的一部分来使用。ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number),每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。该relay地址是个公网地址,可以看作是客户端A在公网上的一个代理,任何想要联系A的客户端,只要将数据发送到A的relay地址就可以了。

yinshipin007的博客 566

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

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

m0_74142238的博客 2353

7.91版本unidbg调用方式

【代码】xhs最新7.91版本unidbg调用方式。

Codeooo 博客 1107

分治法求最大子数组

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

drdtddtrdr的博客 1702

SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)

SAP FICO CBS接口-银企直连付款平台功能开发说明书(包括测试样例、FS)

我好像病了的博客 2448

【系统架构设计师】二十六、论文写作要点

论文写作概述:时间所需120分钟;题目可四选一,必有一题考察软件架构,总有一款适合你;考察形式是机试(开心,再也不用担心字丑了),约2500字。

帅次的博客 4598

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

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

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2739

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

分治策略

17的博客 393

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

用分治策略求最大子数组

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

风不吹雨下的专栏 718

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

余额充值