Бинарный поиск.
Рассмотрим пример того, как работает бинарный поиск.
Сыграем в простую игру: я загадал число от 1 до 100. Вы должны отгадать моё число, использовав как можно меньше попыток. При каждой попытке я буду давать один из трёх ответов: "мало", "много" или "угадал".
Существует эффективный поиск. Начинать поиск нужно с половины, тем самым сразу исключая половину чисел из поиска. Время выполнения поиска определяет O(log 2 n).
Для сравнения приводится код линейного поиска с временем выполнения O(n).
#################### 1-й блок, в котором компьютер угадывает при помощи бинарного поиска Olog(n) или логарифмическое время
print("%135s" % "#################################################")
print("%135s" % "Компьютер угадывает число пользователя из заданного диапазона с помощью бинарного поиска + сравнение с простым линейным алгоритмом.")
print("%135s" % "#################################################")
print()
print()
print("%135s" % "#################################################")
a = int(input("%136s" % "Задайте начало диапазона (не меньше 1), на пример: 1 = "))
b = int(input("%136s" % "Задайте конец диапазона, на пример: 100 = "))
x = int(input("%136s" % "Загадайте число в этом диапазоне = "))
print("%135s" % "#################################################")
print()
while x < a or x > b: # проверка входных данных
print("%135s" % "#################################################\n")
x = int(input("%136s" % "Загадайте число, которое будет соответствовать диапазону. Вы ввели число вне диапазона:"))
print("%135s" % "#################################################\n")
print()
print("%135s" % "#################################################")
print("%135s" % "Компьютер угадывает число пользователя из заданного диапазона алгоритмом бинарного поиска.")
count = 0 # количество попыток
i = 0 # переменная для сравнения с заданным числом (новый расчёт с каждой итерацией)
while i != x: # запускает цикл для перебора значений
count += 1 # количество попыток (работает счётчик)
i = int((b - a + 1) / 2 + 0.5) # формула подсчёта нового значения для переменной для сравнения и искомым числом
print("%135s" % f"Попытка № {count} предполагаемое число {i}")
if i == x: # число угадано
print("%135s" % f"Ваше число = {x} отгадано с {count} -й попытки")
elif i > x: # направление поиска в меньшую сторону
b = i - 1
elif i < x: # направление поиска в большую сторону
a = (i * (-1) + 1)
print("%135s" % "#################################################")
print()
print()
#################### 2-й блок, в котором компьютер угадывает путём простого перебора O(n) или линейное время
print("%135s" % "#################################################")
print("%135s" % "Компьютер угадывает число пользователя из заданного диапазона с помощью простого перебора.")
i = 0
count = 0
while i != x:
count +=1
i += 1
if i == x:
print("%135s" % f"Ваше число = {x} отгадано с {count} -й попытки")
print("%135s" % "#################################################")
print()
print()
#################### 3-й блок, в котором угадывает пользователь
import random # подгружаем модуль
print("%135s" % "#################################################")
print("%135s" % "Пользователь угадывает рандомное число от 1 до 100")
print("%135s" % "#################################################")
x = random.randint(1,100) # генерируем случайное число в диапазоне от 0 до 100
trying = 1
less = "искомое число меньше"
more = "искомое число больше"
while x != (answer := int(input("%136s" % "Введите целое число: "))):
trying += 1
print("%135s" % less) if answer > x else print("%135s" % more)
print("%135s" % f"Всего попыток {trying}")