最大子数组问题和kadane算法

最大子数组问题及其历史

20世纪70年代末,瑞典数学家ulf grenander一直在讨论一个问题:如何比暴力破解更有效地分析二维图像数据数组?那时的计算机速度很慢,图片相对于 ram 来说也很大。更糟糕的是,在最坏的情况下,暴力破解需要 o(n^6) 时间(六次时间复杂度)。

首先,grenandier 简化了问题:给定一个一维数字数组,如何最有效地找到总和最大的连续子数组?

最大子数组问题和kadane算法

蛮力:一种具有立方时间复杂度的简单方法

蛮力,分析一维数组的时间是分析二维数组的一半,所以 o(n^3) 来检查每个可能的组合(立方时间复杂度)。

def max_subarray_brute_force(arr):    max_sum = arr[0] # assumes arr has a length    # iterate over all possible subarrays    for i in range(len(arr)):        for j in range(i, len(arr)):            current_sum = 0            # sum the elements of the subarray arr[i:j+1]            for k in range(i, j + 1):                current_sum += arr[k]            # update max_sum if the current sum is greater            max_sum = max(max_sum, current_sum)    return max_sumprint(max_subarray_brute_force([-2, -3, 4, -1, -2, 1, 5, -3]), "== 7")

grenander 的 o(n²) 优化:向前迈出了一步

grenander 将其改进为 o(n^2) 解决方案。我在研究中找不到他的代码,但我的猜测是他只是摆脱了最内层的循环,该循环将两个索引之间的所有数字相加。相反,我们可以在迭代子数组时保留运行总和,从而将循环次数从三个减少到两个。

def max_subarray_optimized(arr):    max_sum = arr[0]  # assumes arr has a length    # iterate over all possible starting points of the subarray    for i in range(len(arr)):        current_sum = 0        # sum the elements of the subarray starting from arr[i]        for j in range(i, len(arr)):            current_sum += arr[j]            # update max_sum if the current sum is greater            max_sum = max(max_sum, current_sum)    return max_sum

shamos 的分而治之:将问题分解为 o(n log n)

grenander 向计算机科学家 michael shamos 展示了这个问题。 shamos思考了一晚上,想出了一个分而治之的方法,o(n log n)。

真是太聪明了。想法是将数组分成两半,然后递归地找到每一半的最大子数组和以及穿过中点的子数组。

def max_crossing_sum(arr, left, mid, right):    # left of mid    left_sum = float('-inf')    current_sum = 0    for i in range(mid, left - 1, -1):        current_sum += arr[i]        left_sum = max(left_sum, current_sum)    # right of mid    right_sum = float('inf')    current_sum = 0    for i in range(mid + 1, right + 1):        current_sum += arr[i]        right_sum = max(right_sum, current_sum)    # sum of elements on the left and right of mid, which is the maximum sum that crosses the midpoint    return left_sum + right_sumdef max_subarray_divide_and_conquer(arr, left, right):    # base case: only one element    if left == right:        return arr[left]    # find the midpoint    mid = (left + right) // 2    # recursively find the maximum subarray sum for the left and right halves    left_sum = max_subarray_divide_and_conquer(arr, left, mid)    right_sum = max_subarray_divide_and_conquer(arr, mid + 1, right)    cross_sum = max_crossing_sum(arr, left, mid, right)    # return the maximum of the three possible cases    return max(left_sum, right_sum, cross_sum)def max_subarray(arr):    return max_subarray_divide_and_conquer(arr, 0, len(arr) - 1)print(max_subarray([-2, -3, 4, -1, -2, 1, 5, -3]), "== 7")

这将时间复杂度降低到 o(nlogn) 时间,因为首先将数组分为两半 (o(logn)),然后找到最大交叉子数组需要 o(n)

kadane 算法:优雅的 o(n) 解决方案

统计学家 jay kadane 看了代码,立即发现 shamos 的解决方案未能使用邻接约束作为解决方案的一部分。

