用于计算内部最大下降的序列算法?

时间:2012-03-01 09:30:15

标签: algorithm series

给定一系列x(i),i从1到N,假设N = 10,000。

for any i < j,
D(i,j) = x(i) - x(j), if x(i) > x (j); or,
       = 0, if x(i) <= x(j).

定义

Dmax(im, jm) := max D(i,j), for all 1 <= i < j <=N.

计算Dmax,im和jm的最佳算法是什么?

我尝试使用动态编程,但这似乎不可分割......然后我有点迷失了...你们可以建议一下吗?是回溯了出路?

4 个答案:

答案 0 :(得分:2)

迭代该系列,跟踪以下值:

  • 目前为止的最大元素
  • 目前为止的最大下降

对于每个元素,新的最大下降有两个可能的值:

  • 它保持不变
  • 等于maximumElementSoFar - newElement

所以选择一个给出更高价值的那个。迭代结束时的最大下降将是您的结果。这将在线性时间和恒定的额外空间中起作用。

答案 1 :(得分:0)

如果我理解正确你有一个数字数组,并想找到数组中两个相邻元素之间最大的正差异?

由于你将不得不至少经历一次数组,以计算差异,我不明白为什么你不能只是记录到目前为止发现的最大差异(及其位置),随着更改而更新。

如果您的问题像我理解的那样简单,我不确定您为什么需要考虑动态编程。我希望我误解了这个问题。

答案 2 :(得分:0)

Dmax(im, jm) := max D(i,j) = max(x(i) -x(j),0) = max(max(x(i) -x(j)),0)

你只需要为所有值计算x​​(i)-x(j),即O(n ^ 2),然后得到最大值。无需动态编程。

答案 3 :(得分:0)

您可以将系列x(i)划分为子系列,其中每个子系列包含x(i)的子列表和降序(例如,如果x = 5,4,1,2,1则x1 = 5,4, 1和x2 = 2,1)然后在每个子列表中你可以做:first_in_sub_series - last_sub_series然后比较你得到的所有结果并找到最大值,这就是答案。

如果我理解正确的问题,这应该为您提供一个基本的线性算法来解决它。

e.g:

x = 5, 4, 1, 2, 1 then x1 = 5, 4, 1 and x2 = 2, 1
rx1 = 4
rx2 = 1

dmax = 4且im = 1且jm = 3,因为我们讨论的是x1,它是x的前3项。