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

Какая сложность поиска элемента в массиве?

1.3 Junior🔥 171 комментариев
#Python Core

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

# Сложность поиска элемента в массиве

Ответ: O(n) для неупорядоченного массива

Сложность поиска элемента в массиве зависит от типа массива и метода поиска:

1. Линейный поиск в неупорядоченном массиве: O(n)

При поиске элемента в обычном неупорядоченном списке нужно проверить все элементы в худшем случае:

def linear_search(arr, target):
    for i in range(len(arr)):  # O(n) итераций
        if arr[i] == target:
            return i
    return -1

# Анализ сложности:
# - Лучший случай: O(1) — элемент первый
# - Средний случай: O(n/2) = O(n) — элемент в середине
# - Худший случай: O(n) — элемента нет или он в конце

arr = [3, 7, 2, 9, 1]
print(linear_search(arr, 9))  # 3
print(linear_search(arr, 5))  # -1

2. Бинарный поиск в отсортированном массиве: O(log n)

Если массив отсортирован, можем использовать бинарный поиск:

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

# Анализ сложности:
# - Лучший случай: O(1) — элемент в середине
# - Средний случай: O(log n) — типичный случай
# - Худший случай: O(log n) — элемента нет

arr = [1, 2, 3, 5, 7, 9, 11]
print(binary_search(arr, 7))   # 4
print(binary_search(arr, 8))   # -1

Встроенные методы Python

list.index() — O(n)

arr = [3, 7, 2, 9, 1]
index = arr.index(9)  # O(n) — линейный поиск
print(index)  # 3

# Если элемента нет, выбросит ValueError
try:
    arr.index(5)
except ValueError:
    print('Элемента нет')

in operator — O(n) для списков, O(1) для множеств

arr = [3, 7, 2, 9, 1]
print(9 in arr)  # True, O(n)

# Для быстрого поиска используй множество
set_arr = {3, 7, 2, 9, 1}
print(9 in set_arr)  # True, O(1) в среднем!

bisect — O(log n) для отсортированных массивов

import bisect

arr = [1, 2, 3, 5, 7, 9, 11]

# Найти позицию элемента
pos = bisect.bisect_left(arr, 7)  # O(log n)
print(pos)  # 4

if arr[pos] == 7:
    print('Найден!', pos)

Сравнение сложностей

МетодСложностьУсловияПримечание
Линейный поискO(n)Любой массивПростой, универсальный
Бинарный поискO(log n)ОтсортированныйБыстрый для больших данных
Хеш-таблица (set/dict)O(1) среднийХешированиеИдеально для поиска
Отсортированный список + bisectO(log n)ОтсортированныйВстроенная оптимизация

Практический пример: когда разница видна

import time
import bisect

# Создаём большой массив
arr = list(range(1000000))

# Способ 1: Линейный поиск в списке
start = time.time()
if 999999 in arr:
    found = True
linear_time = time.time() - start
print(f'Линейный поиск (in): {linear_time:.6f}с')  # ~0.01-0.02с

# Способ 2: Поиск в множестве
arr_set = set(arr)
start = time.time()
if 999999 in arr_set:
    found = True
set_time = time.time() - start
print(f'Поиск в множестве: {set_time:.6f}с')  # ~0.000001с

# Способ 3: Бинарный поиск
arr_sorted = sorted(arr)  # Уже отсортирован
start = time.time()
pos = bisect.bisect_left(arr_sorted, 999999)
binary_time = time.time() - start
print(f'Бинарный поиск: {binary_time:.6f}с')  # ~0.000001с

print(f'\nОтношение скоростей:')
print(f'Линейный vs Множество: {linear_time/set_time:.0f}x быстрее')
print(f'Линейный vs Бинарный: {linear_time/binary_time:.0f}x быстрее')

Рекомендации

Используй линейный поиск (in, index) когда:

  • Массив маленький (< 1000 элементов)
  • Нужна гибкость и простота
  • Масло часто меняется

Используй бинарный поиск (bisect) когда:

  • Массив отсортирован
  • Массив большой
  • Нужна предсказуемая O(log n) скорость

Используй хеш-таблицу (set, dict) когда:

  • Нужна максимальная скорость поиска
  • Нужно хранить уникальные элементы
  • Порядок не важен

Итог

Сложность поиска элемента в неупорядоченном массиве составляет O(n). Для оптимизации используйте структуры данных, подходящие под конкретную задачу: множества для быстрого поиска, отсортированные массивы для бинарного поиска.

Какая сложность поиска элемента в массиве? | PrepBro