Поиск — это стандартная операция в информатике, которая предполагает нахождение конкретного значения среди множества других значений. Существует два распространённых алгоритма для этой операции: линейный поиск и двоичный поиск.
Линейный поиск:
- При линейном поиске вы начинаете с первого элемента и сравниваете каждый элемент с целевым значением, пока не найдете совпадение.
- Временная сложность: O(n).
Как это работает:
- Начните с первого элемента массива.
- Сравните целевое значение с текущим элементом.
- Если оно соответствует, верните индекс.
- Если нет, перейдите к следующему элементу.
- Повторяйте шаги 2–4, пока не найдете цель или не достигнете конца массива.
Производительность:
- Временная сложность равна O(n), поскольку в худшем случае проверяется каждый элемент массива.
- Нет требований к сортировке массива.
Бинарный поиск:
- При двоичном поиске массив необходимо отсортировать. Вы неоднократно делите массив пополам, пока не будет найдено значение.
- Временная сложность: O(log n).
Как это работает:
- Перед использованием двоичного поиска массив необходимо отсортировать.
- Начните с установки двух указателей: одного в начале (слева) и одного в конце (справа) массива.
- Найдите средний элемент.
- Сравните средний элемент с целью.
- Если оно соответствует, верните индекс.
- Если цель больше среднего элемента, переместите левый указатель в середину + 1.
- Если цель меньше среднего элемента, переместите правый указатель в середину — 1.
- Повторяйте шаги 3–7, пока не найдете цель или перекрестие указателей (слева > справа).
Производительность:
- Временная сложность равна O(log n), поскольку она эффективно уменьшает пространство поиска вдвое с каждой итерацией.
- Требуется сортировка массива.
- Линейный поиск
- Пример
- Бинарный поиск
- Пример
- Реализация двоичного поиска без функции
- Пример
- Сравнение линейного и двоичного поиска
Линейный поиск
Вот пошаговое руководство по реализации алгоритма линейного поиска в Python:
def linear_search(arr, target): # Loop through each element in the array for index, element in enumerate(arr): # If the element matches the target, return the index if element == target: return index # If the loop finishes, the target was not found return -1
Пример
Давайте напишем программу на Python для линейного поиска, чтобы найти индекс целевого значения в массиве.
def linear_search(arr, target): for index, element in enumerate(arr): if element == target: return index return -1 # Example array and target value arr = [4, 2, 7, 1, 9, 3] target = 7 # Call the linear_search function index = linear_search(arr, target) # Output the result if index != -1: print(f"Element {target} found at index {index}") else: print(f"Element {target} not found in the array")
Вы можете увидеть результат:
Бинарный поиск
Вот пошаговое руководство по реализации двоичного поиска с помощью функции:
def binary_search(arr, target): left, right = 0, len(arr) - 1 # Continue the search while the left index is less than or equal to the right index while left <= right: mid =(left + right) // 2 # Check if the target is present at mid if arr[mid] == target: return mid # If target is greater, ignore the left half elif arr[mid] < target: left = mid + 1 # If target is smaller, ignore the right half else: right = mid - 1 # If we reach here, the element was not present return -1
Пример
Давайте рассмотрим программу Python для реализации двоичного поиска с использованием приведенной выше функции.
def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid =(left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # Example sorted array and target value arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] target = 6 # Call the binary_search function index = binary_search(arr, target) # Output the result if index != -1: print(f"Element {target} found at index {index}") else: print(f"Element {target} not found in the array")
Вы можете увидеть результат, как показано ниже:
Реализация двоичного поиска без функции
Вот как можно написать программу на Python для реализации двоичного поиска без использования функции.
Пример
# Example sorted array and target value arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] target = 6 # Set initial left and right indices left, right = 0, len(arr) - 1 # Binary search without function while left <= right: mid =(left + right) // 2 # Check if target is present at mid if arr[mid] == target: print(f"Element {target} found at index {mid}") break # If target is greater, ignore the left half elif arr[mid] < target: left = mid + 1 # If target is smaller, ignore the right half else: right = mid - 1 else: print(f"Element {target} not found in the array")
Вы можете увидеть результат ниже на скриншоте.
Сравнение линейного и двоичного поиска
Вот сравнение линейного поиска и двоичного поиска в Python в табличном формате:
Аспект | Линейный поиск | Бинарный поиск |
---|---|---|
Тип алгоритма | Последовательный поиск | Интервальный поиск |
Как это работает | Последовательно проверяет каждый элемент на соответствие | Повторно делит интервал поиска пополам |
Требуются отсортированные данные | Нет, работает как с отсортированными, так и с несортированными массивами. | Да, работает только с отсортированными массивами. |
Временная сложность | На) | О(логарифм n) |
Космическая сложность | О(1) | О(1) |
Выполнение | Полегче | Немного сложнее |
Производительность | Медленнее для больших наборов данных | Быстрее для больших наборов данных |
Лучший сценарий | O(1), когда элемент находится в первой позиции | O(1), когда элемент находится в средней позиции |
В худшем случае | O(n), когда элемент находится в последней позиции или отсутствует | О(логарифм n) |
Случаи использования | Маленькие наборы данных, несортированные данные | Большие наборы данных, отсортированные данные |