Python 中的 Kadane 算法17 Mar 2025 | 5 分钟阅读 在下面,我们将讨论 Kadane 算法及其解决“最大子数组和”问题的特性。我们将理解该算法的概念,并结合示例及其相应的输出来学习 Python 代码。最后,我们将讨论该算法的时间复杂度以及 Kadane 算法的实际应用。 那么,让我们开始吧。 理解 Kadane 算法Kadane 算法是用于通过动态规划解决问题的流行方法之一。正如我们已经知道的,最大子数组问题被认为是动态规划领域中最流行的问题之一。我们可能认为这个问题看起来很简单,并且问题的输出将是数组中所有数据元素的总和。然而,这似乎不对。我们还会遇到数组中的负整数作为数据元素,这会降低整个数组的总和。因此,我们将借助 Kadane 算法来解决这个问题。 Kadane 算法用于在一维整数数组中找到具有最大可能和的连续子数组。在理解了问题的陈述之后,每个人的主要方法将是应用暴力方法来解决问题。然而,这样做,解决方案的时间复杂度将是 O(n^2),这一点也不令人印象深刻。因此,我们将使用 Kadane 算法通过两个变量来跟踪迄今为止的总和和最大总和,从而遍历整个数组来解决该问题。使用此算法时需要注意的最重要方面是我们将更新这两个变量的条件。 理解最大子数组和算法现在让我们考虑最大子数组和算法的基本步骤,如下所示 步骤 1: 我们必须将 max_till_now = 0 初始化 步骤 2: 我们必须将 max_ending = 0 初始化 步骤 3: 我们必须重复 步骤 4 到 6,针对数组中的每个数据元素。 步骤 4: 我们必须将 max_ending = max_ending + a[i] 设置为 步骤 5: 如果 (max_ending < 0),那么我们必须将 max_ending = 0 设置为 步骤 6: 如果 (max_till_now < max_ending),那么我们必须将 max_till_now = max_ending 设置为 步骤 7: 我们必须返回 max_till_now 在上述算法步骤中,我们使用了 max_ending 来查找数组的所有正数据元素,并使用 max_till_now 来查找所有正段中数据元素的最大总和。因此,每次我们将正面总和与 max_till_now 进行比较时,我们都可以用较大的总和来更新它。 因此,每当 max_ending 变为负数时,我们都会将其设置为零,并且对于每次迭代,我们将检查 max_till_now 是否小于 max_ending 的条件,以便在条件返回 True 时更新 max_till_now。 通过图示理解 Kadane 算法让我们来看一个整数数组的示例如下。 ![]() 图 1: 整数数组 ![]() 图 2: 我们将初始化 max_till_now = 0 和 max_ending = 0 (n = 0)。 ![]() 图 3: 然后我们得到 n = 1 时的 max_till_now = 0 和 max_ending = 0;然而,我们得到 n = 2 时的 max_till_now = 4 和 max_ending = 4。 ![]() 图 4: 然后我们将 n = 3 和 4 的值赋给,分别得到 max_till_now = 4 和 max_ending = 3,以及 max_till_now = 4 和 max_ending = 1。 ![]() 图 5: 我们得到 n = 5 时的 max_till_now = 6 (6 > 4) 和 max_ending = 6。 ![]() 图 6: 我们还得到 n = 6 时的 max_till_now = 6 和 max_ending = 4。 因此,从上面的例子中,我们将找到从 n = 2 到 n = 5 的最大子数组,最大和为 6。 通过 Python 代码理解 Kadane 算法让我们看下面的代码片段,演示 Kadane 算法的工作原理。 示例 输出 Maximum Subarray Sum: 6 说明 在上面的代码片段中,我们定义了一个名为 max_Subarray_Sum 的函数,它接受 my_array 和 array_sum 作为参数。然后我们将变量 maxTillNow 赋值为数组的第一个索引值,将 maxEnding 赋值为零。然后我们使用 for-loop 迭代整个数组。我们还使用 if-elif-else 条件语句并返回 maxTillNow。最后,我们定义了数组并打印出用户的最大子数组和,在上面的示例中为 6。 理解时间复杂度Kadane 算法对于包含 n 个数据元素的整数数组的时间复杂度定义为 O(n),因为程序中只需要执行一个 for 循环。同样,算法的辅助空间复杂度为 O(1)。 理解应用Kadane 算法有各种应用,其中一些描述如下
结论最后,我们可以得出结论,在解决查找最大子数组和的问题陈述时,解决方案似乎并不容易和简单。然而,Kadane 算法简化了此类问题的解决,并以最低的时间复杂度实现了解决方案。这是可能的,因为 Kadane 算法利用了收集所需信息来达到解决方案的技术,避免了不必要的数据存储。因此,我们可以将此算法视为一个简单的动态规划方法示例,在现实世界中具有许多实际应用。 下一个主题Django 中的日志记录器 |
Python 中的 fabs 方法用于返回数字的绝对值。可以通过导入 math 模块来使用它。Python 中的 math 模块可用于实现不同的基本数学运算,如加法、减法、除法和乘法。它也可以用于...
阅读 3 分钟
这个基于项目的课程旨在教您如何使用 Python 和广受欢迎的框架 Django 从头开始创建一个内容聚合器。访问多个网站和来源来阅读您喜爱主题的信息可能会非常耗时,因为有...
阅读 22 分钟
文本消息可以使用摩尔斯电码方法进行通信,方法是输入一系列电脉冲,通常显示为短脉冲(称为“点”)和长脉冲(“破折号”)。塞缪尔·F·B·摩尔斯在 19 世纪 40 年代创建了该代码,用于...
阅读 16 分钟
人工神经网络学习已成功用于学习实值、离散值或向量值函数,包括不同类型的特征景观、语音识别和学习机器人控制技术等问题。人工神经网络学习对训练数据中的错误具有抵抗力。生物学上由...组成这样的发现
阅读 4 分钟
| 生成安全的随机数 在本教程中,我们将学习一个有趣的 Python 模块,名为 secret。我们还将学习它的方法以及它与 random 模块的区别。它发布于 Python 3.6,并被广泛称为...
5 分钟阅读
什么是 OS 模块?在 Python 编程语言中,我们有一个 OS 模块,用于执行与操作系统相关的各种操作。它有许多内置函数,我们无需安装此模块。路径是...
阅读 3 分钟
TIFF 文件格式用于存储光栅化图像。一个名为 GDAL 地理空间数据抽象库的库专门用于读取这些光栅文件,以及其他文件格式,例如矢量格式。gdal 库是……的一部分
阅读 2 分钟
我们大多数人都想过,为什么与其他编程语言相比,Python的增长如此迅速?是的,Python确实在很短的时间内声名鹊起,现在我们可以在每个领域看到Python的应用。而且,是的...
阅读9分钟
简介:Flask Login 为 Flask 提供用户会话管理。它处理登录、注销和长期存储用户会话的常规任务。几个月前,我对推广我的书的数字商品收费服务感到厌烦,决定写...
阅读 3 分钟
在本教程中,我们将学习如何在 Python 中将列表中的所有元素相乘。让我们看一些示例来理解我们的目标- 输入 - [2, 3, 4] 输出 - 24 我们可以观察到,在输出中,我们得到了乘积...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India