Алгоритм бинарного/двоичного поиска. (Binary search algorithm)

В этом видео вы найдете реализацию алгоритма "Бинарный поиск", и так же его применение на нескольких примерах.
Группа ВК - windert0n
Twitch - / winderton
Twitter - / windert0n
Github - github.com/Winderton

Пікірлер: 83

  • @Neboyarsky
    @Neboyarsky5 жыл бұрын

    наконец-то простое и понятное объяснение реализации алгоритма, спасибо автору

  • @user-hg1oj9yu9o
    @user-hg1oj9yu9o5 жыл бұрын

    Есть реализация попроще: Пусть l - левая граница, r - правая, m - середина, x - искомое число: while(r-l>1){ m = (l+r)/2; m>=x? r = m : l = m; } cout

  • @user-yi2id1zg7r
    @user-yi2id1zg7r7 жыл бұрын

    Спасибо, очень познавательно.

  • @Fovaxus
    @Fovaxus5 жыл бұрын

    Видео - ТОП! Спасибо огромное!

  • @user-qx3qz1vs9f
    @user-qx3qz1vs9f4 жыл бұрын

    Это било реально круто. Мне уже разказавали бинарний поиск , но я не знал даже что такое массив. Я вроде понял , но очень плохо(тогда). Первую функцию я понял сразу(потому что я её видел уже). С грубой силой тупил и пересмотрел и понял. Посмотря дважды видео , я очень рад , что я понял. Спасибо.

  • @user-mw3eq1kr7e
    @user-mw3eq1kr7e6 жыл бұрын

    Спасибо за контент, с меня лайк и коммент. Удачи !

  • @wepko
    @wepko5 жыл бұрын

    Да круто,я его как рас спомнил и тут ты пронего рассказываешь cs50, класс

  • @icaruspadlus7970
    @icaruspadlus79707 жыл бұрын

    молодец...и речь приятная, слушать легко.

  • @vadimf8301
    @vadimf83016 жыл бұрын

    прикольный пример использования алгоритма

  • @kushvad998
    @kushvad9986 ай бұрын

    В строке "int mid = (low + high) / 2;" правильнее писать "int mid = low + (high - low) / 2;". Поскольку при огромном количестве элементов в массиве numbers возможно переполнение индекса mid.

  • @dastanomirgali2296
    @dastanomirgali22967 жыл бұрын

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

  • @mdreal3264
    @mdreal32645 жыл бұрын

    Да ждал когда ты закончешь. :-)

  • @ymnik100
    @ymnik1007 жыл бұрын

    epicilon:)

  • @izualno_oname7234

    @izualno_oname7234

    5 жыл бұрын

    +1 Поржал)

  • @egormatuk6462
    @egormatuk64625 жыл бұрын

    кстати, а если нужно найти минимальные значения массивов и потом количество минимальных элементов, как тогда быть?Это надо сначала найти минимальный элемент, без помощи бинарного поиска, а уже потом искать их количество с помощью бинарного поиска, или можно просто в бинарном поиске найти минимальный элемент, и там же его количество в массиве? прошу очень важно

  • @uncle-xxi
    @uncle-xxi7 жыл бұрын

    Немаловажный нюанс - бинарный поиск будет работать только на отсортированных/поиндексированных данных...

  • @yehorpidhornyi9999

    @yehorpidhornyi9999

    7 жыл бұрын

    5:52

  • @Fovaxus

    @Fovaxus

    5 жыл бұрын

    Об этом говорилось в видео

  • @_l.e.n.y_4956

    @_l.e.n.y_4956

    2 жыл бұрын

    Не обязательно. Список может быть не отсортированый, но походу добавления в список новых значений надо сортировать

  • @misana77
    @misana775 жыл бұрын

    Передавать вектор по значению, а не по константной ссылке - это пиздец)

  • @user-gv1zx8cq4l

    @user-gv1zx8cq4l

    5 жыл бұрын

    Больше памяти занимает и время исполнения немного больше)

  • @qwerty89993
    @qwerty899939 ай бұрын

    спасибо!

  • @KybaLioN66
    @KybaLioN668 жыл бұрын

    thank you

  • @SochiGreen
    @SochiGreen7 жыл бұрын

    Спасибо за видео. Было бы круто прикреплять код из видео в описании под ним.

  • @wndtn

    @wndtn

    7 жыл бұрын

    Я обычно так и делаю. Эти исходники тоже прикреплю.

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov5 жыл бұрын

    спасибо

  • @venci6245
    @venci62455 жыл бұрын

    Привет Win, а если вектор будет из 9 значений, то mid будет равен 4.5. Затем ты эти 4.5 передашь в индекс, то что будет тогда ?

  • @dm3y434

    @dm3y434

    5 жыл бұрын

    Значение интовское, и округлится до 4

  • @ihopeuhatemeback3766
    @ihopeuhatemeback37667 жыл бұрын

    А как сделать чтобы корректно работало, если в массиве есть повторяющиеся элементы? Или по плану бинарный поиск должен показывать только первый по счету элемент, даже если их два и больше

  • @4AneR

    @4AneR

    7 жыл бұрын

    Бинарный поиск работает в отсортированном массиве, т.е. если нужно найти все числа "4", а их в массиве несколько, то массив имеет вид ... , 4, 4, 4, 4, 4, 4, .... Наш бинарный поиск найдет одну из этих четверок, чтобы найти остальные, можно в циклу пройти вперед/назад по массиву и найти их все. Или можно немного усложнить бинарный поиск. После того как он найдет четверку (например, найдет ... , 4, 4, 4, [4], 4, 4, .... ), после цикла while(low

  • @nikitafrolov7668
    @nikitafrolov76687 жыл бұрын

    На сколько итераций алгоритм Ньютона для вычисления кк. был бы тут эффективнее/не эффективнее?

  • @DiamondSane

    @DiamondSane

    7 жыл бұрын

    Асимптотические сложности этих методов разные, метод бинарного поиска дал бы линейную сходимость(см вики) здесь, тк. на каждой итерации мы находим по сути ещё один значащий бит квадратного корня в двоичном представлении. Скорость сходимости в методе Ньютона зависит от величины шага в разностном приближении производной, если мы вычисляем её значение по разностной схеме. Так можно получить более быструю сходимость в смысле количества итераций, но здесь не учитывается разности во времени для выполнения одной итерации. Если мы берём аналитический вид, производной интересной нам функции, то можно ещё ускорить сходимость, вплоть до квадратичной, но проблема с ними в том, что возможна расходимость, при неудачном выборе начального приближения. На практике даже если мы возьмем четверную точность, в котором на мантиссу отведено 112 бит, то метод двоичного поиска даст нам максимально точный ответ где-то за 112 с небольшим(потому что нужно знать ещё и порядок числа) итераций, но вообще копать этот вопрос можно до бесконечности. Это всё применительно к данному уравнению. Ни метод Ньютона, ни метод дихотомии не гарантируют нахождения нулей для произвольных функций.

  • @evan_ry
    @evan_ry7 жыл бұрын

    Какой микрофон используешь?

  • @wndtn

    @wndtn

    7 жыл бұрын

    audio technica at2020

  • @evan_ry

    @evan_ry

    7 жыл бұрын

    Благодарю

  • @tagil1234567

    @tagil1234567

    7 жыл бұрын

    +Winderton есть ли в планах видео о работе с OGL, SDL и прочим?

  • @wndtn

    @wndtn

    7 жыл бұрын

    SDL, GLFW будут. Вторая, точно будет. Я на ее основе буду движок делать, а c помощью SDL на С игру напишем.

  • @xelaksal6690
    @xelaksal66906 жыл бұрын

    Гууд

  • @Postoronnim_B
    @Postoronnim_B2 жыл бұрын

    А если сложить время/итерации затраченные на сортировку массива из 1 000 000 миллиона строк и бинарный поиск в нем, выигрыш все еще остается?

  • @user-ye7vc6ug1l
    @user-ye7vc6ug1l5 жыл бұрын

    Спсб

  • @KKHProduction
    @KKHProduction7 жыл бұрын

    Когда ты говорил про линейный поиск, ты говорил про какой-то Эписилон, ты имел ввиду Эпсилон? en.wikipedia.org/wiki/Epsilon

  • @wndtn

    @wndtn

    7 жыл бұрын

    Это долго объяснять, почему я Эпсилон называю "Эписилон", но да, я имел ввиду этот символ.

  • @user-ll2sn8rs3c

    @user-ll2sn8rs3c

    4 жыл бұрын

    @@wndtn расскажешь? Немного жизнености преподавателя мотивирует учеников)

  • @anritverskoi4854
    @anritverskoi48545 жыл бұрын

    Было бы здорово если бы вы выложили код программ для детального анализа....я чайник еще

  • @user-ll2sn8rs3c
    @user-ll2sn8rs3c4 жыл бұрын

    Так а хдежишь описание линейного пути? Говорил выбирать его и не прогадаем :'(

  • @oxotAzapivom
    @oxotAzapivom6 жыл бұрын

    epicilion - это пасхалка либо новая мода?

  • @bespelotnik1950

    @bespelotnik1950

    6 жыл бұрын

    это буква греческого алфавита (только произносится она "эпсилон", не "эписилон")

  • @necolas104
    @necolas1045 жыл бұрын

    Почему у тебя в бинарном поиске в 26 строке high = mid-1, на вики и в других источниках в этом месте high=mid. Насколько я понял, позапускав код, это приводит к лишней итерации. Поправь если не прав

  • @cybelash5231

    @cybelash5231

    5 жыл бұрын

    Да, ты прав. Если ты положишь high = mid, то будешь лишний раз проверять условие для mid, хотя оно и проверено уже.

  • @Al-Mas3000
    @Al-Mas30004 жыл бұрын

    Получается бинарный поиск работает только в упорядоченных массивах?

  • @PurpleDaemon_

    @PurpleDaemon_

    4 жыл бұрын

    Да, соответственно не понимаю как это связано с поиском слова в книге.

  • @user-ml4ec8bf9w

    @user-ml4ec8bf9w

    4 жыл бұрын

    @@PurpleDaemon_ речь о телефонном справочнике..

  • @ivankupnevskij4370
    @ivankupnevskij43704 жыл бұрын

    алгоритм нахождение корня немного другой. во всяком случае я видел более грамотный подход в одной математической статейке где описывалось возведение в дробную степень.

  • @user-wj4rr3ob2z
    @user-wj4rr3ob2z5 жыл бұрын

    Ссылку бы

  • @stakemograine266
    @stakemograine2665 жыл бұрын

    if (pow(ans, 2) == ans*ans) cout

  • @robertnewman8824
    @robertnewman8824 Жыл бұрын

    Пожалуйста погромче звук записывайте

  • @Mishail04
    @Mishail045 жыл бұрын

    Бинарный квадратный корень для a

  • @funnyh0rr0r31

    @funnyh0rr0r31

    5 жыл бұрын

    Разве добавление условия а ля if 0

  • @cybelash5231

    @cybelash5231

    5 жыл бұрын

    Будет! Только нужно применять метод не напрямую к a

  • @cppprograms5868
    @cppprograms58683 жыл бұрын

    С++

  • @user-xu7nc4fc2i
    @user-xu7nc4fc2i7 жыл бұрын

    К сожалению, я не понял смысл в цикле, в нахождении корня грубой силой.

  • @Wi1dLife

    @Wi1dLife

    7 жыл бұрын

    он перебирает числа с определённым шагом, возводит их в квадрат и сравнивает с а

  • @cybelash5231

    @cybelash5231

    5 жыл бұрын

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

  • @Starponyx
    @Starponyx6 жыл бұрын

    Это второй курс универа. Один из смыслов получить вышку.

  • @freedomtv2295

    @freedomtv2295

    6 жыл бұрын

    Паша Захаров это уровень сложности девятый класс в школе . В универе на втором курсе будете уже ООП во всю заниматься)

  • @kayman3415

    @kayman3415

    5 жыл бұрын

    @@freedomtv2295 Я как ученик 9 класса, заявляю, то что это не правда )))Мы на Pascal'e ещё функции и массивы не начали проходить ))

  • @Nickell.

    @Nickell.

    5 жыл бұрын

    Занимался ООП во всю на третьем курсе колледжа, полность согласен, то что в видео - уровень 9-11 класса. Только вот они там это проходить не будут, там это не надо.

  • @phskr
    @phskr5 жыл бұрын

    Отличный пример конченного использования маджик намберов

  • @cabling1205
    @cabling1205 Жыл бұрын

    вычисляя корень из 100 получаю 9.999... эх

  • @i.am.rossalex
    @i.am.rossalex6 жыл бұрын

    Это матиматика, "метод половинного деления"

  • @cybelash5231

    @cybelash5231

    5 жыл бұрын

    Хоть горшком назови

  • @bakytbektashov4488
    @bakytbektashov44886 жыл бұрын

    какой язык программирования

  • @dimonidze

    @dimonidze

    6 жыл бұрын

    с++

  • @ruslanvolovik2745

    @ruslanvolovik2745

    4 жыл бұрын

    С--

  • @ruslanvolovik2745

    @ruslanvolovik2745

    4 жыл бұрын

    Даже не знаю

  • @lisafox9026
    @lisafox90265 жыл бұрын

    Ну на черной теме так плохо видно на маленьком ноутбуке, неужели вы не просматриваете свое видео? на работе не могу во весь экран смотреть, а на маленьком не видно, поэтому дизлайк.

  • @hydrock9738
    @hydrock97385 жыл бұрын

    Странный пример с книгой и именем

  • @phskr

    @phskr

    5 жыл бұрын

    Я думаю, он имел ввиду словарь.

  • @johnashley5960
    @johnashley59605 жыл бұрын

    реализация бинарного поиска - хуйня. попробуй нулевой массив передать, например

  • @johnashley5960

    @johnashley5960

    5 жыл бұрын

    template // вектор сука разный может быть, с разным аллокатором, например T *binary(const V &n, T x) { // вектор по ссылке сука size_t first, last, mid; first = 0; last = n.size(); //никаких ноль минус один сука, никаких интежер оверфлоу while (first mid = first + (last-first)/2; // никаких сука я сказал if (x last = mid; } else if (x > n[mid]) { first = mid + 1; } else { return const_cast(&n[mid]); // и возвращаем блять указатель, а не найдено/не найдено } } return nullptr; } и не надо ебаться с итераторами у контейнера, они в данном случае замедляют поиск выкладываю, потому что полно ебанутых реализаций (таких как твоя) и заебало ловить сегфолты в говноприложениях

  • @johnashley5960

    @johnashley5960

    5 жыл бұрын

    и нахуя оно выдаёт true или false? можно тот же стл использовать для этого. алгоритм выше для того, что бы обойти ограничение, вызванное предикатом, в функции lower_bound

Келесі