使用分而治之算法在未排序的数组中查找最大和

时间:2016-09-11 23:49:04

标签: algorithm divide-and-conquer

我有一个存储在数组中的n个实数序列,A [1],A [2],...,A [n]。我试图实现一种分而治之的算法来找到两个数A [i]和A [j],其中i

例如。 {2,5,9,3,-2,7}将给出14的输出(5 + 9,而不是16 = 9 + 7)。谁能建议我一些关于如何做的想法?

提前致谢。

4 个答案:

答案 0 :(得分:2)

这个问题并不适合分而治之的方法。很容易观察到,如果(i,j)是这个问题的解决方案,则A [j]> =每个k> A [k]。 j,即A [j]是A [j..n]

中的最大值

证明:如果存在这样的k> j和A [k]> A [j],则(j,k)是比(i,j)

更好的解

所以我们只需要考虑满足该标准的j

算法(伪代码)

maxj = n
for (j = n - 1 down to 1):
  if (a[j] > a[maxj]) then:
    maxj = j
  else:
    check if (j, maxj) is a better solution

复杂性:O(n)
C ++实现:http://ideone.com/ENp5WR(实现使用整数数组,但浮点数应该相同)

答案 1 :(得分:0)

声明两个变量,在算法检查期间检查当前数字是否大于当前存储在变量中的两个值中的任何一个,如果是,则替换最小值,如果不是,则继续。

答案 2 :(得分:0)

这是Python中的递归解决方案。我不会把它称为“分而治之”,但话又说回来,这个问题并不适合分而治之的方法。

def recurse(lst, pair):             # the remaining list left to process
    if not lst: return              # if lst is empty, return
    for i in lst[1:]:               # for each elements in lst starting from index 1
        curr_sum = lst[0] + i   
        if lst[0] < i and curr_sum > pair[0]+pair[1]:  # if the first value is less than the second and curr_sum is greater than the max sum so far
            pair[0] = lst[0]
            pair[1] =  i        # update pair to contain the new pair of values that give the max sum
    recurse(lst[1:], pair)          # recurse on the sub list from index 1 to the end 

def find_pair(s):
    if len(s) < 2: return s[0]
    pair = [s[0],s[1]]      # initialises pair array
    recurse(s, pair)    # passed by reference
    return pair

示例输出:

s = [2, 5, 9, 3, -2, 7]
find_pair(s)     #       ============> (5,9) 

答案 3 :(得分:0)

我认为您可以使用O(n)中的算法,如下所述

(合并部分使用恒定时间)

以下是算法的概要:

  1. 将问题分为两半:LHS&amp; RHS
  2. 每一半都应该返回满足要求的最大答案,那半是 AND 那一半中最大的元素
  3. 合并并将答案返回到上一级:答案是LHS答案的最大值,RHS的答案,以及两半中最大元素的总和(仅在RHS的最大元素&gt; = LHS的最大元素时才考虑这一点)
  4. 以下是使用您的示例演示的算法:{2,5,9,3,-2,7}

    1. 分为{2,5,9},{3,-2,7}
    2. 分为{2,5},{9},{3,-2},{7}
    3. {2,5}返回最大值(2,5,5 + 2)= 7,最大元素= 5
    4. {9}返回9,最大元素= 9
    5. {3,-2}返回max(3,-2)= 3,最大元素= 3
    6. {7}返回7,最大元素= 7
    7. {2,5,9}与{2,5}&amp;合并{9}:返回最大值(7,9,9 + 5)= 14,最大元素=最大值(9,5)= 9
    8. {3,-2,7}从{3,-2}&amp; {7}:返回最大值(3,7,7 + 3)= 10,最大元素=最大值(7,3)= 7
    9. {2,5,9,3,-2,7}从{2,5,9}和{3,-2,7}合并:return max(14,10)= 14,最大元素= max (9,7)= 9
    10. ans = 14

      像{5,4,3,2,1}这样没有答案的特殊情况需要额外处理,但不会影响核心部分和算法的复杂性。