Ответ
Бинарный поиск — это алгоритм поиска элемента в отсортированном массиве с временной сложностью O(log n). Он работает по принципу «разделяй и властвуй», постоянно уменьшая область поиска вдвое.
Ключевые принципы:
- Требование: Массив должен быть отсортирован.
- Процесс: Алгоритм сравнивает искомый элемент со средним элементом текущего диапазона.
- Результат: Если элементы равны — поиск завершен. Если искомый элемент меньше — поиск продолжается в левой половине, если больше — в правой.
Пример реализации на Swift (итеративный подход):
func binarySearch<T: Comparable>(_ array: [T], for key: T) -> Int? {
var low = 0
var high = array.count - 1
while low <= high {
let mid = low + (high - low) / 2 // Предотвращает потенциальное переполнение
if array[mid] == key {
return mid // Элемент найден
} else if array[mid] < key {
low = mid + 1 // Искать в правой половине
} else {
high = mid - 1 // Искать в левой половине
}
}
return nil // Элемент не найден
}
// Использование
let sortedNumbers = [1, 3, 5, 7, 9, 11]
let index = binarySearch(sortedNumbers, for: 7) // Вернет 3
Почему O(log n)? На каждом шаге алгоритм отбрасывает половину оставшихся элементов. Для массива из n элементов максимальное число сравнений равно log₂(n).
Применение: Поиск в отсортированных коллекциях, нахождение границ, реализация в стандартных библиотеках (например, Array.firstIndex(of:) для RandomAccessCollection).