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