【问题标题】:Retrieving 2 closest numbers among 3在 3 个中检索 2 个最接近的数字
【发布时间】:2012-05-02 11:21:05
【问题描述】:

我正在寻找一种算法来检索 3 个中最接近的两个。我没有任何变量可以接近,只有这三个。例如,如果我有 31、52 ​​和 84,我希望函数返回 31 和 52。

我尝试了一些数组排序的方法,但事实上这三个数字是变量(X、Y 和 Z)。当我对 [X, Y, Z] 数组进行排序时,我失去了 vars 的顺序。

我确定有一个非常简单的解决方案,我现在感觉很傻......这实际上是一个 MAXScript 项目,所以我想避免使用特定的语言功能,但任何类型的信息都将不胜感激.

【问题讨论】:

  • 排序与这个问题有什么关系?
  • 复制here
  • @Chris:这是一个不同的问题,有不同的解决方案。这是找到 两个 最接近的数字构成一组给定数字。另一个问题是找到集合中与单个给定数字最接近的 一个 数字。
  • @DavidSchwartz 啊哈我的错误,我根据算法细节查看了第一个答案,即找出两个数字之间最接近的值。并且误读了只有一个被传入。

标签: sorting language-agnostic numbers


【解决方案1】:

呼叫三个数字 A、B 和 C。

计算三个变量:

AB = (A - B)^2
BC = (B - C)^2
CA = (C - A)^2

然后比较 AB、BC 和 CA。如果AB最小,输出A和B。如果BC最小,输出B和C。如果CA最小,输出C和A。

如果你想让它更优雅一点,创建一个由三个数字组成的结构,并创建三个这样的结构,如下所示:

S1 = (A-B)^2, A, B
S2 = (B-C)^2, B, C
S3 = (C-A)^2, C, A

然后根据第一个数字对 S1,S2,S3 进行排序。对于首先排序的条目,输出其后两个数字。

【讨论】:

  • 实际上,您可以只使用abs(A - B) 等 :)
  • 排序的方式显然效率较低:您需要 O(n^2 log (n^2)) = O(n^2 log n) ,而简单地找到最大值只是O(n^2)(这里 n 是变量的数量)。
  • @Vlad 调用库以调用可能具有不可预测分支的代码?还是做个宏?或者一个 if/negate 又一次,一个不可预测的分支。呸。单次乘法要好得多。 (至于排序的复杂度参数,如果n固定为3,没关系。当然你是对的,我们只需要找到最小值。)
  • 有可能计算 abs 而无需使用一些技巧进行分支:graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
  • @Vlad:对于这样一个简单的问题,这似乎有很多不必要的复杂性。但我想你可以争辩说你的编译器很可能也有一个内联、优化的 abs 操作。
【解决方案2】:

对于仅 3 个变量,您需要比较它们之间的距离并选择最接近的两个(请参阅大卫的回答)。对于n 变量,你可以这样做:

  1. 对值进行排序 (O(n log n))
  2. 遍历排序列表,找到相邻变量之间的最小差异 (O(n))
  3. 结果是差值最小的变量对

【讨论】:

  • 这是一个不错的方法。它简单而高效。而且它不需要任何花哨的额外工作来返回所需的值。
  • @David:感谢您的评价!无论如何,我的回答只是对n 变量的假想情况的增强。
  • 没错,但即使只有三个变量,也更容易解释。
猜你喜欢
  • 2020-08-24
  • 2018-08-12
  • 1970-01-01
  • 2020-10-25
  • 2010-09-14
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多