这是他意识到的

-如果数组只有负数,那么答案将始终是数组中最大的数字,假设我们不允许空子数组。

-如果数组只有正数,答案总是将整个数组相加。

-如果你有一个同时包含正数和负数的数组,那么你可以一步步遍历该数组。如果在任何时候您正在查看的数字大于其之前的所有数字的总和,则解决方案不能包含任何先前的数字。因此,您从当前数字开始一个新的总和,同时跟踪迄今为止遇到的最大总和。

maxSubArray(nums):    # avoiding type errors or index out of bounds errors    if nums is None or len(nums) == 0:        return 0    max_sum = nums[0]  # max sum can't be smaller than any given element    curr_sum = 0    # Kadane's algorithm    for num in nums:        curr_sum = max(num, curr_sum + num)        max_sum = max(curr_sum, max_sum)    return max_sum

我喜欢这个算法的原因是它可以应用于许多其他问题。尝试调整它来解决这些 leetcode 问题:

一和零
圆形子数组的最大和
最小子数组总和
最大升序子数组和
最大产品子数组
连续子数组和
最大交替和子数组(高级)
矩形的最大和不大于 k

以上就是最大子数组问题和kadane算法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
避免条件语句的智慧
上一篇 2025年12月13日 12:28:17
代码气味 – 蹲着
下一篇 2025年12月13日 12:28:33

