← Назад к вопросам

Как выполнить поиск в отсортированном массиве с минимальной сложностью?

1.3 Junior🔥 201 комментариев
#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поиск в отсортированном массиве: минимальная сложность

Для поиска в отсортированном массиве алгоритмом с минимальной вычислительной сложностью является бинарный поиск (Binary Search). Его временная сложность составляет O(log n), что является оптимальной для данной задачи, так как в отсортированной структуре данных можно использовать информацию о порядке элементов для исключения значительных частей массива на каждом шаге.

Принцип работы бинарного поиска

Алгоритм работает по принципу «разделяй и властвуй»:

  1. Определяется середина массива.
  2. Искомое значение сравнивается с элементом в середине.
  3. Если значения равны — поиск успешен.
  4. Если искомое значение меньше элемента в середине, поиск продолжается в левой половине массива.
  5. Если искомое значение больше — поиск продолжается в правой половине.
  6. Процесс повторяется рекурсивно или итеративно, пока не будет найден элемент или интервал поиска не станет пустым.

Реализация на Swift

Вот пример итеративной реализации бинарного поиска на Swift:

func binarySearch<T: Comparable>(_ array: [T], key: T) -> Int? {
    var lowerBound = 0
    var upperBound = array.count
    
    while lowerBound < upperBound {
        let midIndex = lowerBound + (upperBound - lowerBound) / 2
        
        if array[midIndex] == key {
            return midIndex
        } else if array[midIndex] < key {
            lowerBound = midIndex + 1
        } else {
            upperBound = midIndex
        }
    }
    
    return nil
}

// Пример использования
let sortedNumbers = [1, 3, 5, 7, 9, 11, 13, 15]
if let index = binarySearch(sortedNumbers, key: 9) {
    print("Элемент найден на индексе \(index)") // Вывод: Элемент найден на индексе 4
} else {
    print("Элемент не найден")
}

Ключевые аспекты и оптимизации

  • Предусловие: массив должен быть отсортирован. При несоблюдении этого условия алгоритм не будет работать корректно.
  • Сложность по памяти: O(1) для итеративной реализации, O(log n) для рекурсивной (из-за стека вызовов).
  • Вариации алгоритма:
    • Поиск первого/последнего вхождения дублирующихся элементов.
    • Поиск ближайшего меньшего/большего элемента, если точное совпадение отсутствует.
    • Экспоненциальный поиск (Exponential Search) для неизвестного размера массива или работы с бесконечными потоками.

Сравнение с другими методами поиска

АлгоритмВременная сложностьПрименимость к отсортированным массивам
Линейный поискO(n)Работает, но не оптимально
Бинарный поискO(log n)Оптимальный выбор
Интерполяционный поискO(log log n) в среднемЭффективен при равномерном распределении данных

Практическое применение в iOS-разработке

В iOS-разработке бинарный поиск часто используется:

  • При работе с отсортированными коллекциями данных (например, массивы моделей, отсортированных по дате или идентификатору).
  • В алгоритмах автодополнения или поиска по префиксу.
  • При реализации собственных структур данных типа двоичных деревьев поиска или кучи.

Заключение

Для минимальной сложности поиска в отсортированном массиве бинарный поиск является эталонным решением. Его эффективность O(log n) делает его предпочтительным для больших наборов данных. В Swift также доступны встроенные методы, такие как firstIndex(where:) или binarySearch в комбинации с sort, но понимание ручной реализации важно для оптимизации в критических по производительности участках кода и для решения нестандартных задач поиска.