对于阵列A的每个元素A [i],找到最接近的j,使得A [j]> A [i]于

时间:2010-03-31 20:03:10

标签: distance euclidean-distance


给定:实数的数组A[1..n]

目标:数组D[1..n],以便

D[i] = min{ distance(i,j) : A[j] > A[i] }
当没有更高价值的元素时,

或一些默认值(如0)。我真的想在这里使用欧几里德距离。

示例

A = [-1.35, 3.03, 0.73, -0.06, 0.71, -0.21, -0.12, 1.49, 1.41, 1.42]
D = [1, 0, 1, 1, 2, 1, 1, 6, 1, 2]

有没有办法打败明显的O(n ^ 2)解决方案?到目前为止,我唯一取得的进展是D[i] = 1只要A[i]不是局部最大值。我一直在思考,并且想出了什么。我希望最终将其扩展到2D(因此AD是矩阵)。

2 个答案:

答案 0 :(得分:1)

所以我对此感到困惑,但我还没有想出更好的方法。一些想法:

  • 使用可在O(n)时间或更长时间内获得的额外信息增加阵列。例如,添加索引,邻居之间的差异等等。
  • 排序(O(n(log n))会有任何帮助吗?
  • 似乎dynamic programming在这里可能会有所帮助,如果你能找到一种方法来解决每个元素基于其邻居的解决方案(用j之类的信息为每个元素增加答案{ {1}}而不仅仅是距离。)

答案 1 :(得分:0)

将数组从最高元素排序到最低元素。如果我正确理解你的问题,这会立即给你答案,因为与原始列表中任何元素最接近的较大元素就是前面的元素。这样你甚至不需要创建D []数组,因为它的内容计算可以使用数组A []来完成。排序的A []数组中的第一个元素没有更大的朋友,所以答案就是你的默认valye(也许是0?)。扩展矩阵算法可能很容易(取决于你如何“看”矩阵) - 只需使用一种映射函数,将矩阵转换为一维数组。