Java. Поиск в массиве: линейный, двоичный.

Рассматриваем алгоритмы поиска в массиве, а именно: линейный и двоичный поиск. Разбираем реализации алгоритмов на языке программирования Java. Говорим о достоинствах и недостатках этих алгоритмов, о производительности и вообще о поиске в целом.
Исходники:
github.com/Arhiser/java_tutor...
Поддержать канал💰:
yoomoney.ru/to/410018856244871
#ArhiTutorialsJava #ityoutubersru

Пікірлер: 38

  • @johannesbrown8853
    @johannesbrown88535 жыл бұрын

    Как всегда на высоте!!!!

  • @MO3rOBOuBbICEP
    @MO3rOBOuBbICEP3 жыл бұрын

    Спасибо за ваши видео, очень помогает понимать.

  • @asyapalchevskaya1716
    @asyapalchevskaya17162 жыл бұрын

    спасибо огромное! ваши видео мне очень помогают в обучении!

  • @user-po1pr8er2j
    @user-po1pr8er2j Жыл бұрын

    Спасибо. Гениально. Сильно выручил

  • @N8Gloom
    @N8Gloom4 жыл бұрын

    Спасибо, все ясно и понятно!

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

    это все таки дар так обьяснять.Спасибо

  • @alexuvarov8901
    @alexuvarov89014 жыл бұрын

    спасибо за видео

  • @mehaletz
    @mehaletz3 жыл бұрын

    отлично спасибо!

  • @Andrzej3935
    @Andrzej39352 жыл бұрын

    Благодарю!

  • @funnymoment9164
    @funnymoment91644 жыл бұрын

    Спасибо!

  • @maratmartirosyan478
    @maratmartirosyan4784 жыл бұрын

    Большое спасибо за урок ,хорошо объяснишь сделай новые уроки Like и Подписка

  • @nik-jn7vg
    @nik-jn7vg5 жыл бұрын

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

  • @arhitutorials

    @arhitutorials

    5 жыл бұрын

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

  • @gessgess6186
    @gessgess61864 жыл бұрын

    То что двоичный поиск сам по себе эффективней линейного это понятно. Но для его запуска нужно предварительно отсортировать массив и в связи с этим возникает вопрос: насколько эффективней двоичный поиск + предварительная сортировка массива по сравнению с линейной сортировкой?

  • @arhitutorials

    @arhitutorials

    4 жыл бұрын

    Ключевой момент в том, что можно отсортировать данные один раз и в таком виде хранить. После этого можно постоянно использовать быстрый двоичный поиск. Так работают базы данных - для полей, по которым часто происходит поиск, строятся отсортированные индексы.

  • @gessgess6186

    @gessgess6186

    4 жыл бұрын

    @@arhitutorials Спасибо за ответ. Еще вопрос: в результате мы решаем задачу проверки наличия искомого элемента в первичном массиве, а не его позиции как поставлена задача в 0:45, потому что мы получаем индекс элемента в отсортированном массиве, который никак не коррелирует с индексом этого же элемента в первичном массиве?

  • @arhitutorials

    @arhitutorials

    4 жыл бұрын

    @@gessgess6186 Если надо найти индекс в первичном массиве, то можно составить массив из структур вида {элемент, его индекс в первичном массиве}, потом сортировать его по элементам. А потом искать в нем двоичным поиском. При нахождении структуры с элементом, находим так же и его оригинальный индекс. Так обычно и делают. Первичный массив не сортируют, а делают отдельный массив {значение, индекс} и уже с ним работают. Потому что обычно элементы имеют сложную структуру и искать часто надо по нескольким полям. Например, в массиве сотрудников можно искать и по фамилии и по номеру телефона, плюс там обычно куча других полей: адрес, должность, зарплата и т.д. Порядок при сортировке по фамилии и телефону будет разный. Чтоб не делать для поиска две копии массива, отсортированных по разным полям, делают так: массив оставляют как есть, а создают два новых массива {фамилия, индекс} и {телефон, индекс} и уже их сортируют и в них ищут. Найдя индекс берут полную запись по индексу из основного массива. Вот как-то так. По этому при проектировании базы данных хорошо бы заранее предусмотреть, по каким полям в таблице будет нужен поиск, чтоб построить для полей индексы.

  • @gessgess6186

    @gessgess6186

    4 жыл бұрын

    @@arhitutorials Спасибо за исчерпывающий ответ и спасибо за ваш канал, желаю успехов в его дальнейшем развитии.

  • @evileye100
    @evileye1003 жыл бұрын

    Спасибо, просто и понятно. Я правильно понимаю, что сложность двоичного поиска log(N)?

  • @arhitutorials

    @arhitutorials

    3 жыл бұрын

    Да, правильно. Причем логарифм будет по основанию 2, если массив делится пополам. То есть для двоичного поиска в массиве размером N понадобится не более log2(N) шагов для поиска любого элемента.

  • @TheDanteSTV
    @TheDanteSTV5 ай бұрын

    12:16 а почему 16 в ячейке 0? разве не в 6-й должно быть?

  • @Kelbi28
    @Kelbi282 жыл бұрын

    А почему нельзя написать middle = end/ 2 ? ведь это как бы длина деленная на 2, где в итоге получили бы серединку.

  • @Chekist2008
    @Chekist20083 жыл бұрын

    Чему будет равен middleIndex в 34 строке при длине массива, скажем 8? Бинарный поиск подходит и для массива с четным количеством элементов и нечетным?

  • @arhitutorials

    @arhitutorials

    3 жыл бұрын

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

  • @Chekist2008

    @Chekist2008

    3 жыл бұрын

    @@arhitutorials не совсем понял про сложность О(n^2) для бинарного поиска... Ведь если массив отсортирован, то поиск всегда будет по О(log по основанию 2 от n). Ну а если не отсортирован, то учитывается худшая сложность для сортировки самого наилучшего способа "пирамидальный способ", у которой она равна О(N*LogN). Даже тогда сложность общая будет равна О(LogN+ NLogN), но никак не О(N^2)... Или что вы имели ввиду?

  • @arhitutorials

    @arhitutorials

    3 жыл бұрын

    @@Chekist2008 Да, правильно. Сорри, я перепутал, не прочитал заголовок видео, подумал речь идет о быстрой сортировке. Хочу уточнить. Если массив не отсортирован, то линейный поиск за O(N). Если отсортировать, то используем бинарный поиск за log(N), да. Но так как сортировка выполняется только один раз, а искать потом можно сколько угодно, то я бы не стал складывать время сортировки и время поиска. Еще в некоторых случаях отсортировать массив можно за O(N), например используя поразрядную сортировку, или сортировку подсчетом. Скоро сделаю про это видео.

  • @Chekist2008

    @Chekist2008

    3 жыл бұрын

    @@arhitutorials Спасибо огромное, теперь все понятно

  • @anonimanonimich1302
    @anonimanonimich13023 жыл бұрын

    Можно пожалуйста узнать, что это за текстовый редактор?

  • @arhitutorials

    @arhitutorials

    3 жыл бұрын

    Это IntelliJ IDEA community edition, можно скачать бесплатно без смс)

  • @anonimanonimich1302

    @anonimanonimich1302

    3 жыл бұрын

    @@arhitutorials благодарю

  • @vitaliizubarev165
    @vitaliizubarev1654 жыл бұрын

    Почему middle = start + (end - start) / 2 а не middle = start + end / 2?

  • @arhitutorials

    @arhitutorials

    4 жыл бұрын

    Так это ж эквивалентные выражения (start + end) / 2 = start + (end - start)/2 то есть просто немного в другой форме записано то же самое. Может я думал о длине массива, когда писал. То есть middle - это start + пол длины подмассива.

  • @alexeipr8573
    @alexeipr85732 жыл бұрын

    Печать индекса очень актуально ...

  • @Z417O
    @Z417O2 жыл бұрын

    int mid = (low + high) / 2; не верная реализация int mid = low + ((high - low) / 2); верная реализация

  • @arhitutorials

    @arhitutorials

    2 жыл бұрын

    Итак, исходное выражение: mid = low + ((high - low) / 2) умножаем все на 2, получаем: 2 * mid = 2 * low + high - low вычитаем 2 * low - low, получаем: 2 * mid = low + high теперь выражаем mid: mid = (low + high) / 2 таким образом: mid = low + ((high - low) / 2) это то же самое, что mid = (low + high) / 2 выражения эквивалентны, все верно.

Келесі