Перейти к содержанию

ЛР 2. Бинарный поиск

Тема: Реализация алгоритма бинарного поиска

Цель работы

Реализовать алгоритм бинарного поиска числа в отсортированном массиве с подсчётом количества шагов.

Задание

  • Написать функцию guess_num(num, values), возвращающую найденное число и количество шагов.
  • Если число не найдено — вернуть (None, steps).
  • Написать unit-тесты.

Код

Основная функция

from typing import List, Optional, Tuple


def guess_num(num: int, values: List[int]) -> Tuple[Optional[int], int]:
    low = 0
    high = len(values) - 1
    steps = 0

    while low <= high:
        steps += 1
        mid = (low + high) // 2
        guess = values[mid]

        if guess == num:
            return guess, steps
        elif guess > num:
            high = mid - 1
        else:
            low = mid + 1

    return None, steps


if __name__ == "__main__":
    num = int(input("Введите загаданное число: "))
    low = int(input("Введите нижнюю границу: "))
    high = int(input("Введите верхнюю границу: "))
    values = list(range(low, high + 1))

    result, steps = guess_num(num, values)
    if result is not None:
        print(f"Число найдено: {result} (за {steps} шагов)")
    else:
        print(f"Число не найдено (проверено {steps} шагов)")

Тесты

from lab_2 import guess_num
import unittest


class NumTestCase(unittest.TestCase):
    def test_found_number(self):
        self.assertEqual(guess_num(5, [1, 3, 5, 7, 9]), (5, 1))
        self.assertEqual(guess_num(42, [42]), (42, 1))

    def test_not_found_number(self):
        self.assertEqual(guess_num(4, [1, 3, 5, 7, 9]), (None, 3))
        self.assertEqual(guess_num(10, []), (None, 0))

if __name__ == '__main__':
    unittest.main()

Выводы

Реализован алгоритм бинарного поиска со сложностью O(log n). Функция корректно обрабатывает случаи пустого массива и отсутствия элемента. Подсчёт шагов наглядно демонстрирует эффективность алгоритма.