Kadane’s Algorithm卡丹算法

Kadane’s Algorithm卡丹算法

kadane算法是动态规划思想的体现,简而言之就是 及时放弃,从头再来。

一、问题引入

给定一个整数数组,例如 [-2, 1, -3, 4, -1, 2, 1, -5, 4],我们的目标是找出一个具有最大和的连续子数组。在这个例子中,答案是 [4, -1, 2, 1],其和为 6。这个问题看似简单,实则蕴含着巧妙的算法设计思路,而卡丹算法正是解决它的绝佳武器。

二、算法原理剖析

卡丹算法基于动态规划的思想,通过巧妙地定义状态和状态转移方程,以高效的方式遍历数组,找出最大子数组和。

  1. 状态定义
    • 我们定义 dp[i] 为以数组第 i 个元素结尾的最大子数组和。这个定义至关重要,它将大问题分解为了一系列以每个元素结尾的子问题。
  2. 状态转移方程
    • dp[i] = max(nums[i], dp[i - 1] + nums[i])。这意味着,对于当前位置 i,以它结尾的最大子数组和要么是当前元素 nums[i] 自身(当之前的子数组和为负,加上反而变小),要么是前一个位置结尾的最大子数组和 dp[i - 1] 加上当前元素 nums[i]
  3. 算法流程
    • 初始化 dp[0] = nums[0],因为以第一个元素结尾的最大子数组和就是第一个元素本身。
    • 然后从数组的第二个元素开始遍历,依次根据状态转移方程计算 dp[i]
    • 在计算过程中,我们还需要记录全局的最大子数组和 max_sum,每次更新 dp[i] 时,都比较 dp[i]max_sum,如果 dp[i] > max_sum,则更新 max_sum

三、代码实现

Go:

func maxSubArray(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    dp[0] = nums[0]
    maxSum := nums[0]
    for i := 1; i < n; i++ {
        // 状态转移方程
        dp[i] = max(nums[i], dp[i-1]+nums[i])
        if dp[i] > maxSum {
            maxSum = dp[i]
        }
    }
    return maxSum

}

func max(a,b int) int {
    if a>b {
        return a
    }
    return b
}

四、算法复杂度分析

  1. 时间复杂度:
    • 由于只需要遍历一次数组,对于长度为 n 的数组,时间复杂度为 O(n),这在处理大规模数据时表现出极高的效率,相较于一些暴力解法(如枚举所有子数组并求和,时间复杂度为 O(n^2))有了质的飞跃。
  2. 空间复杂度:
    • 代码中使用了 dp 列表来存储中间状态,其长度与输入数组相同,所以空间复杂度为 O(n)。不过,注意到在计算 dp[i] 时,实际上只依赖于 dp[i - 1],所以可以通过优化,只用一个变量来存储当前的 dp 值,将空间复杂度优化到 O(1)

优化后:时间On,空间O1

func maxSubArray(nums []int) int {
    n := len(nums)
    dp := nums[0]
    dpn := nums[0]
    maxSum := nums[0]
    for i := 1; i < n; i++ {
        // 状态转移方程
        dpn = max(nums[i], dp+nums[i])
        dp = dpn 
        if dpn > maxSum {
            maxSum = dpn
        }
    }
    return maxSum
}

五、应用场景拓展

​ 卡丹算法不仅仅局限于简单的整数数组求最大子数组和。在实际应用中,它常用于金融领域的股票价格走势分析,找出一段时间内股票收益最大的连续时间段;在信号处理中,用于从连续的信号数据里提取具有最大能量的子信号段等。只要涉及到在连续序列中寻找最优累加和的场景,卡丹算法都能大显身手。

​ 卡丹算法以其简洁高效的特点,为最大子数组和问题提供了完美的解决方案。通过深入理解其原理、熟练掌握代码实现以及了解广泛的应用场景,我们便能在算法编程的道路上更加得心应手,利用它攻克一个又一个相关难题。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