【问题标题】:Divide and Conquer algorithm for Longest Increasing Consecutive sequence in an array数组中最长递增连续序列的分治算法
【发布时间】:2016-06-28 22:21:44
【问题描述】:

谁能帮我解决这个我一直试图解决的问题。

假设有一个数字数组 A[1,2...n],我们希望使用 Divide an Conquer 方法找到最长的递增连续子序列。具体来说,我们希望找到索引 i,j 使得 i

我已经对这个问题进行了很多搜索,但我只能找到动态方法和没有连续元素的最长递增子序列。

【问题讨论】:

  • 您有什么特别的原因想在这里使用分治法吗?
  • 没有什么特别的原因,我一直在尝试解决我的教授建议的一些实践问题。
  • 对于了解 LIS w/o 连续元素算法可能更有用...动态方法也可以说是自下而上的分而治之

标签: algorithm divide-and-conquer lis


【解决方案1】:

这个怎么样:

  1. 将数组 A 划分为 A1 和 A2。

  2. 求子数组A1和A2的最长连续子序列,分别命名为s1、s2。

  3. 如果最长的连续子序列穿过A1和A2,则连续子序列必须使用A1的最后一个和A2的第一个,命名为s3。

  4. 比较s1、s2、s3,找出最长的。

  5. 在步骤2中,需要不断地划分子数组。而第 3 步和第 4 步是征服过程。

【讨论】:

    【解决方案2】:

    分治法可以通过将数组分成 2 来完成,例如 A1 和 A2。然后,一旦递归地解决了两个子数组的问题,您应该考虑原始数组的最优解可能所在的场景。

    选项1:最长的连续递增子序列完全在A1中,在这种情况下,您已经找到了最大长度,或相关答案,或任何它你打算回来。

    方案二:同理,最长的连续递增子序列完全在A2中。

    方案3:最长的连续递增子序列部分在A1,部分在Array2。在这种情况下,考虑到 A1 是数组的左侧部分,而 A2 是右侧部分,您基本上必须从交叉点向左走,直到它不减少或者你到达 A1 的左端。然后你在 A2 上向右走,直到它不增加或者你到达它的右端。

    在这些选项中,你选择长度最长的那个,你就完成了。

    但是,我应该指出,分而治之并不是这个问题的最佳解决方案,因为它具有 O(nlogn) 时间复杂度。正如 Jon Bentley 的著名著作 Programming Pearls 中所提到的,他称之为最大和连续子序列问题的解决方案已知具有线性时间复杂度。该解决方案可以很容易地适应处理增加的子序列,而不是最大和。

    该算法基于 Bentley 称为扫描的方法,并且基于任何子序列必须在某个时间点结束的想法。

    该方法非常简单,可以在下面找到 Python 实现。

    def maxIncreasing(arr):
        maxLength = 1
        maxStart = 0
        curStart = 0
        curLength = 1
        for i in range(1, len(arr)):
            if arr[i] <= arr[i-1]:
                if curLength > maxLength:
                    maxLength = curLength
                    maxStart = curStart
                curStart = i
                curLength = 1
            else:
                curLength += 1
        if curLength > maxLength:
            maxLength = curLength
            maxStart = curStart
        return (maxLength, maxStart)
    

    【讨论】:

    • 请帮助我理解。这个解决方案有多长?
    • @shivank98 考虑将数组分成两等份。你从长度 N 开始,在你递归地将它分成 2 次 logN 次之后,你最终得到长度为 1 的 N 数组,你不能再进一步划分。因此,在将子序列S 划分为 2 并递归解决问题后,如果您可以在O(K) 时间从其两半的解中形成序列S 的解,其中K 是子序列S,那么你最终会得到O(NlogN)的复杂性。因为有logN的递归级别,每个级别的子序列长度之和为N
    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2013-11-27
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多