递归分治最长运行

Posted

技术标签:

【中文标题】递归分治最长运行【英文标题】:Divide and Conquer Longest Run Recursively 【发布时间】:2021-05-11 14:07:23 【问题描述】:

我想实现一个算法,使用分而治之,递归地找到数组中整数的最长运行。

我做了一个有意义的顺序算法,我想我可以使用递归来做到这一点。但是,我对如何使用分而治之感到困惑,因为我相信这会破坏运行。

例子:

[1,2,3,4,4,4,3,3]

如果列表被分成两半,前 4 个将从其余 4 个中分离出来。

我已经创建了基本案例,但不确定从那里去哪里。

基本情况:

if(len(myarray) == 0):
    return 0

【问题讨论】:

你能定义“最长的数字”是什么意思吗?现在它可能意味着最长的连续子数组或最长的递增子数组。请在写你的问题时更具体 【参考方案1】:

您可以从中间位置检测到一串数字,将其在每一侧扩展,然后递归该条纹左侧和右侧的剩余值。

返回 3 个中最长的一个(左最长、中间连续、右最长)。

def maxrun(A,lo=None,hi=None):
    if lo is None: lo,hi = 0,len(A)-1  # start with the full range
    if lo > hi:  return 0              # empty sub range counts for zero
    if lo == hi: return 1              # single element subrange is one
    mid   = (lo+hi)//2                 # use value in middle of range
    left  = right = mid                # repeated range 
    while left>lo  and A[left-1]  == A[mid]: left  -= 1 # expand left
    while right<hi and A[right+1] == A[mid]: right += 1 # expand right
    return max(right-left+1,maxrun(A,lo,left-1),maxrun(A,right+1,hi)) # recurse


print(maxrun([1,2,3,4,4,4,3,3])) # 3

请注意,这可以通过仅在剩余范围大于当前最佳连胜时向下递归来进一步优化。

【讨论】:

以上是关于递归分治最长运行的主要内容,如果未能解决你的问题,请参考以下文章

硬件递归分治算法

分治策略(求解递归式的方法)

递归与分治法

分治策略   最大子数组问题

算法:找到分治算法的递归方程

2.3.2 分析分治算法