【问题标题】:Find a number nearest to all numbers in an array查找最接近数组中所有数字的数字
【发布时间】:2013-02-26 13:23:34
【问题描述】:

这个问题基本上是一个算法优化问题。

我们有一个包含 n 个元素的列表。例如{n1,n2,n3...nk} 这个列表是排序的,我们必须找出数字 ni 是

  1. n1<=ni<=nk
  2. ni与每个数字的距离之和最小。

可能有(nk-n1+1) 可能的总数,但我们的目标是找出ni 的数字,它是 最接近所有其他数字。

蛮力方法可以通过n1 迭代到 nk 并计算距离的总和 从所有列表编号。通过这种方式,我们可以轻松找出最接近列表中所有其他数字的数字。

但是这种方法的问题是,它在时间复杂度方面并不好。这种方法的时间复杂度是O(n^2)

我认为可能有更好的方法可以用更少的时间解决这个问题 复杂。

任何方法都会受到赞赏。

【问题讨论】:

  • 你对“距离”的定义是什么?
  • 用二分法搜索怎么样,因为你提到列表是排序的?
  • 是距离(a,b)=abs(a-b)

标签: arrays algorithm optimization numbers


【解决方案1】:

如果“距离”是指distance(a,b) = abs(a-b),那么你只需要找到中位数。

在排序列表中找到中位数是 O(1)。

【讨论】:

  • 你的意思可能是“medoid”(如果有奇数个元素,它的值与给定距离定义 (abs(a-b)) 的一维情况下的中位数一致)。
  • @Sebastian:是的,我愿意。如果元素个数为偶数,则任一/两个 medoid 都可以。
  • 是的,如果有偶数个元素。那么最近的数字应该是两个中间数字的平均值。如果 b1 和 b2 是两个中间数字,那么最近的数字应该是 (b1+b2)/2。
  • 如何在排序列表中获得 O(1) 的中位数?
【解决方案2】:

答案应该是 ROUND(SUM(n1,...,nk)/k)。

【讨论】:

    【解决方案3】:

    求平均值...这需要 O(n)。 然后遍历列表找到平均值的 ni(也需要 O(n))...实际上更像 o(1/2n)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多