С# - помощь в оптимизации цикла

92
11

У меня есть фрагмент кода, который в принципе выглядит следующим образом. Проблема в том, что я запускаю этот код 10 тысяч раз и нуждаюсь в его оптимизации. Любые предложения приветствуются.


//This array is in reality enormous and needs to be triggered loads of times in my code
int[] someArray = { 1, 631, 632, 800, 801, 1600, 1601, 2211, 2212, 2601, 2602 };

//I need to know where in the array a certain value is located
//806 is located between entry 801 and 1600 so I want the array ID of 801 to be returned (4).
id = 806

//Since my arrays are very large, this operation takes far too long
for (int i = 0; i < someArrayLenght; i++)
{
if (someArray[i] <= id)
return i;
}


Изменить: Извините, что состояние было неправильным. Он должен возвращать идентификатор, когда 806 больше, чем 801. Надеюсь, вы можете иметь смысл от него.

спросил(а) 2021-01-19T18:23:00+03:00 9 месяцев назад
1
Решение
152

Значения массива выглядят отсортированными. Если это действительно так, используйте двоичный поиск:


int result = Array.BinarySearch(someArray, id);
return result < 0 ? (~result - 1) : result;

Если искомое значение не появляется в массиве, Array.BinarySearch вернет поразрядное дополнение следующего индекса больших значений. Вот почему я тестирую отрицательные числа и используя побитовый оператор дополнения в приведенном выше коде. Результат должен быть таким же, как и в вашем коде.


Двоичный поиск имеет логарифмическое время работы вместо линейного. То есть, в худшем случае только log 2 n нужно искать много записей вместо n (где n - размер массивов).

ответил(а) 2021-01-19T18:23:00+03:00 9 месяцев назад
79

Содержимое someArray сортируется, используйте двоичный поиск - см. также Array.BinarySearch.

Примечание. В вашем примере условие в if (someArray[i] <= id) return i; будет срабатывать всякий раз, когда id >= 1. Я сомневаюсь, что вы хотите сделать.

ответил(а) 2021-01-19T18:23:00+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема