Итак, я проходил онлайн-тест, в котором мне пришлось реализовать фрагмент кода, чтобы просто проверить, было ли значение в массиве.Я написал следующий код:
using System;
using System.IO;
using System.Linq;
public class Check
{
public static bool ExistsInArray(int[] ints, int val)
{
if (ints.Contains(val)) return true;
else return false;
}
}
Теперь я не вижу здесь никаких проблем, потому что код работает нормально, но почему-то я все же не прошел тест, потому что это «недостаточно быстро», когда массив содержит миллионзначения.
Единственный код, который я написал сам, это:
if (ints.Contains(val)) return true;
else return false;
Другой код, с которым мне дали работать.
Есть ли способ ускорить этот процесс??
Заранее спасибо.
РЕДАКТИРОВАТЬ: Я наткнулся на страницу, где кто-то, очевидно, прошел тот же тест, что и я, и, кажется, сводится к экономии циклов процессора.
Ссылка: Как сохранить циклы ЦП при поиске значения в отсортированном списке?
Теперь его решение в рамках метода:
var lower = 0;
var upper = ints.Length - 1;
if ( k < ints[lower] || k > ints[upper] ) return false;
if ( k == ints[lower] ) return true;
if ( k == ints[upper] ) return true;
do
{
var middle = lower + ( upper - lower ) / 2;
if ( ints[middle] == k ) return true;
if ( lower == upper ) return false;
if ( k < ints[middle] )
upper = Math.Max( lower, middle - 1 );
else
lower = Math.Min( upper, middle + 1 );
} while ( true );
Теперь я вижукак работает этот код, но мне не ясно, почему это должно быть быстрее.Было бы неплохо, если бы кто-то мог уточнить.