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

  Рет қаралды 12,431

Sergey Arkhipov Java Tutorials

5 жыл бұрын

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

Пікірлер: 38
@MO3rOBOuBbICEP
@MO3rOBOuBbICEP 3 жыл бұрын
Спасибо за ваши видео, очень помогает понимать.
@asyapalchevskaya1716
@asyapalchevskaya1716 2 жыл бұрын
спасибо огромное! ваши видео мне очень помогают в обучении!
@johannesbrown8853
@johannesbrown8853 5 жыл бұрын
Как всегда на высоте!!!!
@user-po1pr8er2j
@user-po1pr8er2j Жыл бұрын
Спасибо. Гениально. Сильно выручил
@denysound3125
@denysound3125 Жыл бұрын
это все таки дар так обьяснять.Спасибо
@N8Gloom
@N8Gloom 4 жыл бұрын
Спасибо, все ясно и понятно!
@alexuvarov8901
@alexuvarov8901 4 жыл бұрын
спасибо за видео
@Andrzej3935
@Andrzej3935 2 жыл бұрын
Благодарю!
@mehaletz
@mehaletz 3 жыл бұрын
отлично спасибо!
@funnymoment9164
@funnymoment9164 4 жыл бұрын
Спасибо!
@maratmartirosyan478
@maratmartirosyan478 4 жыл бұрын
Большое спасибо за урок ,хорошо объяснишь сделай новые уроки Like и Подписка
@nik-jn7vg
@nik-jn7vg 5 жыл бұрын
слушай ты большой молодец , я недавно начал учить джаву , сильно помог разобраться , забей что просмотров мало , этот видос будут смотреть нормальные люди которые хотят развиваться, таких мало. если можно скинь вк или что еще вижу ты разбираешься в джаве , мб обьяснишь пару тем.
@arhitutorials
@arhitutorials 5 жыл бұрын
Привет, стараюсь) Хочу создать самые понятные ролики на KZfaq, может со временем получится. При этом не хочется, чтоб блог скатился в очередной банальный обучающий курс, коих и так полон интернет) VK есть на главной странице.
@gessgess6186
@gessgess6186 4 жыл бұрын
То что двоичный поиск сам по себе эффективней линейного это понятно. Но для его запуска нужно предварительно отсортировать массив и в связи с этим возникает вопрос: насколько эффективней двоичный поиск + предварительная сортировка массива по сравнению с линейной сортировкой?
@arhitutorials
@arhitutorials 4 жыл бұрын
Ключевой момент в том, что можно отсортировать данные один раз и в таком виде хранить. После этого можно постоянно использовать быстрый двоичный поиск. Так работают базы данных - для полей, по которым часто происходит поиск, строятся отсортированные индексы.
@gessgess6186
@gessgess6186 4 жыл бұрын
@@arhitutorials Спасибо за ответ. Еще вопрос: в результате мы решаем задачу проверки наличия искомого элемента в первичном массиве, а не его позиции как поставлена задача в 0:45, потому что мы получаем индекс элемента в отсортированном массиве, который никак не коррелирует с индексом этого же элемента в первичном массиве?
@arhitutorials
@arhitutorials 4 жыл бұрын
@@gessgess6186 Если надо найти индекс в первичном массиве, то можно составить массив из структур вида {элемент, его индекс в первичном массиве}, потом сортировать его по элементам. А потом искать в нем двоичным поиском. При нахождении структуры с элементом, находим так же и его оригинальный индекс. Так обычно и делают. Первичный массив не сортируют, а делают отдельный массив {значение, индекс} и уже с ним работают. Потому что обычно элементы имеют сложную структуру и искать часто надо по нескольким полям. Например, в массиве сотрудников можно искать и по фамилии и по номеру телефона, плюс там обычно куча других полей: адрес, должность, зарплата и т.д. Порядок при сортировке по фамилии и телефону будет разный. Чтоб не делать для поиска две копии массива, отсортированных по разным полям, делают так: массив оставляют как есть, а создают два новых массива {фамилия, индекс} и {телефон, индекс} и уже их сортируют и в них ищут. Найдя индекс берут полную запись по индексу из основного массива. Вот как-то так. По этому при проектировании базы данных хорошо бы заранее предусмотреть, по каким полям в таблице будет нужен поиск, чтоб построить для полей индексы.
@gessgess6186
@gessgess6186 4 жыл бұрын
@@arhitutorials Спасибо за исчерпывающий ответ и спасибо за ваш канал, желаю успехов в его дальнейшем развитии.
@evileye100
@evileye100 3 жыл бұрын
Спасибо, просто и понятно. Я правильно понимаю, что сложность двоичного поиска log(N)?
@arhitutorials
@arhitutorials 3 жыл бұрын
Да, правильно. Причем логарифм будет по основанию 2, если массив делится пополам. То есть для двоичного поиска в массиве размером N понадобится не более log2(N) шагов для поиска любого элемента.
@Kelbi28
@Kelbi28 2 жыл бұрын
А почему нельзя написать middle = end/ 2 ? ведь это как бы длина деленная на 2, где в итоге получили бы серединку.
@TheDanteSTV
@TheDanteSTV 6 ай бұрын
12:16 а почему 16 в ячейке 0? разве не в 6-й должно быть?
@Chekist2008
@Chekist2008 3 жыл бұрын
Чему будет равен 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 Спасибо огромное, теперь все понятно
@vitaliizubarev165
@vitaliizubarev165 4 жыл бұрын
Почему middle = start + (end - start) / 2 а не middle = start + end / 2?
@arhitutorials
@arhitutorials 4 жыл бұрын
Так это ж эквивалентные выражения (start + end) / 2 = start + (end - start)/2 то есть просто немного в другой форме записано то же самое. Может я думал о длине массива, когда писал. То есть middle - это start + пол длины подмассива.
@anonimanonimich1302
@anonimanonimich1302 3 жыл бұрын
Можно пожалуйста узнать, что это за текстовый редактор?
@arhitutorials
@arhitutorials 3 жыл бұрын
Это IntelliJ IDEA community edition, можно скачать бесплатно без смс)
@anonimanonimich1302
@anonimanonimich1302 3 жыл бұрын
@@arhitutorials благодарю
@alexeipr8573
@alexeipr8573 2 жыл бұрын
Печать индекса очень актуально ...
@Z417O
@Z417O 2 жыл бұрын
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 выражения эквивалентны, все верно.
Llegó al techo 😱
00:37
Juan De Dios Pantoja
Рет қаралды 57 МЛН
Slow motion boy #shorts by Tsuriki Show
00:14
Tsuriki Show
Рет қаралды 9 МЛН
路飞太过分了,自己游泳。#海贼王#路飞
00:28
路飞与唐舞桐
Рет қаралды 35 МЛН
Llegó al techo 😱
00:37
Juan De Dios Pantoja
Рет қаралды 57 МЛН