【问题标题】:Analysis of Algorithms- Any ideas? [duplicate]算法分析——有什么想法吗? [复制]
【发布时间】:2012-10-05 05:41:02
【问题描述】:

可能重复:
Maximum Contiguous Subsequence Sum of At Least Length L

令 X = {x1, x2, · · · , xn} 为任意数(正数或负数)的序列。给出一个 O(n) 时间算法来找到连续元素 xi,xi+1,···,xj 的子序列,其和在所有连续子序列中最大。例如,对于 X = {2,5, -10, 3, 12, -2, 10, -7, 5},{3, 12, -2, 10} 是一个解。

【问题讨论】:

  • 如果是这样,请将作业问题标记为homework;提及到目前为止您如何解决该问题也会有所帮助。如果不是作业请忽略。
  • @JerryCoffin:啊,很高兴知道!
  • 谢谢你们...不,这不是作业问题...在我的 GATE Entrance 考试问题集中找到。

标签: algorithm analysis


【解决方案1】:

这个问题可以用动态规划来解决。 假设您的输入是数组a,您可以创建一个相同长度的数组S。 以下是问题的递归关系。

S[i] = S[i-1] + a[i] > a[i] ? S[i-1] + a[i] : a[i]

基本情况:S[0] = a[0]

保留max 以跟踪最大总和。最后返回max

【讨论】:

    【解决方案2】:

    答案是http://en.wikipedia.org/wiki/Maximum_subarray_problem#Kadane.27s_algorithm

    该算法背后的想法是,我们假设我们知道长度为 N 的数组的问题的真正最大子数组,并且我们知道从任一端开始的最大子数组。 (基本原理:如果我们假设我们知道接触末端的最大序列,并且我们逐渐将更多元素添加到末端,那么我们不会错过真正的最大子数组,因为在某些时候添加到末端的元素将是相同的元素作为真正的最大子数组的端点。)添加一个额外的元素可能会增加连接到末尾的最长子数组的长度。如果子数组的总和低于 0,我们将其重置。如果它超过了我们当前对真正最大子数组的最佳候选解决方案,我们将替换我们的最佳候选解决方案。

    或者,我们可以利用整合的力量。 (这是一个 O(N) pass 你可以免费做;你也可以免费进行微分。)然后我们查看所有极值,搜索两个极值 MIN 和 MAX,使得 MAX 在 MIN 的右侧(或否则你会找到最负的总和),并且MAX-MIN(连续总和)是最大的。你可以暴力破解这个子问题(如果极端数的数量小于 sqrt(N),仍然是 O(N)),或者你可以以更有效的方式解决它[可以在这里使用一些帮助]。

    【讨论】:

      【解决方案3】:

      这是在线性O(n)时间中很容易找到的所有非负元素的序列。

      【讨论】:

        猜你喜欢
        • 2021-08-27
        • 2023-03-18
        • 1970-01-01
        • 2017-07-24
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 2019-10-19
        • 2010-10-20
        相关资源
        最近更新 更多