【问题标题】:For each element A[i] of array A, find the closest j such that A[j] > A[i]对于数组 A 的每个元素 A[i],找到最接近的 j 使得 A[j] > A[i]
【发布时间】:2011-02-03 02:34:01
【问题描述】:

Given:实数数组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] 不是局部最大值时。我一直在想很多,并没有想出任何东西。我希望最终将其扩展到二维(所以AD 是矩阵)。

【问题讨论】:

  • 你的符号很好,简洁,但如果你用英语解释事情可能会更有用(你可能会得到更多的答案)。
  • 诺亚:谢谢!!我试着用更少的符号来写标题,但是当我把它呈现给坐在我旁边的两个人时,他们不喜欢它。我能想到的最好的方法是“在数组的每个元素处,找到最近的更高值的数组元素”。 Paul R:这实际上是我正在从事的一个更大项目的一小部分,这不是家庭作业。但你是对的,它看起来确实像家庭作业。

标签: distance euclidean-distance


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    • 使用可以在 O(n) 或更短时间内获得的额外信息来扩充阵列。例如,添加索引、邻居之间的差异等。
    • 排序 (O(n(log n)) 有什么帮助吗?
    • 似乎dynamic programming 在这里可能会有所帮助,如果您可以根据其邻居的解决方案找出解决每个元素的方法(使用每个A[i]j 等信息来增加答案,而不是可能只是距离)。

    【讨论】:

    • 谢谢,我之前没有想到你的第一个建议。如果我有什么发现,我一定会更新这个页面!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2021-04-09
    • 2019-04-19
    • 2017-09-10
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多