【问题标题】:Solving MaxDouble Slice Kadane's Algorithm Variation求解 MaxDouble Slice Kadane 的算法变体
【发布时间】:2017-02-14 17:16:40
【问题描述】:

我试图通过解决 Codality 问题来提高我的技能。我到达了这个:https://codility.com/programmers/lessons/9-maximum_slice_problem/max_double_slice_sum/

我其实理论上理解解决方案:

  1. 在数组上使用 Kadane 算法并将总和存储在每个索引处。
  2. 反转数组并执行相同操作。
  3. 通过一次循环遍历两个结果集,找到两者之和最大的点。
  4. 最大值是最大双切片。

我的问题不在于如何解决问题。我的问题是关于人们如何想象这将是解决这个问题的方式。至少需要使用 3 个不同的概念:

  1. 如果数组中的所有元素都是正数或负数,则与数组中存在正数和负数元素时的情况不同。

  2. Kadane 算法

  3. 向前和向后遍历数组。

尽管如此,Codality 已将此问题标记为“无痛”。

我的问题是我错过了什么吗?在不了解其中一些概念的情况下,我似乎很难解决这个问题。

有没有一种技术可以让我从头开始和非常基本的概念,然后逐步达到解决这个问题所需的概念。还是说我在开始问题之前就应该知道这些概念?

我该如何准备自己以解决将来不知道所需概念的此类问题?

【问题讨论】:

    标签: arrays algorithm kadanes-algorithm


    【解决方案1】:

    我认为你想多了这个问题,这就是为什么你觉得它比它更困难:

    如果数组中的所有元素都是正数或负数,则与数组中存在正数和负数元素时的情况不同。

    不必是不同的情况。您也许可以想出一个算法,它不关心这种区别并且无论如何都可以工作。

    你不需要从理解这个区别开始,所以在你必须这样做之前不要考虑它。

    Kadane 算法

    不要考虑算法,要考虑问题需要什么。通常,10+段的问题陈述可以用更少的方式表达。

    让我们看看如何简化问题陈述。

    它首先将切片定义为三元组(x, y, z)。它定义为以x+1 开始、以z-1 结束且不包含y 的元素的总和。

    然后它要求最大和切片。如果我们需要最大切片,我们是否需要定义中的xz?我们不妨让它在任何地方开始和结束,只要它给我们最大的和,不是吗?

    因此,将切片重新定义为数组的子集,该数组从任意位置开始,上升到某个 y-1,从 y+1 继续,然后在任意位置结束。更简单,不是吗?

    现在你需要最大的切片。

    现在您可能会想,对于每个y,您需要从y+1 开始的最大和子数组和以y-1 结束的最大和子数组。如果你能找到这些,你可以为每个 y 更新一个全局最大值。

    那么你是怎么做到的呢?现在,这应该将您指向 Kadane 的算法,它完成了您想要的一半:它计算以某个 x 结尾的最大和子数组。所以如果你从两边计算,对于每个y,你只需要找到:

    kadane(y - 1) + kadane_reverse(y + 1)
    

    并与全局最大值进行比较。

    没有否定和肯定的特殊情况。没有想到“Kadane的!”当你看到问题时。

    这个想法是在不改变其含义的情况下尽可能简化需求。然后你使用你的算法和演绎技巧来找到一个解决方案。这些技能是经过时间和经验磨练出来的。

    【讨论】:

    • 谢谢。你说,“它首先将切片定义为三元组 (x, y, z)。它定义为从 x+1 开始、以 z-1 结束且不包含 y 的元素之和。”现在,如果数组是 2、3、4、5、6、7,那么最大子数组就是整个数组。并且最大子数组反转也是整个数组。所以它不考虑上述删除第一个和最后一个元素的要求。 (或者我没有正确理解某些东西?)这不是一般算法无法处理的特殊情况吗?
    • @KhojBadami 我不明白怎么做。根据您的说法,在应用原始定义和我的简化定义时,该示例的答案是什么?无论哪种方式,即使它以某种方式出错,关键是现在你有一个最有效的解决方案,给出或接受一些边缘情况。现在您可以专注于如何处理这些边缘情况:通过分别识别和处理它们,或者通过调整您的解决方案来处理它们。不要从边缘案例开始开发解决方案。
    • 好的,“不要从边缘案例开始开发解决方案。”。这就是我认为是我的问题。正如你最初所说,我让问题变得比它需要的更复杂。如您所解释的,需要简化。谢谢。
    猜你喜欢
    • 2020-03-13
    • 2014-07-14
    • 2011-11-06
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多