2014-02-02 4 views
2

У меня есть массив двойной Double[] array = new Double[5];Как найти данные внутри массива, который является наиболее близким к условию

Например, если массив содержит данные, как это:

{0,5, 1,5, 1,1 , 0,6, 2}

Как найти номер, который ближе всего к 1? Выход должен быть 1.1, потому что в этом случае он близок к 1.

+0

Вы хотите номер (1.1) или позицию (2)? –

ответ

6
var result = source.OrderBy(x => Math.Abs(1 - x)).First(); 

Требуется using System.Linq; в верхней части файла. Это O (n log (n)) решение.

Update

Если вы действительно боитесь о производительности и хотите O (п) решение, вы можете использовать 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); 
+1

Но сортировка кажется слишком дорогой. –

+2

@HenkHolterman Это * O (n * log (n)) * решение. Я знаю, что * O (n) * возможно, но я бы не боялся этого, если массив не имеет тысяч элементов. – MarcinJuraszek

+0

Да, я знал, что есть что-то вроде MinBy(). Может, возможно, расширится, чтобы получить индекс, если это необходимо. –

3

Вы можете достичь этого простым способом с помощью 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.

Эта петля будет линейно искать массив и находить минимальное значение массива. Если разница меньше минимального значения, она установит новую минимальную разницу и минимальное значение.

+2

Да, но очень старая школа. Хорошо, когда производительность важна. –

+0

Я предполагаю, что LINQ имеет лучшую производительность. Обычно я предпочитаю большинство решений, отличных от LINQ, потому что их легче понять для новичков, и я узнал только о LINQ на основе моих предыдущих вопросов. – puretppc