给定:实数的数组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(因此A
和D
是矩阵)。
答案 0 :(得分:1)
所以我对此感到困惑,但我还没有想出更好的方法。一些想法:
j
之类的信息为每个元素增加答案{ {1}}而不仅仅是距离。)答案 1 :(得分:0)
将数组从最高元素排序到最低元素。如果我正确理解你的问题,这会立即给你答案,因为与原始列表中任何元素最接近的较大元素就是前面的元素。这样你甚至不需要创建D []数组,因为它的内容计算可以使用数组A []来完成。排序的A []数组中的第一个元素没有更大的朋友,所以答案就是你的默认valye(也许是0?)。扩展矩阵算法可能很容易(取决于你如何“看”矩阵) - 只需使用一种映射函数,将矩阵转换为一维数组。