Найти в Дзене

Бинарный поиск или двоичный поиск

Оглавление

Достаточно простой алгоритм, но лучше его изначально делать просто на цифрах.

Начав изучать bigO я сразу столкнулся с бинарным алгоритмом. Создал массив на от 1 до 100 и начал искать цифру 53. Это оказалось провальным делом, так как массив в голове начал создавать преграды, что привело к лишнему if , который меня и запутал.

За 15 минут я написал вот это "чудо":

Тут часть кода для визуализации. Я сделал для себя визуальную часть версткой, что бы как-то отвлечься пока думаю.

Я начал смотреть ролики разные и ничего не понимал (ппц, как стыдно это писать!!!). Но увидел, что используют while, что дало свой плюс. Еще увидел, что используют минимальное число и максимальное, и при каждой шаге меняется минимальное число или максимальное.

Я решил убрать массив и просто цифрами все сделать.

Двоичный поиск

=============================================================

Вот это все херня собачья, которая сбивает с толку!!!!! Нельзя начинать объяснять алгоритма с нулевого числа!! И в круглых числах нельзя, так как ответ становится слишком очевиден и мозг не успевает формулу вывести!

Нить моих рассуждений:

Искомое число = 55;
Минимальное число = 0
Максимальное число = 100;

0(мин) --------- 100(макс)

100 делим на 2 = 50(новое мин)

50(новое мин) - не то число, что мы ищем, но оно меньше нужного. Раз оно меньше, то давайте его поместим на место минимального числа.

============================================================

Вот нужное!!

Искомое число = 88;
Минимальное число = 46
Максимальное число = 98;

46 (мин)--------- 98 (макс)

Наша задача найти промежуточное число между 46(мин) и 98(макс). Как нам это сделать? Нужно понять сколько имеется шагов с числами между 46(мин) и 98(макс).

Берем максимальное число (98) и вычитаем из него минимальное (46).

макс(98) - мин(46) = 52

Теперь мы знаем, что нужное нам число где-то в 52 шагах после 46(мин).

Но нам нужна серединка, поэтому общую сумму шагов (46) между мин и макс мы делим на 2 и получаем и получаем 26.

26 (сумма шагов до середины) мы складываем с минимальным числом, с которого стартуем (46) и получаем 72.

Общая формула сделанного только что:

(max - min) /2 + min

72 меньше 88, а значит это новое минимальное число.

============================================================

72(мин)--------- 98(макс)

Применяем нашу формулу

(max - min) /2 + min

(98 - 72) /2+ 72

Если где-то встречаете не целое число, то округляйте его в меньшую сторону

Получим в ответ 85 (новое число).

Мы уже знаем, что если 85 (новое число) меньше 88 (искомого числа), то 85(новое число) становится новым минимальным числом.

============================================================

85(мин)--------- 98(макс)

Применяем нашу формулу

(max - min) /2 + min

(98 - 85)/2 + 85

Если где-то встречаете не целое число, то округляйте его в меньшую сторону!

Получим в ответ 91 (новое число)

Теперь мы встретили число, больше искомого (88). Если новое число (91) больше искомого (88), то будет логично записать это новое число в максимальное число

============================================================

85(мин)--------- 91(макс)

Применяем нашу формулу

(max - min) /2 + min

(91 - 85)/2 + 85

Нам всегда нужно целое число, так что не забываем округлять в меньшую сторону!

Получим в ответ 88 (новое число)

Вот оно ровно искомому (88).

============================================================

Общая формула :

какие будут участвовать числа:

min - минимальное число

max- максимальное число

search- искомое число

new- новое число

(max - min) / 2 + min = new

if (new > search) { max = new}

if (new < search) {min = new}

Я изначально сделал огромную глупость начав отчет с числа, которое делило ровно по полам максимальное число, но переписал текст. Надеюсь это было не зря и людям это поможет!

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

https://zigtelus.github.io/Binary_search/

Еще хотел сделать сайт где будет можно ввести любое число и будет демонстрация всех этапов, но посмотрим сколько эта публикация наберет. Пока дал ссылку (выше) на мини версию того, что хочу сделать

Пойти на хабр это запилить, что ли...

Кста. вот ссылка на конечный код https://github.com/Zigtelus/Binary_search/blob/main/index.html

javascript #разработкасайтов #разработка #программирвоаниеснуля #программирование

Мой телеграмм канал - нажмите, что бы перейти

Приходите в мой телеграмм канал. Там я меньше публикую пустой чепухи, которую тут публикую для привлечения новой аудитории и принимаю заказы на лендинг (пока только по ним). Так же я перестану выкладывать в Дзен, как только сделаю себе удовлетворяющий всем моим потребностям сайт. Дзен очень сильно глючит и работать с ним становится сложнее с каждым днем.

Если вы прочли это до конца, вам будет интересно прочесть и это:

  1. Как я добивался повышения - нажмите для перехода
  2. Мне дали должность разработчика - нажмите для перехода по ссылке
  3. Дали интересный проект на работе - нажмите для перехода по ссылке
  4. Как запустить проект на React и залить на хостинг - нажмите для перехода по ссылке
  5. Как учить английский слова - нажмите для перехода по ссылке
  6. Как найти работу новичку в IT - нажмите для перехода по ссылке
  7. На сколько сильно помогает генетическая одаренность в АйТи - нажмите для перехода по ссылке
  8. Как стоит начать учить React - нажмите для перехода по ссылке
  9. Первая сложность по React - нажмите для перехода по ссылке