Какова временная сложность (Big O) поиска элемента в массиве?

«Какова временная сложность (Big O) поиска элемента в массиве?» — вопрос из категории Алгоритмы и структуры данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сложность поиска по массиву зависит от его состояния и используемого алгоритма.

Состояние массива Алгоритм поиска Сложность (Big O) Примечание
Неотсортированный Линейный поиск (последовательный перебор) O(n) В худшем случае необходимо проверить все n элементов.
Отсортированный Бинарный поиск (деление пополам) O(log n) Требует предварительной сортировки массива.

Примеры на C#:

// 1. Линейный поиск в неотсортированном массиве (O(n))
int[] numbers = { 42, 7, 15, 99, 3 };
int target = 15;
bool foundLinear = Array.Exists(numbers, element => element == target); // Или цикл for

// 2. Бинарный поиск в отсортированном массиве (O(log n))
int[] sortedNumbers = { 3, 7, 15, 42, 99 };
int index = Array.BinarySearch(sortedNumbers, target);
bool foundBinary = index >= 0;

// 3. Использование HashSet для константного времени поиска (O(1) в среднем)
// Идеально для частых проверок на существование элемента.
HashSet<int> numberSet = new HashSet<int> { 42, 7, 15, 99, 3 };
bool foundInSet = numberSet.Contains(target); // ~O(1)

Вывод: Для частых операций поиска в больших коллекциях неотсортированный массив — плохой выбор. Следует использовать отсортированный массив с бинарным поиском, HashSet<T> для проверки наличия или Dictionary<TKey, TValue> для поиска по ключу.