相关推荐

  • MySQL安装需要哪些硬件配置要求?

    MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?

    mysql的硬件配置需根据应用场景和负载决定,生产环境应重点考虑磁盘i/o、内存、cpu和网络。1. cpu:oltp场景多核心更重要,olap则更依赖主频和缓存;2. 内存:buffer pool越大越好,但需避免过度分配导致swap使用;3. 磁盘i/o:ssd是标配,nvme ssd和raid…

    2026年9月23日 用户投稿
    100
  • PHP教程:解析和访问包含JSON字符串的数组值

    本教程旨在指导读者如何高效地从PHP数组中提取数据,特别是当数组的每个元素都是一个JSON格式的字符串时。文章将详细介绍如何利用json_decode()函数将JSON字符串转换为PHP数组,并通过示例代码演示循环遍历和直接访问特定字段的方法,帮助您轻松处理此类复杂数据结构。 理解数据结构 在php…

    2026年9月23日
    000
  • 硬核推理游戏《机密谋杀案中案》参加Steam新品节 试玩版上线

    硬核推理游戏《机密谋杀案中案》参加Steam新品节 试玩版上线硬核推理游戏《机密谋杀案中案》参加Steam新品节 试玩版上线硬核推理游戏《机密谋杀案中案》参加Steam新品节 试玩版上线硬核推理游戏《机密谋杀案中案》参加Steam新品节 试玩版上线

    如果你已经顺利解开《奥伯拉丁的回归》或《金偶像迷案》中的重重谜团,那么接下来的挑战将更加扑朔迷离!好莱坞正陷入一场震惊全城的连环谋杀风暴!你将化身为一名敏锐过人的侦探,运用你的观察力与推理能力:勘察犯罪现场,搜集关键证据,抽丝剥茧地还原真相。幕后黑手究竟是谁?他又为何精心策划这一系列隐秘的杀局? 这…

    2026年9月23日 用户投稿
    100
  • 尼康Zf对决富士X-T5:复古微单的情怀与实力,谁的直出色彩更能激发你的创作欲望?

    尼康Zf与富士X-T5复古微单对比:Zf主打全画幅高画质、机械操控与可定制色彩,适合追求专业感和个性化调色的用户;X-T5凭借APS-C便携机身与经典胶片模拟直出色彩,更契合注重效率与风格化表达的创作者。 选择复古微单,往往不只是选一台相机,更是选择一种创作态度和视觉语言。尼康Zf和富士X-T5都拥…

    2026年9月23日
    000
  • 如何使用Webman框架实现搜索引擎优化和网站推广?

    如何使用 webman 框架实现搜索引擎优化和网站推广? 搜索引擎优化(SEO)和网站推广是对于一个网站来说非常重要的部分。通过优化网站内容和结构,使其更容易被搜索引擎收录和排名,可以提高网站的曝光度和流量。而 Webman 是一个强大的 PHP 框架,可以帮助我们更方便地实现这些目标。 对网页标题…

    用户投稿 2026年9月23日
    200
  • 如何在Procreate中使用AI导出图片?保存高质量图像的正确方法

    Procreate无内置AI导出功能,但可通过导出高质量图像(如PSD、TIFF、PNG)供外部AI工具优化;选择格式需根据用途,PSD适合协作,TIFF用于印刷,PNG支持透明背景,JPEG慎用以避免压缩损失;画布应高DPI创建,色彩配置优先sRGB,印刷时后期转CMYK更精准。 ☞☞☞AI 智能…

    2026年9月23日
    100
  • 视频号新号直播扶持几天?视频号怎么做才有流量

    近年来,随着视频号平台的不断壮大,越来越多的人开始将目光投向这一新兴领域。为了吸引优质创作者加入,视频号推出了针对新注册账号的直播扶持计划。本文将带您深入了解这项扶持政策,并提供实用建议,帮助您快速提升影响力。 一、视频号直播扶持政策详解 1. 政策背景 该扶持政策是视频号顺应国家推动数字经济发展、…

    2026年9月23日
    300
  • chrome浏览器最新官方网址下载 chrome浏览器官网链接快速直达

    Chrome浏览器最新官方下载网址是https://www.google.cn/chrome/,提供安卓版和手机版下载,界面简洁,支持书签同步、网页翻译、点按搜索等功能,确保快速安全的浏览体验。 chrome浏览器最新官方网址下载在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来chrome…

    2026年9月23日
    200
  • safari浏览器与iCloud钥匙串同步失败如何解决_safari浏览器钥匙串同步失败解决方法

    首先检查iCloud钥匙串是否在所有设备上开启且使用同一Apple ID,确认已启用双重认证;接着重启设备并重新开启钥匙串功能以修复临时故障;然后确保网络稳定并查看Apple服务器状态正常;最后通过退出并重新登录Apple ID重建同步授权,恢复密码自动填充与跨设备同步。 如果您在使用Safari浏…

    2026年9月23日
    100
  • VSCode极速配置Scala:sbt支持、中文文档、REPL集成

    安装JDK和sbt后,在VSCode中安装Metals扩展,即可快速搭建Scala开发环境;2. Metals通过LSP和BSP协议实现代码补全、错误检查、重构及sbt项目自动导入;3. 支持通过sbt shell启动REPL或使用Run Worksheet实现交互式编程;4. 虽无内置中文文档,但…

    2026年9月23日
    100
  • 优麒麟 25.10 版本正式发布

    优麒麟 25.10 正式版现已上线,此版本将提供长达9个月的支持周期,基于最新的 linux 6.17 内核打造,在基础库、子系统及核心组件等方面实现了全面升级,显著提升了系统的稳定性与兼容性,同时推出了焕然一新的软件商店。 新增特性 1. 搭载 Linux 6.17 内核 优麒麟 25.10 集成…

    2026年9月23日
    100
  • win10右键菜单项目太多怎么办_win10右键菜单过多优化方法

    可通过注册表编辑器、第三方工具或安全软件清理Windows 10右键菜单冗余项。首先备份注册表,进入HKEY_CLASSES_ROOTDirectoryBackgroundshellexContextMenuHandlers路径删除无用项,同样检查HKEY_CLASSES_ROOT*shellexC…

    2026年9月23日
    200
  • 苹果MacBook Pro 16 M3 Max对决戴尔XPS 17:移动工作站的屏幕素质与综合性能,谁是视频剪辑师的终极生产力工具?

    MacBook Pro 16 M3 Max在屏幕素质、能效和生态整合上领先,适合Final Cut Pro用户;戴尔XPS 17凭借强大显卡和Windows兼容性,更适合依赖Adobe软件和CUDA加速的视频剪辑师。 对于视频剪辑师来说,选择一台能扛起整个工作流的移动工作站至关重要。苹果MacBoo…

    2026年9月23日
    200
  • 蹭《丝之歌》热度吸引玩家?独立游戏开发者回应

    在如今高度饱和的独立游戏领域,如何让作品被更多玩家看见,成为每位开发者面临的难题。不少创作者开始借助热门话题来提升曝光,《Constance》的开发者btf便是其中之一。这款2D动作平台游戏近期频繁与备受期待的《空洞骑士:丝之歌》相提并论,引发了不少讨论。 部分玩家在社交平台上指出,《Constan…

    2026年9月23日
    400
  • linux如何优雅的关机

    优雅关机的三大法宝:拔电源、shutdown、poweroff 及其对硬件和数据的影响 在讨论关机方法之前,先了解一下机械硬盘的内部结构。 那固态硬盘SSD呢? FTL工作示意图。FTL表对SSD至关重要,如果在FTL写回Flash之前突然断电,内存数据丢失,FTL表也将丢失。因此,高端SSD和服务…

    2026年9月23日
    000
  • PHP自定义函数:创建与使用 prev_id() 函数的实践指南

    本文旨在指导读者如何定义和实现自定义PHP函数,以解决“Call to undefined function”错误。通过 prev_id() 函数的创建示例,详细阐述了函数的基本语法、参数传递、返回值以及在实际应用(如数据库查询)中的集成方法,并提供了关键注意事项,帮助开发者编写模块化、可维护的代码…

    2026年9月23日
    000
  • mysql数据库中触发器和存储过程如何协同

    触发器可调用存储过程实现复杂逻辑与数据一致性。例如,订单插入后通过触发器调用存储过程更新库存并记录日志;共用业务规则如积分调整封装在存储过程中,被多个触发器复用,提升可维护性;触发器还可调用存储过程插入异步任务到消息表,解耦耗时操作,由后台脚本处理通知或数据同步,保障主事务效率。 在MySQL数据库…

    2026年9月23日
    100
  • 抖音专营店怎么开?抖音怎么开通店铺

    抖音专营店怎么开?抖音怎么开通店铺抖音专营店怎么开?抖音怎么开通店铺抖音专营店怎么开?抖音怎么开通店铺抖音专营店怎么开?抖音怎么开通店铺

    如今,抖音作为一款风靡全国的短视频平台,已经深深融入了人们的日常生活。其庞大的用户基数和强大的消费能力,让众多商家看到了无限商机,纷纷希望能在平台上开设专营店。那么,究竟如何在抖音上成功开通一家专营店呢?接下来的内容将为您全面解析。 一、了解抖音专营店的核心优势 流量资源丰富:抖音拥有海量活跃用户,…

    2026年9月23日 用户投稿
    000
  • 四种获取fasta序列长度的方法

    在处理fasta序列时,我们常常需要知道每条序列的长度。今天小编将与大家分享四种获取fasta序列长度的方法。 一、使用awk 以下是使用awk获取fasta序列长度的代码: awk ‘/^>/{if (l!=””) print l; print; l=0; next}{l+=length($…

    2026年9月23日
    200
  • 苹果iOS 17更新是否会自动删除带有验证码的信息

    在当今高度数字化的生活中,验证码广泛应用于登录账户、密码重置、支付验证等关键操作。然而,这类敏感信息若长期保留在手机中,可能成为潜在的安全隐患。苹果在iOS 17中引入的自动清理机制,正是为了解决这一痛点而设计。 当用户接收到含有验证码的短信时,系统会智能识别其中的关键信息,并在后台进行标记。根据用…

    2026年9月23日
    000

发表回复

登录后才能评论
关注微信