我有一个存储在数组中的n个实数序列,A [1],A [2],...,A [n]。我试图实现一种分而治之的算法来找到两个数A [i]和A [j],其中i
例如。 {2,5,9,3,-2,7}将给出14的输出(5 + 9,而不是16 = 9 + 7)。谁能建议我一些关于如何做的想法?
提前致谢。
答案 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)
中的算法,如下所述
(合并部分使用恒定时间)
以下是算法的概要:
以下是使用您的示例演示的算法:{2,5,9,3,-2,7}
ans = 14
像{5,4,3,2,1}这样没有答案的特殊情况需要额外处理,但不会影响核心部分和算法的复杂性。