如何在最接近条件的数组中查找数据

Posted

技术标签:

【中文标题】如何在最接近条件的数组中查找数据【英文标题】:How to find data inside array that is most closest to a condition 【发布时间】:2014-02-26 08:06:05 【问题描述】:

我有一个双 Double[] array = new Double[5]; 数组

例如,如果数组包含这样的数据:

0.5 , 1.5 , 1.1 , 0.6 , 2

如何找到最接近 1 的数字?输出应该是1.1,因为在这种情况下它是最接近 1 的那个。

【问题讨论】:

你想要数字(1.1)还是位置(2)? 【参考方案1】:
var result = source.OrderBy(x => Math.Abs(1 - x)).First();

在文件顶部需要using System.Linq;。这是 O(n log(n)) 解决方案。

更新

如果你真的担心性能并想要O(n) 解决方案,你可以使用MinBy() extension method from moreLINQ library。

或者你可以使用Aggregate() 方法:

var result = source.Aggregate(
                new  val = 0d, abs = double.MaxValue ,
                (a, i) => Math.Abs(1 - i) > a.abs ? a : new  val = i, abs = Math.Abs(1 - i) ,
                a => a.val);

【讨论】:

但排序似乎过于昂贵。 @HenkHolterman 这是 O(nlog(n))* 解决方案。我知道 O(n) 是可能的,但除非数组有数千个元素,否则我不会害怕。 是的,我知道有类似 MinBy() 的东西。如果需要,可能可以扩展以获取索引。【参考方案2】:

您可以使用 LINQ 以简单的方式实现此目的:

var closestTo1 = array.OrderBy(x => Math.Abs(x - 1)).First();

【讨论】:

【参考方案3】:

这样的东西应该很容易被任何程序员理解并且具有 O(n) 复杂度(非 LINQ):

double minValue = array[0];
double minDifference = Math.Abs(array[0] - 1);

foreach (double val in array)

    int dif = Math.Abs(x - 1);   

    if (dif < minValue) 
    
        minDifference = dif;
        minValue = val;
    

此代码执行后,minValue 将具有您所需的值。

代码摘要:

它将最小值设置为数组的第一个元素。那么差就是第一个元素的绝对值减1。

此循环将线性搜索数组并找到数组的最小值。如果差值小于最小值,则会设置新的最小差值和最小值。

【讨论】:

是的,但是非常老派。当性能最重要时很好。 我的猜测是 LINQ 的性能更好。一般来说,我更喜欢大多数非 LINQ 解决方案,因为它对初学者来说更容易理解,而且我只是根据我之前的问题了解了 LINQ。

以上是关于如何在最接近条件的数组中查找数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从数组中查找最接近500的数字

在最接近指定日期的列表中查找上一个日期

在数组中查找匹配或最接近的值

如何在目标上方的数组中找到最接近的数字?

在排序数组列表中查找2个最接近的先前值和2个最接近的下一个值

CSV文件操作,PHP如何对满足条件的二维数组进行求和