доказательство того что говорил Энштейн стоит всего один раз ошибиться и не смотря на миллион слов сказанных до этого правильно люди укажут тебе только на ошибку
@@shinsentennouzu2564Это тут к чему? А что с украинцами не так, или ты типичный зомби? Люди бояться за свою землю, за свои дома, а ты как типичный чел, который верит пропаганде, из-за русни, ганд***, людям приходилось покидать свои дома, в которых они прожили всю жизнь, в итоге, знаю случай, когда люди успели выехать, и немного позже, заметили свой дом на Авито, нормально бл***? Почему вы такие идиоты, считаете что отнимать чужие дома "нормально", это насколько надо быть безчеловечным, вы от нищеты идете за деньги уб**ать своих "братьев", и после этого ты будешь что-то говорить про украинцев? Тут даже не в сумме дело, сколько бы не заплатили, адекватный человек никогда бы такого не сделал, при том, зайдя на чужие территории с оружием вы уже являетесь окупантами, которые уб***т невинных людей, которые просто защищают свое. А в итоге такие тупые как ты, пишут подобный бред, вот скажи, к тебе бы в дом ворвались, забирали все, а ты бы молча на это смотрел? Даже если да, вы терпилы, вы боитесь свою власть, она вас очень сильно запугала, как минимум, можно увидеть по митингам, которые в других странах проходят, но у вас почти нет, ведь выходишь с листком, и сажают, а вышли бы все, всех бы не пересажали, но вы безчеловечные, только если это вас коснется, возможно когда-то и выйдете.
В условии не указывается, то что все числа заполняются по увеличению. Решать задачу по первому примеру - не разумно. Все условия задачи надо указывать в начале, а не по мере решения
@@Nobody-ju6ptну как по мне для галочки этот метод стоить знать или хотябы учесть.Но я бы скорее всего делал класический перебор в таком случаи ,так бы все варианты чисел и их рандомность была затронута
@@Podkarpatskay_Ukraina до этого метода можно самому додуматься или идти стандартным путём, совсем не обязательно изобретать вечный двигатель для решения простенькой задачи
Он сказал что возрастание - слева на право и с верху вниз. Отсортированние массиви ето основа бистрого поиска. Там дальше применими алгоритми по типу бинарного поиска
@@realfootball338этого в условии задачи нет. Мы принципиально НЕ должны ориентироваться на частные случаи не прописанные в задаче либо должны перебрать их все.
@@senior_javistпересмотрел :) У тебя массив М на Н, надо найти число К. То, что в данном конкретном примере числа упорядочены каким-то образом, не гарантирует, что они будут упорядочены в следующий раз. А размерность массива, обозначенная буквами, а не цифрами, как бы намекает на то, что массив может быть дан другой.
@@Nidvoraich я не говорю о конкретном массиве, я говорю об условии. В любом другом массиве числа будут упорядочены тоже. Если бы этого условия не было, я бы не показывал данный метод решения.
@@senior_javist значит ошибся при озвучке, тк действительно нет никакого упоминания о том что данные как-то упорядочены. Из картинки вообще не понятно, как именно они упорядочены. (На сколько я понял - всё что справа - точно больше, чем то что слева. То что снизу - точно больше, чем то что сверху. Но это не распространяется на диагонали) В общем проблема скорее в подаче.
? Нужное число необязательно будет в центре, однако двигаясь способом из видео оно будет гарантированно найденно за не самое большое количество времени
@@theforgottenes2552 массив отсортирован какой-то "хитрой" логикой, а если он будет случайно заполнен, а если другой размерности будет, а если еще что-то. Решение частного случая причем подгонка под результат, а не оптимизацию решения.
Это не та задача. На самом деле в Google и Amazon задают такую: Пупа и Лупа пошли за зарплатой. В бухгалтерии все перепутали. Лупа получил зарплату за Пупу. Что получил Пупа?
Супер-решение, под один частный случай. Осталось написать решениЯ под оставшиеся 750 вариантов (не учитывая возможные повторения чисел) илли триллион если числа могут повторяться
@@_Kapc Потому что в условиях, до начала кодинга и составления алгоритма - Это Важно. Ничего не говорилось о правилах или особенностях наполнения массива. Данный массив можно рассматривать как Пример, для проверки должен быть предоставлен и другой - контрольный, по которому и будет проводиться оценка. Здесь же рассмотрен Частный случай
@@_Kapc >если опустить этот момент и считать, что в условиях все прописано, алгоритм ведь будет работать Если в условиях прописано ВСЕ, то этот мегакостыль вместо алгоритма сломается на первом неупорядоченном массиве. Потому что в условиях нет упорядоченности.
В условии задачи ещё забыли указать, что 7 больше 9-ти. И если видите, что числа в порядке возрастания, то видите и то, где находится девятка и нефиг её искать через какое-то там решение.
В условие надо вписать что матрица упорядоченная В упорядоченном массиве искать проще всего методом половинного деления или его же называют бинарный поиск В данном случае в ячейку M{3;3} попадаем с первой итерации: число 9 - оно как раз посередине Но если дополнительно, для оптимизации вычислений, чтобы не делать бесполезный поиск если значение в матрице выходит за границы макс мин значений, надо проверить ячейки M{1;1} и M{5;5}; тогда решение (число 9) будет найдено за три итерации - проверям мин, проверям макс, далее метод половинного деления начиная с центральной ячейки
автор как и 28 клоунов никогда не слышали что можно на примере отдельно взятого алгоритма разработать универсальный который и буквы будет понимать и блуждать будет по закоулкам массива до тех пор пока либо не вернет тру либо закончатся переменные в лице положения строк-столбцов...
@@followthedark5140 поздравляю, ты вспомнил о переборе массива. По сути базису, который тебе дают чуть ли не в школе. На основе этого алгоритма можно действительно сделать любой другой. Точно так же, как из гранитного куба сделать колесо для майбаха. Первым шагом будет - продать красивый, но бесполезный камень и купить колесо. А еще можно было бы извернуться и сказать что в js можно использовать Array.includes() и не иметь себе мозг. Впрочем такое решение было бы даже лучше, хотя бы потому что не основано на частном случае решения общей задачи.
@@perfectogamer3349что? Наверно?? Сложность сортировки известна любой бабке околоподъездной. А ещё этот клоун сам говорит, что отсортирована матрица. Так что бинарным тут очень даже изи решить
@@perfectogamer3349ну если принять, что каждая строка и столбец упорядочены по возрастанию, то тут за 2 бинпоиска задача решается - сначала ищем в первой строке, получаем индекс i, затем ищем в i-том столбце
Даже в данном виде оно не оптимальное, для больших особенно матриц, надо начинать с середины, и потом двигаться на четверть, потом на одну восьмую и так далее, при огромных матрицах решение будет намного быстрее.
Решение на c++: 1) Делаем Vector а(n*m) 2) Заполняем его 3) if (lower_bount(a.begin(), a.end(), k) == k) { return true; } return false; Сложность алгоритма: O(log n), если откинуть заполнение массива P.S. lower_bount можно заменить либо upper_bount, либо своей функцией
1. lower_bount использует бинарный поиск, который правильно работает только на отсортированном массиве. Здесь массив сортирован фрагментарно, на нем не будет работать правильно. 2. На данном массиве, при к=9 бинарный поиск начинается с середины и, о чудо, там девятка - поиск закончен.
На самом деле нет, середина массива 25/2=12.5, при округлении дает 12 а не 13, как в математике. Если предположить, что if (lower_bount(a.begin(), a.end(), k) == k) -это псевдо запись (она просто напросто не скомпилируется) чтобы не загромождать сообщение, а девятку ты как-то получил, то в свою очередь можно предположить, что ты принял за верный результат позицию в массиве, который выдал алгоритм lower_bound, а именно v[9]==12
Не рабочий алгоритм - вместо 9 в центре разместите 10, а девятку мы засунем вместо 6. А на случай если числа не повторяются, тогда сместите два нижних ряда на +100, например.
Ты не въехал в алгоритм: попав в ячейку сравниваем ее с искомым, если больше искомого движемся влево, если меньше вниз. Будет в центре 10, а 9 на месте 6, то после 10 пойдет влево, где как раз и находится 9. Все отлично работает. Поменять местами 9 и 10 = 8 - 10 (9) - 6 - 13 - 9 (10) Будь 11 на месте 9 . Прошлось бы 8 - 11 - 6 - 13 - 10. А дальше надо влево, но индекс за рамками массива, значит идти некуда - false.
@@SabFo_для бинарного поиска достаточно упорядоченного массива и гарантии того, что число К есть в этом массиве. Поэтому тут лучше провернуть бинарный поиск, тк сложность его O(logN) а в худшем случае алгоритма автора будет сложность O(N) (если число К будет в нулевом столбце последнего ряда), что не является самым эффективным решением
@@edfiw89 У нас для того и существуют многопоточные процессоры, чтобы пользоваться ими и эффективно решать подобные прикладные задачи. Чем прямолинейнее будет реализация, тем проще будет компилятору и процессору её распараллелить. Решение из видео красиво смотрится с точки зрения теории алгоритмов, но будет иметь сомнительную эффективность в реальном мире на практике, где помимо теории о сложности алгоритмов существует множество других факторов, связанных с тем, как реально работает современное компьютерное железо. Как раз таки из-за оверинжиниринга у нас и страдает производительность, когда вместо простых решений разработчики преждевременно пытаются всё "оптимизировать". В итоге имеем вот такой труднопроддерживаемый код под один конкретный случай, в котором на беглый взгляд разберётся только сам его автор.
@@edfiw89 "поясни, какия оптимизация страдает?" под другой массив придеться писать другой код. "Как раз из-за отсутствия таких решений тебе надо ПК на 2 миллиарда оперций в секунду в 8 потоков" как раз из за таких решений это и происходит
В самом начале правильно сказали про диагональ. Но потом что-то пошло не так. Надо начать от центра и двигаться по диагонали. А затем максимум два бинарных поиска по столбцу и строке. Выходит m/2+2log(n)
А в чем смысл "/2", реально это надо озвучивать интервьюерам? Это же не временная сложность уже, там константы игнорируются. Я бы и m опустил, докопаются если "примерно log(n)" сказать?
А вот если 18 искать, то как ваш алгоритм работает? Мне кажется здесь сложность будет log(n)*log(m). А то что предлагает автор явно будет n+m, что явно не самый оптимальный вариант.
@@MarsY-w4p На самом деле надо тестить на матрице 1000*1000 кучей прогонок, сейчас каджый видя матрицу подбирает число в ней, с самым пессимистичным вариантом. То что предлагает автор видео проще имплементируемо так как поиск итерируется только вниз и влево, то что предлагает автор коментария сложно реализуемо, так как у него итерация идет в 4 стороны еще и поиск разбивается на отдельные стримы. В случае с 18 он дойдет по диагонали до 30 а потом должен идти и вверх и влево. Оптимизацией может быть сравнение искомого числа с мин и макс в матрице, и если ищем 23 то начинаем с 30, если ищем 6, то начинаем с 1
Почему не бин поиск? для бинарного поиска достаточно упорядоченного массива и гарантии того, что число К есть в этом массиве. Поэтому тут лучше провернуть бинарный поиск, тк сложность его O(logN) а в худшем случае алгоритма автора будет сложность O(N) (если число К будет в нулевом столбце последнего ряда), что не является самым эффективным решением
Не самый быстрый способ, я бы начинал с середины и определял куда идти - вправо или влево, при чем можно идти половиннами длинны. Просто возьми массив 1000 на 1000, берем 500й элемент, если он больше, берем 250й, если опять больше - 125й и т.д. Если есть еще скрытые условия, то можно хорошо оптимизировать (например, что числа не повторяются, т.к. в условии "найти число", а не "найти первое число равно К") Это не самый оптимальный, но точно оптимальнее твоего в бОльшинстве случаев.
Обычно в таких задачах приходит много запросов на заданном массиве, если в этой также, то был бы смысл построить какое-нибудь сбалансированное дерево поиска и норм
> нашел рандомную задачу на литкоде > не смог полностью пересказать условие чтобы мы поняли > ща покажу максимально эффективное решение > показывает не эффективное решение > сеньор джавист
В условиях задачи не сказано, что строки и столбцы возрастают, ваше решение некорректное. Как раз в Гугле на собесах акцентируют внимание на том, правильно ли ты понял задачу. Еще из этой оперы: найти элемент в дереве. Люди пишут алгоритм поиска по бинарному дереву, так как им дали пример такой, а потом им говорят, что решение некорректно.
Ты написал решение О(N+M), хотя сказал, что требуется написать самое эффективное решение. Бс может дать О(logN+logM). Хотя да, литкод часто дает заслать тупое решение. Эту задачу надо сделать «Напишите алгоритм который за кратчайшее время будет отвечать ДА/НЕТ» и дать матрицу + 10^6 запросов. В таком случае эта задача станет хоть чуть чуть похожа на medium. И твой код жиденько поймает TLE)
Прошу заметить, что алгоритм не обязательно строго оптимален. Его асимптоматика порядка O(n+m). В случае если n ≈ m, это лучший алгоритм, но в случае n
Вот эти задачи точно придумывают люди, которые никогда не работали в ентерпрайзе, НИКОГДА. Потому что по моим наблюдениям, в массиве может быть вообще что угодно и где угодно.
Душнила в чате Чисто технически, это решение не будет являться оптимальным, поскольку может потребовать больше мощностей, чем перебор и относится к частномк случаю, а не универсально. В задаче запросили оптимальный вариант.. Перебор, а для частного случая можно остановиться на подобном переборе но с началом в центне
Подход классный. Искать ступеньку потом смещаться ниже и искать дальше. Но при гигантских размерностях бинарный поиск этой ступеньки будет быстрее. Продолжай, хорошо что двигаешь код в массы)
То, что числа расположены в порядке возрастания, не было сказано в правилах, а было представлено как "наблюдение": "обратите внимание". Если этого нет в правилах, то решение будет захардкоденным куском кала, заточенным под одну конкретную таблицу, а не под любую такую таблицу
Сначала ищем столбец, потом строку, пользуясь информацией о сортировке. Только вот искать их тоже можно эффективнее. Да и решение явно подразумевает использование указателя.
Если в матрице все числа от 1 до n x m то можно записать её как одномерный массив, после чего вызвать алгоритм частичной сортировки (ставит 1 элемент на место), на то место где ожидается число.
Этот алгоритм должен хотябы раз обратиться к каждому элементу, тогда у тебя получается O(M*N), что по асимптотике не лучше, чем просто поиск по каждому элементу, а у алгоритма из решения скорость O(M+N)
Есть ещё быстрее код, если мы знаем что матрица отсортирована, в матрице 25-ть чисел. Мы берем начальную (допустим она 10) , берём последнюю (допустим она 80), нам надо найти 30. Усредненный коефициент распределения чисел по матрице это (80-10)/25 = 2.8. Потом (30-10)/2.8 = 7.1 т. е стартовать надо с 7 клетки. При большом количестве таких матриц изначально стартовать с усредненно ближайшей ячейки будет выгодно по производительности. Особенно при больших матрицах.
Лучше другое скажите. Я вот маме постоянно кеш телефона чищу от просмотренных видео в ватсапе. Внимание, там не только нет ограничения, но и виде сохраняются целиком в память, а еще делается дублирование походу если кто-то отослал другому или типа того. Т.е. у вас может быть хоть 100 видео одинаковых, которые забивают память. Теперь вопрос, вы правильно спросили, про частный случай, нахрена там вообще алгоритмы на собесе, если в подобных конторах пишут инвалиды код?
@@СерхиоБускетс-ф7я Очевидно, потому что проверяют такую дурь, вот они они и набирают тех, кто только такую даль писать и умеет, а не реальные юзкейсы.
📌ССЫЛКА НА TELEGRAM В ОПИСАНИИ ПРОФИЛЯ
Бывает
Очень круто 👍 вроде просто, но эффективно! Подскажите, вы в джаве на каких проектах работаете?
Это неоптимальный алгоритм, надо использовать бинарный поиск по началам строк и столбцов.
3 шаг: 7 больше 9? А 8 меньше?))))) Что-то тут не так....
Зада не решена, тк это не самое оптимальное решение с ассимптотической сложностью n*m. Бинарный поиск даст log, если двигаться по диагоналям
«Семь больше девяти»
Ауф
доказательство того что говорил Энштейн стоит всего один раз ошибиться и не смотря на миллион слов сказанных до этого правильно люди укажут тебе только на ошибку
@@sasmatres2731 ты уверен, что Энштейн хоть как-то тут связан с этим утверждением?
Я думал мне показалось)
@@shinsentennouzu2564Это тут к чему? А что с украинцами не так, или ты типичный зомби? Люди бояться за свою землю, за свои дома, а ты как типичный чел, который верит пропаганде, из-за русни, ганд***, людям приходилось покидать свои дома, в которых они прожили всю жизнь, в итоге, знаю случай, когда люди успели выехать, и немного позже, заметили свой дом на Авито, нормально бл***? Почему вы такие идиоты, считаете что отнимать чужие дома "нормально", это насколько надо быть безчеловечным, вы от нищеты идете за деньги уб**ать своих "братьев", и после этого ты будешь что-то говорить про украинцев? Тут даже не в сумме дело, сколько бы не заплатили, адекватный человек никогда бы такого не сделал, при том, зайдя на чужие территории с оружием вы уже являетесь окупантами, которые уб***т невинных людей, которые просто защищают свое. А в итоге такие тупые как ты, пишут подобный бред, вот скажи, к тебе бы в дом ворвались, забирали все, а ты бы молча на это смотрел? Даже если да, вы терпилы, вы боитесь свою власть, она вас очень сильно запугала, как минимум, можно увидеть по митингам, которые в других странах проходят, но у вас почти нет, ведь выходишь с листком, и сажают, а вышли бы все, всех бы не пересажали, но вы безчеловечные, только если это вас коснется, возможно когда-то и выйдете.
А 8 меньше девяти. Что такое 9? 😂😂😂
В условии не указывается, то что все числа заполняются по увеличению. Решать задачу по первому примеру - не разумно.
Все условия задачи надо указывать в начале, а не по мере решения
Именно, просто гении программисты из гугла)))
@@Nobody-ju6ptну как по мне для галочки этот метод стоить знать или хотябы учесть.Но я бы скорее всего делал класический перебор в таком случаи ,так бы все варианты чисел и их рандомность была затронута
@@Podkarpatskay_Ukraina до этого метода можно самому додуматься или идти стандартным путём, совсем не обязательно изобретать вечный двигатель для решения простенькой задачи
Согласен
@@Nobody-ju6pt это проверяет твою способность к оптимизацией задач, сделала решение в тупую тебя бы на работу не взяли.
-Обратите внимание, 9 находится в центре матрицы, задача решена
ты украл то, что я только хотел сказать. Короче, зашёл в комментарии за этим комментарием.
Обратите внимание, 9 находится в центре, поэтому начнём поиск с центра.
@@bodstor, суть в том, что автор выдумал выгодные для себя условия
Пхахах, вы приняты в Гугл!
@@maxajax9181он в гугл и работает. Видосы выкладывает на ютуб.
Пока есть такие учителя, я спокоен за свою работу)
Это точно))
А вдруг нас лечат такие же врачи? Страшно
Бред полный рассказывает?)
Он сам придумал это задание 😂
Мне нужно 13
Чел, который устраивается уборщиком в гугл:😐
это планировка кабинетов в офисе
И так и не устроился
Ждал этого коммента
Или грузчиком в амазон
Задача: оптимально подмести пол, который выглядит как шахматная доска, а в каждой клетке n единиц мусора
В условии не сказано, что данные отсортированы.
Если они отсортированы, то можно просто вычислить позицию девятки. Зная N M и любое числи в матрице.
@@chu_ri5470 нет.
Да там масса решений. Просто аффтар хайпует)
Он сказал что возрастание - слева на право и с верху вниз. Отсортированние массиви ето основа бистрого поиска. Там дальше применими алгоритми по типу бинарного поиска
@@realfootball338этого в условии задачи нет. Мы принципиально НЕ должны ориентироваться на частные случаи не прописанные в задаче либо должны перебрать их все.
Заходит как то тестировщик и перемешивает значение в таблице)
Был бы я тестировщиком я б туда ещё и символов накидал 😂
@@ИмяФамилия-е7м4л в qa уже лет 10. Таблицу можно просто заполнить нулями и отрицательным числом😂
Но мы то заранее все сортируем
@@ВиталийПо-ю2д тогда обычный перебор бeдет значительно эффективней
@@ВиталийПо-ю2д тогда проще перебором найти или include :)
В условии ничего не сказано о сортированности массива, камон
пересмотри видео, цитирую "все строки и столбцы идут в порядке возрастания".
@@senior_javistпересмотрел :)
У тебя массив М на Н, надо найти число К.
То, что в данном конкретном примере числа упорядочены каким-то образом, не гарантирует, что они будут упорядочены в следующий раз.
А размерность массива, обозначенная буквами, а не цифрами, как бы намекает на то, что массив может быть дан другой.
@@Nidvoraich я не говорю о конкретном массиве, я говорю об условии. В любом другом массиве числа будут упорядочены тоже. Если бы этого условия не было, я бы не показывал данный метод решения.
@@senior_javist значит ошибся при озвучке, тк действительно нет никакого упоминания о том что данные как-то упорядочены.
Из картинки вообще не понятно, как именно они упорядочены.
(На сколько я понял - всё что справа - точно больше, чем то что слева.
То что снизу - точно больше, чем то что сверху. Но это не распространяется на диагонали)
В общем проблема скорее в подаче.
Верно, условие дано не полное.@@vabka-7708
По этой логике почему бы не начать с центра?) и о чудо- совпадение будет сразу🤣🤣🤣
? Нужное число необязательно будет в центре, однако двигаясь способом из видео оно будет гарантированно найденно за не самое большое количество времени
@@theforgottenes2552В условии массив не отсортирован, а в примере нам просто повезло.
@@theforgottenes2552 массив отсортирован какой-то "хитрой" логикой, а если он будет случайно заполнен, а если другой размерности будет, а если еще что-то. Решение частного случая причем подгонка под результат, а не оптимизацию решения.
@@theforgottenes2552а где в условии изначально сказано что числа в столбиках растут вниз?
"Обратим внимание, что число 9 в таблице есть. Решение: return true."
Это не та задача. На самом деле в Google и Amazon задают такую:
Пупа и Лупа пошли за зарплатой. В бухгалтерии все перепутали. Лупа получил зарплату за Пупу. Что получил Пупа?
Ни что, а за кого
@@exiverфорточку открой
Залупу
Залупу
Гениально
Супер-решение, под один частный случай. Осталось написать решениЯ под оставшиеся 750 вариантов (не учитывая возможные повторения чисел) илли триллион если числа могут повторяться
Почему под один частный случай?
@@_Kapc Потому что в условиях, до начала кодинга и составления алгоритма - Это Важно. Ничего не говорилось о правилах или особенностях наполнения массива. Данный массив можно рассматривать как Пример, для проверки должен быть предоставлен и другой - контрольный, по которому и будет проводиться оценка.
Здесь же рассмотрен Частный случай
@@andrewdok3595 это действительно так, но если опустить этот момент и считать, что в условиях все прописано, алгоритм ведь будет работать
@@_Kapc
>если опустить этот момент и считать, что в условиях все прописано, алгоритм ведь будет работать
Если в условиях прописано ВСЕ, то этот мегакостыль вместо алгоритма сломается на первом неупорядоченном массиве. Потому что в условиях нет упорядоченности.
Почему 750?
Если из тех чисел, что там есть
То это(5х5)!
Т.е. факториал 5
«Это было самое трудное собеседование на должность уборщика, но я его прошёл…»
Если конкретно в этом массиве и с конкретно таким заданием, я бы вообще начал поиск с середины и выполнил её за 1 шаг 😂
В условии задачи ещё забыли указать, что 7 больше 9-ти. И если видите, что числа в порядке возрастания, то видите и то, где находится девятка и нефиг её искать через какое-то там решение.
В условие надо вписать что матрица упорядоченная
В упорядоченном массиве искать проще всего методом половинного деления или его же называют бинарный поиск
В данном случае в ячейку M{3;3} попадаем с первой итерации: число 9 - оно как раз посередине
Но если дополнительно, для оптимизации вычислений, чтобы не делать бесполезный поиск если значение в матрице выходит за границы макс мин значений, надо проверить ячейки M{1;1} и M{5;5}; тогда решение (число 9) будет найдено за три итерации - проверям мин, проверям макс, далее метод половинного деления начиная с центральной ячейки
Класс, когда вам дадут новую расстановку чисел вы снова будете переписывать алгоритм?
автор как и 28 клоунов никогда не слышали что можно на примере отдельно взятого алгоритма разработать универсальный который и буквы будет понимать и блуждать будет по закоулкам массива до тех пор пока либо не вернет тру либо закончатся переменные в лице положения строк-столбцов...
@@followthedark5140 поздравляю, ты вспомнил о переборе массива. По сути базису, который тебе дают чуть ли не в школе.
На основе этого алгоритма можно действительно сделать любой другой. Точно так же, как из гранитного куба сделать колесо для майбаха. Первым шагом будет - продать красивый, но бесполезный камень и купить колесо.
А еще можно было бы извернуться и сказать что в js можно использовать Array.includes() и не иметь себе мозг. Впрочем такое решение было бы даже лучше, хотя бы потому что не основано на частном случае решения общей задачи.
А где в условии дано, что числа в матрице всегда будут отсортированы каким-либо образом? Матрицу 2000х4500 тоже глазами смотреть для решения?
Бинарный поиск вышел из чата
но он тут не сильно подойдет, т.к. тут числа не упорядочены по возрастанию) Если сначала упорядочить, то да, но цена такой операции наверное высокая
@@perfectogamer3349что? Наверно?? Сложность сортировки известна любой бабке околоподъездной. А ещё этот клоун сам говорит, что отсортирована матрица. Так что бинарным тут очень даже изи решить
@@perfectogamer3349ну если принять, что каждая строка и столбец упорядочены по возрастанию, то тут за 2 бинпоиска задача решается - сначала ищем в первой строке, получаем индекс i, затем ищем в i-том столбце
С прикладной точки зрения это решение не имеет ни каких преимуществ. Так как обычно массив данных заполняются более менее рандомно
Даже в данном виде оно не оптимальное, для больших особенно матриц, надо начинать с середины, и потом двигаться на четверть, потом на одну восьмую и так далее, при огромных матрицах решение будет намного быстрее.
Решение на c++:
1) Делаем Vector а(n*m)
2) Заполняем его
3)
if (lower_bount(a.begin(), a.end(), k) == k) {
return true;
}
return false;
Сложность алгоритма: O(log n), если откинуть заполнение массива
P.S. lower_bount можно заменить либо upper_bount, либо своей функцией
1. lower_bount использует бинарный поиск, который правильно работает только на отсортированном массиве. Здесь массив сортирован фрагментарно, на нем не будет работать правильно.
2. На данном массиве, при к=9 бинарный поиск начинается с середины и, о чудо, там девятка - поиск закончен.
На самом деле нет, середина массива 25/2=12.5, при округлении дает 12 а не 13, как в математике. Если предположить, что if (lower_bount(a.begin(), a.end(), k) == k) -это псевдо запись (она просто напросто не скомпилируется) чтобы не загромождать сообщение, а девятку ты как-то получил, то в свою очередь можно предположить, что ты принял за верный результат позицию в массиве, который выдал алгоритм lower_bound, а именно v[9]==12
Семь больше девяти... И после этого меня не остановить 😂
Было бы справедливо посчитать нагрузку всех этих алгоритмов, а то может оказаться что поиск быстрее на 1% но ресурсов жрёт в 2 раза больше
Не рабочий алгоритм - вместо 9 в центре разместите 10, а девятку мы засунем вместо 6. А на случай если числа не повторяются, тогда сместите два нижних ряда на +100, например.
Тогда 10 повторяется. Лучше переставить так: 9 -> 6 -> 7 -> 8 -> 10 -> 9.
@@roma_prokopov а не важно, один фиг решение не работает
Ты не въехал в алгоритм: попав в ячейку сравниваем ее с искомым, если больше искомого движемся влево, если меньше вниз.
Будет в центре 10, а 9 на месте 6, то после 10 пойдет влево, где как раз и находится 9.
Все отлично работает. Поменять местами 9 и 10 = 8 - 10 (9) - 6 - 13 - 9 (10)
Будь 11 на месте 9 . Прошлось бы 8 - 11 - 6 - 13 - 10. А дальше надо влево, но индекс за рамками массива, значит идти некуда - false.
Зачем начинать с конца? Надо начинать с середины, бинарный поиск эффективнее.
Здесь нет упорядоченной линейной последовательности, поэтому бинарный поиск здесь не даст верный ответ в общем случае
да, но для другой задачи с литкода
@@SabFo_для бинарного поиска достаточно упорядоченного массива и гарантии того, что число К есть в этом массиве. Поэтому тут лучше провернуть бинарный поиск, тк сложность его O(logN) а в худшем случае алгоритма автора будет сложность O(N) (если число К будет в нулевом столбце последнего ряда), что не является самым эффективным решением
@@nitebo1Бинарный поиск следует применить к каждой строке, поэтому сложность будет MlogN. Алгоритм, представленный автором, эффективнее
@@ГеоргийЛухтура-в8м зачем? Сначала к строке, потом к столбцу, сложность log(n*m) что лучше линейной
Вот из-за таких способов решения и страдает оптимизация и появляются баги
@@edfiw89 У нас для того и существуют многопоточные процессоры, чтобы пользоваться ими и эффективно решать подобные прикладные задачи. Чем прямолинейнее будет реализация, тем проще будет компилятору и процессору её распараллелить. Решение из видео красиво смотрится с точки зрения теории алгоритмов, но будет иметь сомнительную эффективность в реальном мире на практике, где помимо теории о сложности алгоритмов существует множество других факторов, связанных с тем, как реально работает современное компьютерное железо.
Как раз таки из-за оверинжиниринга у нас и страдает производительность, когда вместо простых решений разработчики преждевременно пытаются всё "оптимизировать". В итоге имеем вот такой труднопроддерживаемый код под один конкретный случай, в котором на беглый взгляд разберётся только сам его автор.
@@edfiw89 "поясни, какия оптимизация страдает?"
под другой массив придеться писать другой код.
"Как раз из-за отсутствия таких решений тебе надо ПК на 2 миллиарда оперций в секунду в 8 потоков"
как раз из за таких решений это и происходит
7 больше 9-ти... Советы "Как попасть в чёрный список навсегда!!!"😂😂😂
В самом начале правильно сказали про диагональ. Но потом что-то пошло не так.
Надо начать от центра и двигаться по диагонали. А затем максимум два бинарных поиска по столбцу и строке. Выходит m/2+2log(n)
А в чем смысл "/2", реально это надо озвучивать интервьюерам? Это же не временная сложность уже, там константы игнорируются. Я бы и m опустил, докопаются если "примерно log(n)" сказать?
А вот если 18 искать, то как ваш алгоритм работает? Мне кажется здесь сложность будет log(n)*log(m). А то что предлагает автор явно будет n+m, что явно не самый оптимальный вариант.
@@MarsY-w4p На самом деле надо тестить на матрице 1000*1000 кучей прогонок, сейчас каджый видя матрицу подбирает число в ней, с самым пессимистичным вариантом. То что предлагает автор видео проще имплементируемо так как поиск итерируется только вниз и влево, то что предлагает автор коментария сложно реализуемо, так как у него итерация идет в 4 стороны еще и поиск разбивается на отдельные стримы. В случае с 18 он дойдет по диагонали до 30 а потом должен идти и вверх и влево. Оптимизацией может быть сравнение искомого числа с мин и макс в матрице, и если ищем 23 то начинаем с 30, если ищем 6, то начинаем с 1
Какая-то экстремально простая задача. Эффективное решение пришло в голову ещё до полного озвучивания условия
If 9 in arr:
Print("True")
Else:
Print("False")
Python! Best pl
Были бы в питоне ещё двумерные списки...
@@rofe9285скорее матрицы или двумерные массивы но не списки
А какая сложность алгоритма? Или вы думаете, что в нутри этой фунции магия.?
@@user-qwerty999 а то есть тот факт, что такая проверка не пройдёт никогда, тебя вообще не смущает?
dict = [k for k in m]
if 9 in dict:
print(True)
Почему не бин поиск?
для бинарного поиска достаточно упорядоченного массива и гарантии того, что число К есть в этом массиве. Поэтому тут лучше провернуть бинарный поиск, тк сложность его O(logN) а в худшем случае алгоритма автора будет сложность O(N) (если число К будет в нулевом столбце последнего ряда), что не является самым эффективным решением
Можно и бп за log(n) + log(m)
Я могу доказать, что меньше, чем за (min(M, N)) нельзя. В случае квадратного массива, это будет N
@@ubiwan7936 я тупанул сорян. Уже понял ошибку
@@ubiwan7936докажи пожалуйста
Очень полезная задача, ведь в реальной работе ты только и будешь искать числа в массивах))
Не самый быстрый способ, я бы начинал с середины и определял куда идти - вправо или влево, при чем можно идти половиннами длинны.
Просто возьми массив 1000 на 1000, берем 500й элемент, если он больше, берем 250й, если опять больше - 125й и т.д. Если есть еще скрытые условия, то можно хорошо оптимизировать (например, что числа не повторяются, т.к. в условии "найти число", а не "найти первое число равно К")
Это не самый оптимальный, но точно оптимальнее твоего в бОльшинстве случаев.
"Число семь" и "Семь больше девяти" - гений.
Обычно в таких задачах приходит много запросов на заданном массиве, если в этой также, то был бы смысл построить какое-нибудь сбалансированное дерево поиска и норм
> нашел рандомную задачу на литкоде
> не смог полностью пересказать условие чтобы мы поняли
> ща покажу максимально эффективное решение
> показывает не эффективное решение
> сеньор джавист
В условиях задачи не сказано, что строки и столбцы возрастают, ваше решение некорректное.
Как раз в Гугле на собесах акцентируют внимание на том, правильно ли ты понял задачу. Еще из этой оперы: найти элемент в дереве. Люди пишут алгоритм поиска по бинарному дереву, так как им дали пример такой, а потом им говорят, что решение некорректно.
"Семь больше девяти"
Поздравляю, вы не прошли в Гугл и Амазон
Используя 2 Бин поиска можно сделать ещё быстрее...
Мы просто смотрим на массив и говорим "вот нашёл в середине, видно сразу" и задача решена за константное время 😂
Ты написал решение О(N+M), хотя сказал, что требуется написать самое эффективное решение. Бс может дать О(logN+logM). Хотя да, литкод часто дает заслать тупое решение. Эту задачу надо сделать «Напишите алгоритм который за кратчайшее время будет отвечать ДА/НЕТ» и дать матрицу + 10^6 запросов. В таком случае эта задача станет хоть чуть чуть похожа на medium. И твой код жиденько поймает TLE)
А скажи номер задачи пожалуйста, если такая есть
Прошу заметить, что алгоритм не обязательно строго оптимален. Его асимптоматика порядка O(n+m). В случае если n ≈ m, это лучший алгоритм, но в случае n
А я чет не понял. Инфы что массив сортирован у нас нет. Почему то что 15 > 9 дает нам возможность отбросить цифры в столбце? Мы же их не проверяли ?!
по условию все столбцы и строки идут в порядке возрастания. Если 15>9, значит числа больше 15 проверять смысла нет, их пропускаем.
@@senior_javist надо было это условие озвучить, а то я несколько минут голову ломал, как можно в рандомном массиве сделать это быстрее О(m*n)
@@yungscarecrow758 ты не один, бро :)
@@yungscarecrow758, вот поэтому его и не взяли в Гугл
А при условии, что строки и столбцы отсортированы, мы отбросили столбцы с 1 и 4, а там вполне могла оказаться 9-ка.
Ладно😂😂😂 поржали и хватит, а то и 5 будет больше девяти.😅
А если загадано число 18?
То по масиву ты пойдешь в низ на 19, потом в лево 12 затем в верх 16 и еще раз 17, и еще раз 26, и потом только в лево
Тогда пишешь [0][4] и ты на месте. Понял?
Я думал тут какой-то двумерный бинарный поиск, долго думал, а все оказалось куда проще
Так тут тупорылое решение. Бинарный лучше
Единственная проблема у погромистов в чатике айсикью < 80 и двумерный массив их сбивает с толку сразу
И это нужно решать чтобы просто работать у них грузчиком. Чтобы они говорили, что у них самые умные рабочие .😂
«Семь больше девяти»
Гениальный байт на коммент
Вот эти задачи точно придумывают люди, которые никогда не работали в ентерпрайзе, НИКОГДА. Потому что по моим наблюдениям, в массиве может быть вообще что угодно и где угодно.
Ахаха, 7 больше 9. Это гениально 😂😂😂
После такой лёгкой задачи в гугл возьмут максимум уборщиком😂
Обожаю доморощеных программистов/математиков/физиков и прочих мамкиных инженеров, предлагающих свое репетиторство/менторство..
Душнила в чате
Чисто технически, это решение не будет являться оптимальным, поскольку может потребовать больше мощностей, чем перебор и относится к частномк случаю, а не универсально.
В задаче запросили оптимальный вариант.. Перебор, а для частного случая можно остановиться на подобном переборе но с началом в центне
У меня аш волосы на письке поседели от таких умных многословесных произношений
Тем временем я сейчас как Сайтама: «Ок»😂
Двумерный масив "я просто существую", но ход мысли интересный
Таким образом можно просто придать цифрам порядковый номер и сделать генератор случайных чисел, а далее удача вам в помощь
Хочу чтоб автору на каждом собеседовании так же давали задания.
В условии не указали то, что числа будут по возрастанию. если вам попалась такая матрица то это совершенно не значит что следующая будет такая же.
Математика явно ваш не любимый предмет был в школе😂
Когда устраивался на должность уборщика
Ответ: 7 больше 9
Гугл: вы приняты на должность директора!!!!!
Присоединяюсь к комментариям, я тоже подумал, что массив произвольный
Класс, условие умерло. «Дан двумерный массив», но работать я с ним буду как с АВЛ деревом. Однозначно лайк !
Бинарный поиск курит в сторонке
Кратко: Бинарный поиск для матрицы
Думаю почему до сих пор не могу пройти собеседование ни в одну компанию. Вот она загвоздка: семь больше девяти. А я себе мозг сломал😮😅😂
После труу😂 я не стала понимать ничего😂😂😂
Это кстати на trainee собеседование. После этого задания просят с нуля написать дистрибутив linux чтобы был лучше Kali и удобнее Ubuntu
Подход классный. Искать ступеньку потом смещаться ниже и искать дальше. Но при гигантских размерностях бинарный поиск этой ступеньки будет быстрее. Продолжай, хорошо что двигаешь код в массы)
То, что числа расположены в порядке возрастания, не было сказано в правилах, а было представлено как "наблюдение": "обратите внимание". Если этого нет в правилах, то решение будет захардкоденным куском кала, заточенным под одну конкретную таблицу, а не под любую такую таблицу
Так это решение и заточено конкретно под этот массив, достаточно на код взглянуть чтобы это понять 😅
А теперь докажи, что это решение максимально эффективное.
Это на каком этапе собеседований спрашивают? Это точно в Google собеседование, а не в Gooqle?)
Видел эту задачу при устройстве в NASA, но мне повезло, что такая же задача была, когда я работал в Майкрософт
Семь больше девяти, понятно, понятно 😂
К алгоритм нужно добавить
if (масив == не удобный) {
print("Х..ли ты мне впариваешь не отсортированый масив?")
😂😂😂
Это задача уровня 8 класса школы с нормальной информатикой, я её щас успел решить до того, как ты сказал про диагональ
7 больше 9😂😂😂.
не мог не обратить внимание на данную ошибку, и не посмеяться.
Легко, когда объясняют. А так бы я стал шарить через весь матрикс
Сначала ищем столбец, потом строку, пользуясь информацией о сортировке.
Только вот искать их тоже можно эффективнее.
Да и решение явно подразумевает использование указателя.
Красавчик. Ум это важно
"7 больше 9" Ыыыы
Гугл отбирает себе не обычных наборщиков кода, которых и так предостаточно, а мозги, которые могут создавать алгоритмы. И это правильно.
7 больше 9ти, расходимся.
Логичнее с 30 начать, попутно идя к самому меньшему числу среди соседних:
Около 30 меньшее-24
Около 24-17
Около 17-14
Около 14-9
Заставило меня напрягать мозг, конечно я тоже могу выдумать условия решения и решить задачу зная пару команд😮
7 больше 9? Я же не один это услышал?😂
Самое эффективное решение: начать с центра
только вопрос. Какой смысл начинать справа, если всё то же самое будет и если начинать слева? только смотреться будет более складно и логично.
Я нашёл с помощью зрения и сразу)
Если в матрице все числа от 1 до n x m то можно записать её как одномерный массив, после чего вызвать алгоритм частичной сортировки (ставит 1 элемент на место), на то место где ожидается число.
Этот алгоритм должен хотябы раз обратиться к каждому элементу, тогда у тебя получается O(M*N), что по асимптотике не лучше, чем просто поиск по каждому элементу, а у алгоритма из решения скорость O(M+N)
самый эффективный вариант это пройтись по всем элементам 'матрицы', а не придумывать велосипед
Есть ещё быстрее код, если мы знаем что матрица отсортирована, в матрице 25-ть чисел. Мы берем начальную (допустим она 10) , берём последнюю (допустим она 80), нам надо найти 30. Усредненный коефициент распределения чисел по матрице это (80-10)/25 = 2.8. Потом (30-10)/2.8 = 7.1 т. е стартовать надо с 7 клетки.
При большом количестве таких матриц изначально стартовать с усредненно ближайшей ячейки будет выгодно по производительности. Особенно при больших матрицах.
я так понял что там я могу работать только уборщиком сейчас
Это же частный случай, такое на практике никогда не встретится, зачем проверяют такую глупость?
Лучше другое скажите. Я вот маме постоянно кеш телефона чищу от просмотренных видео в ватсапе. Внимание, там не только нет ограничения, но и виде сохраняются целиком в память, а еще делается дублирование походу если кто-то отослал другому или типа того. Т.е. у вас может быть хоть 100 видео одинаковых, которые забивают память. Теперь вопрос, вы правильно спросили, про частный случай, нахрена там вообще алгоритмы на собесе, если в подобных конторах пишут инвалиды код?
@@СерхиоБускетс-ф7я Очевидно, потому что проверяют такую дурь, вот они они и набирают тех, кто только такую даль писать и умеет, а не реальные юзкейсы.
Собеседование это форма унижения, если ты спец, то тебя берут полюбому
"Давайте решим задачу" желание: 📉📉📉, "которую даут нв собеседовании в гугл" желание: 📈📈📈📈
в условии дано слишком мало данных, чтоб смело заявлять "поиск будем производить справа", "отбрасывать" нижние числа и так далее
Ну если 7 больше 9 то здесь наши полномочия все, думал сова😂. Дорога в гугл открыта