Алгоритмы на Python 3 - Бинарный-Двоичный Поиск / Binary Search - Знать для Интервью

Поделиться
HTML-код
  • Опубликовано: 13 окт 2024

Комментарии • 140

  • @ШамильДжакеев
    @ШамильДжакеев 6 лет назад +49

    Приятель, курс как ты и сказал, не для начинающих, как по мне ты прилагаешь слишком много усилий)). Все понятно, все изи с такой шикарной презентацией. Keep calm)

    • @ADV-IT
      @ADV-IT  6 лет назад +3

      Спасибо!

  • @AlexanderWaal
    @AlexanderWaal 4 года назад +11

    Если бы в каждом университете в мире объясняли бы всё как ты, то программистов было бы больше...но нет, нужно же мудрить. Спасибо за твои видео на ютубе )

    • @ADV-IT
      @ADV-IT  4 года назад +1

      Спасибо!

  • @maxim7603
    @maxim7603 4 года назад +5

    В комментах выше люди пишут, что не находит 10. Для того чтобы нормально работало, надо сделать return str(mid)
    просто если mid = 0 , то он равен False (0 == False)
    В самой функции нет ошибок, она индекс находит как надо
    И кстати, спасибо за урок, презентация максимально понятная

  • @АлекКаз
    @АлекКаз Год назад +1

    интересный подход с использованием функции у тебя . молодец!

  • @nokiqward6333
    @nokiqward6333 2 года назад +1

    прошло столько времени, ты до сих пор обучаешь людей ( меня )

    • @ADV-IT
      @ADV-IT  2 года назад

      Всё еще стараюсь делится нужными знаниями и менять жизнь других людей

  • @maksimvolkov8892
    @maksimvolkov8892 4 года назад +3

    Объяснение куда лучше, чем в платных курсах

  • @xrilicc1154
    @xrilicc1154 3 года назад +2

    Как всегда топ, решил начать изучать алгоритмы. Твоя простая подача, для новичков как я самое то

  • @jamesongold7917
    @jamesongold7917 2 года назад +1

    Благодарю за видео, очень продуктивно
    Очень хорошо пояснил

  • @ХайбулаОмаров-ц8ж
    @ХайбулаОмаров-ц8ж 3 года назад +1

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

  • @ИзтореКаргабаев
    @ИзтореКаргабаев 3 года назад +1

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

  • @sorrowfulwolf9987
    @sorrowfulwolf9987 3 года назад +5

    Вас показывали в нашей школе, очень хороший урок , такая сложная тема объяснена такими лёгкими словами.

    • @redcomrade7076
      @redcomrade7076 3 года назад +2

      Да , в нашей тоже показывали.

    • @alexeykhristolyubov8746
      @alexeykhristolyubov8746 3 года назад +2

      Да,у нас тоже показывали,было интересно!

    • @sorrowfulwolf9987
      @sorrowfulwolf9987 3 года назад +2

      Ребята, может быть у нас одна школа? 🤔

    • @alexeykhristolyubov8746
      @alexeykhristolyubov8746 3 года назад +1

      @@redcomrade7076 Вау,вот это совпадение.Я в шоке.Насколько тесен мир

    • @alexeykhristolyubov8746
      @alexeykhristolyubov8746 3 года назад +1

      @@sorrowfulwolf9987 Хм,сомневаюсь,я из Чебоксар

  • @СергейСинюк-и5м
    @СергейСинюк-и5м Год назад

    Небольшая ошибка в коде( если уже писали простите нет времени перечитывать все комментарии)
    Если писать так как вы написали то число которое больше значения mylist[stop] (начального) - будет бесконечная рекурсия. (точнее до ограничения вложенности) - Вариант исправления.
    def bin_find(lst: list, find, start, stop):
    if start == stop:
    return False
    else:
    midl = (start + stop) // 2
    if lst[midl] == find:
    return midl
    elif find < lst[midl]:
    return bin_find(lst, find, start=start, stop=midl - 1)
    else:
    return bin_find(lst, find, start=midl + 1, stop=stop)
    lout = [1, 2, 3]
    print(bin_find(lout, 22, 0, len(lout))))

  • @vadim3042
    @vadim3042 5 лет назад +1

    Спасибо огромное. По видео быстрее получается разобраться, чем по книге. + доступным языком все рассказано.

  • @artfil5781
    @artfil5781 6 лет назад +16

    stop должен быть равен len(list) - 1

  • @vladimirantonov4506
    @vladimirantonov4506 2 года назад

    Благодаря Вам я нашёл ошибку в своём коде :) Благодарю за подробное изложение!

    • @ADV-IT
      @ADV-IT  2 года назад

      Рад слышать!

  • @Max-rq3ui
    @Max-rq3ui 3 года назад +1

    очень спасибо. доступно и легко. респект!

  • @АлександрДуров-т1ю
    @АлександрДуров-т1ю 4 года назад +1

    Большое спасибо вам за ваш обучающий контент

  • @МаксимХрамцов-к8щ
    @МаксимХрамцов-к8щ 7 лет назад +1

    Отличные уроки , друг - спасибо за труд. Продолжай.

  • @ВигенОганесян-к3в
    @ВигенОганесян-к3в 6 лет назад +2

    Всё отлично и понятно, только меньше нервов

  • @xrilicc1154
    @xrilicc1154 3 года назад +1

    11:06 бро, у тебя получилось🤝

  • @azimabdullayev4606
    @azimabdullayev4606 5 лет назад +1

    Огромное спасибо, всё чётко и понятно 👍👍👍

  • @АлексейКовалев-ы6ю
    @АлексейКовалев-ы6ю 5 лет назад +2

    Чувак, это все очень круто. Спасибо.

  • @samplename8911
    @samplename8911 4 года назад

    Не искало многие элементы, по итогу немного дополнил код и теперь ищет всё.
    massiv = [1,2,3,5,6,7,9,12,65]
    iskat = input("ENTER ")
    iskat = int(iskat)
    start = 0
    stop = len(massiv) - 1
    def bSearch(massiv, iskat, start, stop):
    if start > stop:
    return -1
    else:
    mid = (start + stop) // 2
    print(mid)
    if iskat == massiv[mid]:
    return mid
    elif iskat < massiv[mid]:
    stop = mid
    return bSearch(massiv, iskat, start, stop)
    else:
    start = mid
    return bSearch(massiv, iskat, start, stop)
    x = bSearch(massiv, iskat, start, stop)
    if x == -1:
    print("NOT FOUND")
    else:
    print("FOUND ON ", x)

  • @DrZlad
    @DrZlad 5 лет назад +2

    Автор - Большое тебе СПАСИБО!!!

  • @Brainsburn
    @Brainsburn 6 лет назад +7

    зануда mode on. 33 - не цифра :) зануда mode off. В целом, интересно, спасибо за материал!

  • @Typhoon_G
    @Typhoon_G 4 года назад +1

    Всё просто и понятно, спасибо автору :)

  • @MrElektrovatt
    @MrElektrovatt 4 года назад +1

    Отличная подача, спасибо

  • @eugenex8892
    @eugenex8892 6 лет назад +5

    А ещё алгоритм бинано-двоичного поиска бажный до жутиков.
    1) Если написать в поиск первый элемент - 10, то он его не найдёт
    2) Если написать в поиск скажем - 9 или 82, то он улетит в бесконечную рекурсию.
    Ыыыть 😊

    • @99nine65
      @99nine65 3 года назад

      принты вместо ретурна делаешь и находит

    • @ZergStylexDD
      @ZergStylexDD 3 года назад +1

      1) if x == False замени на if x is False:
      2) len(mylist) замени на len(mylist) - 1

  • @dmitrytsmyh5971
    @dmitrytsmyh5971 5 лет назад +2

    stop в коде необходимо ставить len(mylist)-1, как ты показывал в презентации, т.е. последний индекс. Если оставить len(mylist) и поиск числа больше, чем самое большое, тогда ошибка.

  • @ilya71369
    @ilya71369 5 лет назад +2

    Спасибо, хорошо рассказываете

  • @GR1D4N
    @GR1D4N 5 лет назад +1

    спасибо большое за ваш труд!!

  • @denvanrain8793
    @denvanrain8793 5 лет назад +1

    Красава!Спасибо! Продолжай дальше!

  • @sergeydanilyuk7952
    @sergeydanilyuk7952 4 года назад +2

    четко

  • @lev8569
    @lev8569 3 года назад +1

    Всем комментаторам кто возможно еще посмотрит это видео. Т.к. в python 0 == False, лучше в случае неудачи возвращайте string и делайте проверку на него. Например: if isinstance(result, int):

  • @remvord
    @remvord 7 лет назад +2

    друг - спасибо за труд

    • @ADV-IT
      @ADV-IT  7 лет назад

      Рад помочь

  • @ДмитрийКоролев-ч8ь
    @ДмитрийКоролев-ч8ь 7 лет назад +1

    Спасибо за уроки! будут ли уроке по сортировке и использованию многофайловых проектов?

  • @nadjakerez5696
    @nadjakerez5696 4 года назад +1

    Спасибо

  • @Диванныйстратег
    @Диванныйстратег 7 лет назад +2

    2:07 Офигеть просто. Смотрел ночью один дома с наушником. Чуть не обосрался, ептвоюж...

    • @ADV-IT
      @ADV-IT  7 лет назад +1

      Сорри :)

  • @puhd4167
    @puhd4167 6 лет назад +1

    классная презентация , суть уловил двоичный поиск работает за линейное время деленое на 2?!)

  • @Кирилл-ц3к4р
    @Кирилл-ц3к4р 2 года назад

    А правильно-ли называть питоновские списки массивами, ведь для реализации именно такой структуры данных, как массив, есть даже отдельный модуль или я что-то путаю?

  • @_pheax
    @_pheax 4 года назад +1

    спасибо, круто обьясняеш

  • @ДмитрийИоржев-в8г
    @ДмитрийИоржев-в8г 4 года назад +1

    Спасибо!

  • @umbr1740
    @umbr1740 4 года назад

    Можно делать до пока start != stop именно по индексу и если это вещ числа то ввести eps примерно 10 ** -9

  • @Bogdan_olmath
    @Bogdan_olmath Год назад +1

    А почему нельзя просто проверить
    print(number in list)?!

    • @ADV-IT
      @ADV-IT  Год назад +1

      Можно конечно, сортировка тоже одной функией работает.
      Это урок про алгоритм поиска. Часто на интервью спрашивают

  • @fantastik1441
    @fantastik1441 4 года назад

    Помимо того, что он не находит нулевой элемент думаю, важным будет отметить, что в массиве может находиться более одного числа с одним и тем же
    значением

    • @ADV-IT
      @ADV-IT  4 года назад

      Бинарный-Двоичный Поиск работает только в отсортированном массиве и находит первое искомое значение.

  • @ПетрНиколаев-л5д
    @ПетрНиколаев-л5д 7 лет назад

    Большое спасибо, отличные уроки, будут ли уроки по Django?

    • @ADV-IT
      @ADV-IT  7 лет назад

      Надо самому еще с django разобраться

  • @FAN_116
    @FAN_116 5 лет назад +2

    Такой код не находит число 10, хотя он есть в массиве(

  • @ladfloss
    @ladfloss 2 года назад +1

    если попробовать число 10 то выдаст not found

  • @Fima993
    @Fima993 5 лет назад +3

    if iskat == mylist[mid]:
    return zashibis

  • @max_ishere
    @max_ishere Год назад

    Очень странный thumbnail... Зачем kali linux и откуда в UNIX системе указывается путь с помощью ':'? Выглядит как-то странно

  • @alexalex219
    @alexalex219 2 года назад

    stop = len(mylist) -1 должно быть

  • @shlm3650
    @shlm3650 5 лет назад

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

    • @ADV-IT
      @ADV-IT  5 лет назад

      лист как глобальную переменную сделай

  • @umbr1740
    @umbr1740 4 года назад

    Почему ты не используешь f строки для вывода удобно ведь

  • @SlavKhachatrian
    @SlavKhachatrian 7 лет назад +1

    у меня почему то ошибка
    def binsearch(mylist, poisk, start, stop):
    if start > stop:
    return False
    else:
    mid = (start + stop) // 2
    if poisk == mylist[mid]:
    return mid
    elif poisk < mylist[mid]:
    return binsearch(mylist, poisk, start, mid - 1)
    else:
    return binsearch(mylist, poisk, mid - 1, stop)
    mylist = [18, 20, 22, 25, 30, 32, 35, 42, 46, 58, 65, 85, 95, 100, 125, 140]
    poisk = 35
    start = 0
    stop = len(mylist)
    x = binsearch(mylist, poisk, start, stop)
    if x == False:
    print("item" + poisk + "not found")
    else:
    print("item" + poisk + "in" + x)

    • @Proff_Preobrazhensky
      @Proff_Preobrazhensky 7 лет назад

      у меня тоже ошибка, набрал все как в видео, вылетает десяток ошибок, у тебя получилось что то исправить???

    • @malenkiy.huligan
      @malenkiy.huligan 7 лет назад

      Внимательно набирайте текст, в функции print(аргумент, аргумент,) в данном случае разделено с помощь запятых, а не +.

    • @thoriumchannel
      @thoriumchannel 6 лет назад

      str()

  • @addequatte
    @addequatte 6 лет назад +2

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

  • @azatmuhitov3098
    @azatmuhitov3098 7 лет назад

    ADV-IT в будет ли такой курс по СИ?

    • @ADV-IT
      @ADV-IT  7 лет назад

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

    • @Proff_Preobrazhensky
      @Proff_Preobrazhensky 7 лет назад

      Скажите, пожалуйста, немного не ясно, как программа понимает, что индекс Х ==20, ведь мы нашли ее, искомое значение у нас равно start = stop = mid, но x= binarysearch(myList, iskat, start,stop), как цифра 20 помещается в индекс Х, эту систему не понял((

    • @ЮрійЗелений-я7н
      @ЮрійЗелений-я7н 6 лет назад

      iskat = 20 , x - это индекс

  • @ВладимирКочетков-щ1т

    Узнать есть ли элемент в массиве:
    >> mylist = [23,412,21]
    >> 23 in mylist
    >>True

    • @ADV-IT
      @ADV-IT  6 лет назад +3

      А теперь вопрос на интервью, напиши алгоритм этого поиска....

  • @ЛевТрегубов-ы6й
    @ЛевТрегубов-ы6й 7 лет назад +1

    Странно, но у меня данная программа не ищет 0-й элемент массива, выдаёт Not Found! Пытаюсь найти ошибку.

    • @ADV-IT
      @ADV-IT  7 лет назад

      Проверил Блин у меня тоже самое, нашел несколько других вариантов алгоритма в разных умных книгах и во всех 0-ой элемент не находит, при этом про это ничего не сказано в самих книгах.

    • @ЛевТрегубов-ы6й
      @ЛевТрегубов-ы6й 7 лет назад

      Ну, в таком случае, если когда-нибудь на собеседовании спросят про такой алгоритм, скажу, что он мне не нравится из-за этого недостатка :) Это тоже демонстрация знаний в какой-то мере, я думаю. А вообще, как найду время нужно будет разобраться с этим, уверен что можно исправить. В любом случае, спасибо за уроки, на мой взгляд самые полезные из тех, что нашёл на Python!)

    • @rugineer
      @rugineer 7 лет назад +4

      Все правильно, потому что для питона 0 == False. Желательно, если элемент не найден возвращать не False (что кстати, не очень правильно, поскольку желательно, чтобы функция возвращала результат одного типа), а например, -1 (поскольку функция поиска всегда будет возвращать положительный индекс, либо 0, если найден первый элемент). И в обработке результатов сравнивать результат с -1 (if x == -1:).

    • @Juan-zw8hy
      @Juan-zw8hy 7 лет назад

      Это не вопрос алгоритма, а того, как он написан и на чем (в данном случае важно как).

    • @АлександрГончаренко-к7ж
      @АлександрГончаренко-к7ж 7 лет назад

      Вы скорее всего абсолютно правы. False в функции и в if-e внизу сменил на любимое автором 'herota' и всё заработало. Скорее всего именно из-за индекса 0 выдаёт False и говорит что не нашел

  • @necr0_d1zzy
    @necr0_d1zzy 3 года назад

    А если то что мы ищем лежит под нулевым индексом, тогда х станет равным 0, что аналогично х равно False, а значит поиск якобы не удался.

  • @АлександрСоломин-г2ь

    Когда пытаюсь найти 10 - выводит то, что его нет в списке. Я так и не понял, как исправить, может кто подскажет?
    number = int(input("Введите, какое значение в списке вы хотели найти: "))
    def binary_search(your_list, item, start, stop):
    if start > stop:
    return False
    mid = (start + stop) // 2
    if item == your_list[mid]:
    return mid
    elif item < your_list[mid]:
    return binary_search(your_list, item, start, mid - 1)
    else:
    return binary_search(your_list, item, mid + 1, stop)
    mylist = [10, 12, 13, 15, 20, 24, 27, 33, 42, 51, 57, 68, 70, 77, 79, 81]
    start = 0
    stop = len(mylist)
    x = binary_search(mylist, number, start, stop)
    if x == False:
    print("Item", number, "not found!")
    else:
    print("Item", number, "found at index ", x)

    • @maxim7603
      @maxim7603 4 года назад

      уже неактуально, но отвечу, мало ли кто тоже захочет узнать
      я ввел в программу
      if 0 == False:
      print(" неожиданно ")
      в общем False равен нулю, поэтому у тебя 10 хоть и нашлось(можно вывести значение функции), но оно попало под 1 условие, выводящее 'not found'
      Чтобы не было проблемы , надо выводить из функции str(mid) , а не mid

  • @АндрейДибин-м4п
    @АндрейДибин-м4п 5 лет назад

    А если есть одинаковые цифры, массив считается отсортированным?

    • @ADV-IT
      @ADV-IT  5 лет назад

      одинаковые числа не сортируются так они одинаковы, значит отсортированы

  • @konstantin3756
    @konstantin3756 7 лет назад

    а как код работал если там ошибка? у меня рекурсия уходила в бесконечность пока ограничитель не ввел. А вообще спасибо ошибка даже помогла лучше понять.

  • @Egortschenko
    @Egortschenko 5 лет назад

    muy bien!!!

  • @firi4737
    @firi4737 3 года назад

    А почему не для начинающих? Сам алгоритм простой, а для написания на питоне нужно знать функции, списки и условный оператор, что начинающий знает

    • @ADV-IT
      @ADV-IT  3 года назад

      Начинающим надо учить простые вещи как польщоваться питоном, а не алгоритмы

  • @Сергей-ъ9ь5р
    @Сергей-ъ9ь5р 4 года назад

    Можно так:
    def binarSort(myList, var):
    f =int(len(myList)//2)
    if var==myList[f]:
    return var
    elif var < myList[f]:
    return binarSort(myList[:f], var)
    else:
    return binarSort(myList[f:], var)

  • @JustDoit-bl6pq
    @JustDoit-bl6pq 5 лет назад

    Как можно вывести значение последнего элемента массива?

    • @JustDoit-bl6pq
      @JustDoit-bl6pq 5 лет назад +1

      mylist[len(mylist)-1]

    • @ADV-IT
      @ADV-IT  5 лет назад

      Можно проще:
      mylist[-1]

  • @ilanpervil8906
    @ilanpervil8906 6 лет назад +1

    Спасибо большое! Наконец токи понял как работает этот алгоритм!
    P.S. в этом алгоритме есть небольшой изъян, дело в том что он НЕ находит "item" под индексом 0. Что-бы все работало, надо немного изменить самые нижние строки кода (точнее, добавить две строки), на вот эти:
    -->>if search == mylist[0]:
    print("Item", search, "found at index:", mylist.index(search))

    • @ADV-IT
      @ADV-IT  6 лет назад +2

      Вроде нормуль!

  • @ERROR-gh4zi
    @ERROR-gh4zi 4 года назад

    Чувак, у тебя ошибка 10:25 stop же равен mid-1 , а они на одной позиции. Да, суть не меняет, но всё же ошибка.

  • @АлександрКосарьков-о1я

    Не может найти первый индекс массива mylist[0] .

  • @neofit3157
    @neofit3157 7 лет назад +5

    слишком много эмоций, мешает, ты хорошо знаешь материал, зачем так нервничать, мы и так дослушаем.

    • @ADV-IT
      @ADV-IT  7 лет назад +4

      Стараюсь

    • @malenkiy.huligan
      @malenkiy.huligan 7 лет назад +1

      Автору респект, продолжай дальше, просто супер объясняешь. Да у меня когда проверял найти 10, 0 элемент, то функция возвращает 0 и при сравнении 0 == False возвращает true и выполняется услови я и выводить результат, что не найдено. Я исправил где проверка
      if start > stop:
      return -1
      И мы получаем (-1) и там сравниваем с -1 в случае если не найдено. Что бы не было логической ошибки.

  • @ThePirateHistory
    @ThePirateHistory 7 лет назад

    Лол, а в чем кек? разве рекурсия не засоряет память, и смысл искать в отсортированном списке, веть проще и как понимаю быстрее пробежаться for? или что-то я не вкурил? просто как не то)

    • @ADV-IT
      @ADV-IT  7 лет назад

      Ну каждый выбирает сам как ему удобно, просто на собеседовании обычно спрашивают "напиши это да посложнее"

    • @ThePirateHistory
      @ThePirateHistory 7 лет назад

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

    • @ADV-IT
      @ADV-IT  7 лет назад +1

      На интервью обычно хотят вые#нутся типа они сами все алгоритмы знают и хотят чтобы ты тоже знал

    • @ThePirateHistory
      @ThePirateHistory 7 лет назад

      Ну яж говорю какие-то додики) бессмысленно!

    • @howuhh8960
      @howuhh8960 7 лет назад

      чувак, просто пробежаться for займет n линейного времени, а двоичный поиск это обычно натуральный лог от н. Посмотрю я на тебя, как ты будешь линейным поиском искать число, которое попало в конец списка из более чем миллиона обьектов.

  • @shlm3650
    @shlm3650 5 лет назад +1

    Мацегет ? Ха!

  • @АлексейСергиевский-в6й

    Привет, алгоритм крут, но вот по пямяти он весьма прожорлев... Каждый раз уходя в рекурсию передаётся список полностью, а что если список длинной несколько тысяч элементов, и там данные не цифры а что ни будь тяжёлое., можно передавать в рекурсию только часть списка, тем самым сократить вразы потребляемую память, правда нужно будет отслеживать направление поиска. И если я не ошибаюсь возвращать рекомендуется одного типа, а то получается нашли число вернули ин-т, не нашли вернули bool ..

  • @гыы-т4ы
    @гыы-т4ы 7 лет назад

    А если вот так?
    def search(A, key):
    for i in range(len(A)):
    if A[i] == key:
    return True
    return i
    return False

  • @Dim-ve9gy
    @Dim-ve9gy 2 года назад +2

    более ужасного преподнесения теории еще не было. "нафиг", "пофиг", "ээээ..." . УЖАС!

  • @daniyarabdykerimov2517
    @daniyarabdykerimov2517 4 года назад

    10 не находит

  • @romanshpilev6449
    @romanshpilev6449 7 лет назад

    Со звуком проблемы

    • @ADV-IT
      @ADV-IT  7 лет назад

      Да, я поздно заметил, через несколько уроков все исправил

  • @priest_of_art
    @priest_of_art 4 года назад

    А нафига вот это вот все если можно написать так:
    print(mylist.index(20))

    • @ADV-IT
      @ADV-IT  4 года назад

      Это совсем разные вещи

  • @CantPickTheNameIwant
    @CantPickTheNameIwant 5 лет назад

    Ораторские навыки у тебя чуть более чем полностью отсутствуют

    • @ADV-IT
      @ADV-IT  5 лет назад +3

      За ораторскими навыками иди в Университет

  • @ИванБелый-р3я
    @ИванБелый-р3я 4 года назад

    Ты ещё больше меня запутал. Дизлайк

  • @ДмитрийКоролев-ч8ь
    @ДмитрийКоролев-ч8ь 7 лет назад +1

    Спасибо за уроки! будут ли уроке по сортировке и использованию многофайловых проектов?

    • @ADV-IT
      @ADV-IT  7 лет назад +2

      По сортировке будут

  • @АртурК-ю6ц
    @АртурК-ю6ц 4 года назад +1

    Спасибо!