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


Рассмотрим пример того, как работает бинарный поиск.

Сыграем в простую игру: я загадал число от 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}")