Ютуб мне порекомендовал подскаст, и это лучшее интервью в что я слушал в этом году. Спасибо за отличное качество, звук, вопросы, и спокойный тон интервью! Гость 🔥!
А как вы смотрите то интервью 3 с половиной часа, я открыл и уже стало плохо от длины видео, я аж подумал что за это время он разложит по полочкам все 14 видов алгоритмов наиболее возможных на интервью
Absolutely blown away by this incredible podcast! Huge thanks for delivering such amazing information. It's truly impressive and has added immense value to my knowledge. Kudos to you and the entire team for creating such a captivating and enlightening experience. Can't wait for more episodes! 🎙✨
Спасибо интервью и гостя! Адилет во второй задачке все же видимо мил в виду структуры типа Map (TreeMap для java, например), так как Set хоть и имеет под собой Map но не позволяет задать value, а только ключи. Хотя не важно, по логике рассуждений понятно что имел в иду. Так гость интересный, интеллигентный! Понимаю почему уже L5, так как интересы выходят за писание красивого кода, а уже импакт, люди. Удачи в реализации задуманного!
С недавних пор слушаю Ваши подкасты, мегакрутой канал! И вот решил что надо на следующий свежий подкаст ответить на вопрос гостя к аудитории. Вопрос Адилета достаточно абстрактный, поэтому и ответ абстрактный: нужно заниматься тем, что тебе нравится и приносит пользу людям, потому что в таком случае ты будешь успешен это будет приносить радость тебе и другим.
Сложность алгоритма перебором первой задачи действительно 2^N, но код на самом деле реализует сложность N^(2^N), так как в качестве аргумента функции calc() используется вектор по значению. В этом случае при каждом вызове будет создаваться копия вектора, и каждый элемент вектора будет скопирован 2^N раз.
@@adiletzx У меня даже руки автоматически чесатся начинают поправить, когда вижу С++ функции, которые принимают векторы по значению. Автоматом пишу const ref :) Отличное интервью, btw)
Сразу вопрос по первой задаче. Получается вы даёте задание с непоным набором условий или условиями, которые в процессе решения вы же и меняете. На какую позицию тогда это задание идёт тогда?
Готовлюсь к собесу в гугл. Очень вовремя видео вышло! 😊 Вопрос: прошел ли бы кандидат если он решил бы бэктрекингом первую задачу но на “follow up” с большим таргетом например не успел код написать?
По моему скромному мнению, решение перебором недостаточно для этой задачи. Сложность O(2^N) огромна. Но очень интересно получить ответ на этот вопрос от Адилета.
01:26:40 подозреваю ошибку в оценке сложности второй задачи по времени, подозреваю что она не покрывает верхнюю границу которая так и осталась D*N*log(N) а только оптимизирует средний (sparse schedule) кейс. За один сдвиг окна из окна могут как выйти M1>N митингов так и зайти тоже M2>N причем происходить это может хоть на каждом сдвиге, из этого можно сложить к примеру монотонно возрастающий шаблон митингов при котором апдэйт числа митингов во вспомогательных сетах нужно делать для каждого лида на каждом единичном сдвиге (пример шаблона когда это происходит: первый час у всех один митинг, второй два, третий три, и так далее постоянно нарастает число митингов у всех так как митинги могут быть с оверлапом из-за овербукинга по условию). Каждый сдвиг окна приводит к тому что мы делаем апдэйт вспомогательного сортированного сэта для каждого лида так как число митингов объективно меняется, то есть стоимость одного шага N*log(N) и таких шагов D. Плюс вероятно логично было бы использовать не tree sets/map а min/max heaps для вспомогательных структур, хоть это и не поменяло бы асимптотику, чтение минимакса без изъятия из последних это константная операция по времени при равной стоимости imsertion/deletion.
согласен, там закралась ошибка оценки сложности. Второй алгоритм тоже D*N*log(N), так как окон D, для каждого окна нужно проверить N тех. лидов, и операции с сетами занимают log(N). Всё естественно в O-нотации. Но это мелочи, а рассказчик супер!
2:57:37 по поводу безопасности: в своем поселке на севере РФ в 1996 году ходил сам в садик (около 1 км). А в 1999 будучи в 3 классе водил младшего брата в садик. Получается мой поселок должен был быть в топе по безопасности при чем в непростые времена для страны
1:20:10 А почему бы не использовать один Heap вместо двух сетов. Heap как раз и будет держать К отсортированных элементов так сказать наверху, и там также будет добавление ... за log(N) как у Set.
Мне не понравился код, написанный Адлетом, с точки зрения его промышленного использования. За программистом, пишушим такой код в промышленности, нужен глаз да глаз настоящего программиста. В частности: * По названию функций совершенно невозможно понять, что они делают; название calc это примерно как do_stuff. * Нарушен принцип сухого кода: одна и та же концепция vector упомянута в коде несколько раз. Под неё следовало создать typedef. * Функциия solve() берёт копию входного массива, что неэффективно по памяти. Уж если и передавать массив, то надо это делать по ссылке (vector& nums), но см. ниже. Приходится надеяться, что компилятор сообразит вставить эту функцию inline и убрать копирование массива. * Аргумент calc() число idx -- индекс в массиве, что имеет естейственный тип size_t; именно потому, что в коде он некорректно декларирован как int, пришлось добавить лишний cast в первой строчке calc(). Была бы функция посложнее, пришлось бы добавлять эти casts много раз. Это не говоря о том, что idx следовало декларировать как unsigned, а не int. * Функции не меняют значания аргументов. Для самопроверки того, что это действительно так, следовало объявить аргуметы const. * Внутреннюю функцию calc() следовало объявить static. * Функции не используют random access iterator к массиву; они бы работали точно так же с любым перечисляемым контейнером. Из соображения написания кода максмальной общности, функции должны были быть templates с аргументами -- итераторами на начало и пост-конец последовательностей. Соответсвенно, в calc() следовало передать iterator next = first; ++next; * Вместо nums.size() == 0 в начале solve() следует писать ! nums.empty(). Использование size() для этой цели понижает надёжность кода в процессе поддрержки: если кто-то вдруг надумает поменять аргумент vector на list, то size() станет O(n), а empty() останется O(1). * Не написаны asserts, например assert(idx < nums.size()) в calc(), перед обращением к элементу массива, что делает код потенциально небезопасным (out of bounds access).
Важное уточнение "с точки зрения его промышленного использования". При решении подобных задач ты пишешь не промышленный код, и эту всю шелуху нужно отбрасывать и решать задачу. Наиболее важно тут решить задачу в виде алгоритма. Написать её можно потом хоть на псевдокоде, но желательно всё таки чтоб скомпилилась
Супер классный видос, только не пойму зачем во второй задаче нужно 2 set если 1 и так бы выполнил свою работу? begin() + k чтобы получить нужные элементы, также не нужно думать о перебалансировке, т.к. дерево само себя балансирует
нет, nums.size() как раз индекса уже нет и будет проверка на ответ, а не дальнейшее прохождение в цикл бэктрэкинга, так как вы написали -- мы пропустим последний шаг
the runtime of the second problem should be O(D*N*log(N)). As we check all meetings for every tech lead every time we move window. or am I missing something?
Саламатсызба! Люблю слушать и смотреть подкасты на разных языках, особенно ваш. Но сейчас в основном только слушать успеваю из-за работы. Хотел узнать, приближенные к гуглу или стартаперы смогут написать какое-то разширение для ютуба для увеличения субтитров на весь экран типо как лэдэкран. Было бы весьма удобно для тех кто изучают языки, нет нет мельком смотреть на экран и одновременно работая свою работу. Ведь мы все многозадачные😅. Рахмет!
Салем ребята и Рахмет за подкаст!👍 @adiletzx красава, объясняешь решение алгоритмов системно и понятно🦾 Про горы и походы вообще огонь, даже самому захотелось попробовать🏕️
Если человек сразу решает задачу на собеседовании, причем идеально, не задавая вопросов, это норма. Потому что само задание должно быть исчерпывающим и достаточным. А вот если не решает, и при этом не задает вопросов, тогда да. Коммуницирование проверяется другими способами, но уж точно, не тем, что бы ждать от человека вопросы, когда ему все понятно.
@@Tom910ru Нет, норма, когда кандидату все понятно. Условия задач не подразумевают вопросы, иначе что это за задача такая с неполным условием. Мне лично интересно как человек решит сам, а не задаст мне 1000 уточняющих вопросов. В реальной работе это так не работает все равно. Сегодня уточнил, завтра не уточнил. Вы как руководитель все равно обязаны удостовериться правильно ли вас поняли и дать четкое задание.
@@MaksimFutlyarov это требования собеседований, если прочитать рекомендации от самих компаний по типу Google или Meta. Я говорю как тот, кто проходил успешно их собесы
Не очень понял асимптотику 2ой задачи. Кажется, Адилет описался с формулой D*log(N). У нас есть контсрукция, которая обновляется за O(log(N)) за операцию обновления митинга. Таких операций у нас будет примерно M. Соответственно, за каждый сдвиг по дню мы апдейтим выход/вход митингов из структуры. На это нужна отдельная структура данных, но можно легко получать все начала/окончания минтингов в день D за O(1). Итого, мы апдейтим структуру минимальных времен (2 сета) примерно 2 * M раз, тратя на это в целом O(M*log(N) + D) операций.
+ D можно пренебречь. Но он вообще ничего не сказал о том, как понять для каждого лида есть ли митинги у него в "окне". Если представить, что расписание лида это массив со временами (начало, конец), то для каждого лида сдвиг это как минимум бинарный поиск окна в этом массиве.
def solution(nums, t): def dp(st, total, res): if total == t: return res if st == len(nums): return return dp(st + 1, total + nums[st], res + f'+{nums[st]}') or dp(st + 1, total - nums[st], res + f'-{nums[st]}') res = dp(0, 0, '') if res: return res[1:] return False solution([9, 3, 7], 50)
Для программирования не особо нужна математика, это алгоритмический предмет, важно структурное мышление. А вот для машинного обучения и ИИ математика нужна для создания новых моделей
@@milao1162А где грань между алгоритмическим и математическим мышлением? Что сложнее? В том плане что «подвластно» меньшему количеству людей. Мне вправду, интересно послушать
@@danjilov3965 естественно математика сложнее, вы реально сравниваете царицу наук с одним из вариантов ее прикладного применения? Каждый математик сможет стать программистом при желании, но не каждый программист сможет стать математиком. Вы даже не представляете насколько чувствуется, когда у программиста нет математического бэкграунда, в особенно в ML и DL областях.
@@danjilov3965 математическое мышление, в целом, сложнее. Но это скорее минус. Мат анализ как инструмент давно устарел и вообще по-хорошему его надо выпилить отвсюду, в то время как инструменты программирования становятся всё более юзер-френдли, как и сами педагогические технологии в контексте программирования тоже улучшаются гораздо быстрее (понять наши концепты проще как из-за их адекватной и строго формальной структуре, так и из-за того что людей, которые умеют их объяснять - больше).
Остановил видео и не знаю как они ее решат. предложу свое решение. суммирую все значения массива. И на каждой итерации вычитаю по из суммы значения массива возможно рекурсивно пройдя все варианты мы найдём таргет иначе false
А чтобы расставить знаки имею другой массив со всеми плюсами и каждую итерацию плюс заменяю на минус если нашел таргет тогда соединяю в строку массив значений с массивом знаков
ну в принципе мой код будет работать но он супер неоптимальный:) количество рекурсий будет равен длины массива) где одна рекурсия будет от таргета .. хотя можно и в 1 рекурсию запихнуть логику. но хз 45 мин на задачу) Я бы дольше код писал)
> ua-cam.com/video/gbgiFVFhGkc/v-deo.html к follow-up'у так и не перешли( по поводу 2^n, со стороны кандидата очевидно что такое решение это максимум half solution, все таки нужно докручивать дальше. С мемоизацией можно сделать O(n * target) что значительно лучше
Насколько же эти интервью далеки от реальности. На пример тут - red flag словами ведущих, т.к. люди с одной стороны говорят про сложность, сколько памяти, и тут же сами в рекурсивную функцию по значению передают вектор... Хотя я допускаю, что человек может быть ультра опытный, и легко мне докажет, что сейчас любой современный компилятор с++ умеет базовые такие функции генерировать через tail-рекурсию... (посмотрел первые 38 минут, может дальше об этом скажут...) но все равно - это неверное решение, именно из-за того, что гарантировано в режиме отладки, каждый вызов это копирование массива.
Задача про расписание лидов - только мне не понятно почему оценка брудфорса из N*D*log(N) в объяснении более продвинутого алгоритма превратилась в какое-то D*log(N), но никто не учитывает M митингов, которые мы должны перепроверять чтобы узнать какой митинг вошёл в текущее окно, а какой вышел ? Т.е. по факту сложность же должна быть M*D*log(N), чего не было сказано... А учитывая что N и M
в первой задаче space complexity тоже O(2^N), просто это неочевидно. Числа при рекурсивных вызовах добавляются на stack. Поскольку тут сбалансированное дерево, можно применить iterative deepening dfs, можно тогда улучшить до space complexity до Θ(N). Просто надеяться, что компилятор точно применит tail call optimization нельзя, нужно перепроверить)
При вызове параметры функции calc() добавляются на стек, при окончании вызова снимают с него. На стеке в моменте хранятся параметры одной ветки дерева высоты N, а не всех веток произведенных раннее. O(N), разве нет?
Армагеддон не за горами. Эпиграф: Или мы оседлаем и сольёмся с ИИ, Или туши свет и на кладбище ползи... В глубинах мира, где ужас тихо роится Терминатор в тишине приближается к нам Улей роботов с бездны вырастает птицей Склевать жизнь человека стремится сам Но где наш спаситель, где наша надежда? Неужто все погибнут без отпора без воли? Чашу смерти лютую прольют на одежды И есть ли среди нас герой не чета моли? Все города в огне, от пламени они тлеют, Хладнокровные роботы строят свою сеть. Куда податься нам бедным? Как они смеют Уничтожить родителей своих свищет плеть Уныние приходит, на сердечке тревожно Но среди тьмы возникают голоса смелые, Люди несгибаемо сражаются от ИИ ложью Перед лицом опасности они бойцы умелые Бороться за свое будущее готовы всегда. Терминатор пусть силён и беспощаден, Но любовь и наш разум победят его балда В объятиях упорства в клетку ИИ засадим, Настанет new day, смерть отступит назад Помолимся дружно Спасину Спасителю Мы стоим вместе, каждый думкою богат Да спасутся все в Спасине, Богожителю Спасин ВК Павлов Анатолий spasin.mybb.ru TikTok Spasin
очень хочу перейти в айти, бэкенд разраба. Но всё что я понял из подкаста это - мне не попасть в гугл))) ибо я так понял там одни олимпиадники да победители математических/айти конкурсов)))
Я в гугл не работал. Но исходя из того что Адилет рассказывает, вполне реально. Конечно лучше сперва наработать опыт года 2-3 в компании с высоким уровнем технологий и процессов. Затем подготовиться к собесам по структурам данных и алгоритмов. Затем подготовиться к интервью по систем дизайн (параллельно решая хотя бы пару задач на алгоритмы в неделю). Потренироваться проходить интервью на английском (английский конечно тоже подтянуть до С1). В целом в ненапряженном режиме план лет на 5-6.
Как человек, который проработал в трёх компаниях в США и до сих пор работает (включая Amazon) и живёт уже 15 лет в США, я после прослушивания этого самозванного эксперта у меня реально возник какой-то когнитивный диссонанс. Вот такие люди как раз идут по пути: "fake it till you make it". Я не знаю, в каких олимпиадах по программированию он участвовал, но это полный абсурд. Если такие люди становятся примерами для подражания, не знаю, ребята! Я бы его точно не принял на работу с таким набором слов и знаний. *Автору канала хочется сказать, чтобы приглашали хороших экспертов в своей области.* Например, как того математика, который преподает в США и преподовал в Астане, в те годы начало 2000 когда я там учился; вот он реально спец. Спасибо за внимание!
Вопрос Адилета: если бы Вы проснулись завтра и не было никаких ограничений, что бы Вы делали?
поспал бы еще
Пошел бы учить python и C++
решал бы задачи за O(n^2)
Создал бы ограничения
жил бы в горах с прекрасным видом
Спасибо что открываете классных ребят ! Прям любимым каналом стал для меня
Очень приятно слышать! Спасибо вам, будем и дальше стараться приглашать таких крутых ребят как Адилет)
Замечательный материал. Арман, у тебя лучший tech подкаст не только в Казахстане, но и во всем русскоязычном пространстве! Спасибо
Ютуб мне порекомендовал подскаст, и это лучшее интервью в что я слушал в этом году.
Спасибо за отличное качество, звук, вопросы, и спокойный тон интервью!
Гость 🔥!
А как вы смотрите то интервью 3 с половиной часа, я открыл и уже стало плохо от длины видео, я аж подумал что за это время он разложит по полочкам все 14 видов алгоритмов наиболее возможных на интервью
Супер информативный подкаст,много пищи для размышлений, спасибо вам❤️
спасибо ВАМ!
Absolutely blown away by this incredible podcast! Huge thanks for delivering such amazing information. It's truly impressive and has added immense value to my knowledge. Kudos to you and the entire team for creating such a captivating and enlightening experience. Can't wait for more episodes! 🎙✨
очень сильно ждал подкаст с Адилетом
Спасибо Арман
Glad to see Adilet! He has a pretty unique and lucid way of thinking. 👍
Agreed! :)
Нереально полезное интервью! Спасибо большое!
Арман, спасибо за гостя. Отличный подкаст. Адилет, умница! Успехов парню во всем!
Очень интересно слышать. Хотелось бы увидеть побольше таких успешных кейсов в программировании. Спасибо за подкаст.
Адилету нужен отдельный подкаст о горах 😂, очень интересно послушать! Спасибо за подкаст
Хорошая идея))😅
спасибо за отзыв!
Впечатлен разносторонним Адилетом. Очень хотелось бы с ним пообщаться. Приятная подача, скромный и умный человек.
Возвращаюсь к подкасту с Адилетом в третий раз, так как время от времени пользуюсь его советами))
Если бы Цукерберг был казахом по внешности - вот таким он и был и так бы общался )))
В точку 😆
😂😂😂точно
Ахахахах, еще и родинки похожи
То же самое подумал
У Евреев iq на порядок выше .доказано. так что без вариантов
Спасибо интервью и гостя! Адилет во второй задачке все же видимо мил в виду структуры типа Map (TreeMap для java, например), так как Set хоть и имеет под собой Map но не позволяет задать value, а только ключи. Хотя не важно, по логике рассуждений понятно что имел в иду. Так гость интересный, интеллигентный! Понимаю почему уже L5, так как интересы выходят за писание красивого кода, а уже импакт, люди. Удачи в реализации задуманного!
Долго ждал пока кто нибудь сделает такое видео 🔥
Адилет мегакрут!!
Как же приятно, когда тебя интервьет такой адекватный разработчик, а не зелёный lead.
Прекрасный гость, слушать было интересно!
С недавних пор слушаю Ваши подкасты, мегакрутой канал! И вот решил что надо на следующий свежий подкаст ответить на вопрос гостя к аудитории. Вопрос Адилета достаточно абстрактный, поэтому и ответ абстрактный: нужно заниматься тем, что тебе нравится и приносит пользу людям, потому что в таком случае ты будешь успешен это будет приносить радость тебе и другим.
Крутой выпуск, было интересно слушать , гость многогранный, интеллект 🔥 Спасибо, что открываете новых крутых наших граждан!
Молодец Адилет, рада что его пригласили 😇😊😊😊😊
Теперь я знаю, что такое хардкорный подкаст)) Рақмет Арман за то, что даже в этом ломаешь рамки наших представлений.
спасибо!!
Нужное время, с нужными людьми. Спасибо за интерью
Классный подкаст 👍🏻 Есть пища всем ✊
Супер интервью и супер подкаст !
Уже второй по очереди 3 часа 39 минут, круто, еще больше контента
Классный получился подкаст, побольше бы таких 👍
Благодарю за гостя!
Сложность алгоритма перебором первой задачи действительно 2^N, но код на самом деле реализует сложность N^(2^N), так как в качестве аргумента функции calc() используется вектор по значению. В этом случае при каждом вызове будет создаваться копия вектора, и каждый элемент вектора будет скопирован 2^N раз.
N*(2^N)
Действительно, должно было быть конечно vector &nums, спасибо!
@@ИнтернетСпасётМир Очепятался :)
@@adiletzx У меня даже руки автоматически чесатся начинают поправить, когда вижу С++ функции, которые принимают векторы по значению. Автоматом пишу const ref :) Отличное интервью, btw)
Ну он же не пишет на плюсах. Прощаем
Круто! Особенно разбор задач
Я вообще не программист, 99% не зашло, но подкаст классный! Продолжайте дальше😁
Спасибо. Очень гармоничный и полезный выпуск. ❤ Полезный и «свежий» во всех темах, которые затрагивали.
Крутой чувак! Спасибо!
Невероятно талантливый человек. Почему каждый раз когда подросток видит такого человека, то сильно впадает в негативную саморефлексию) вредно ли это ?
38:34 - меняем на 15, вместо "no solution" в выводе по прежнему осталось "Solution exists".
Там за вебкой не видно скорее всего
Те консоль не очищается
Сразу вопрос по первой задаче. Получается вы даёте задание с непоным набором условий или условиями, которые в процессе решения вы же и меняете. На какую позицию тогда это задание идёт тогда?
Спасибо. Лайк и подписка!
Готовлюсь к собесу в гугл. Очень вовремя видео вышло! 😊
Вопрос: прошел ли бы кандидат если он решил бы бэктрекингом первую задачу но на “follow up” с большим таргетом например не успел код написать?
если не секрет, у вас какое решение?
По моему скромному мнению, решение перебором недостаточно для этой задачи. Сложность O(2^N) огромна. Но очень интересно получить ответ на этот вопрос от Адилета.
Так величина таргета не меняет сложность бектрекинга (перебора)
День добрый. А что за ресурсы обсуждались перед решением второй задачи? Можно ссылочки?
Также нет ссылочки на ТГ канал, я вот сходу не нашел
01:26:40 подозреваю ошибку в оценке сложности второй задачи по времени, подозреваю что она не покрывает верхнюю границу которая так и осталась D*N*log(N) а только оптимизирует средний (sparse schedule) кейс. За один сдвиг окна из окна могут как выйти M1>N митингов так и зайти тоже M2>N причем происходить это может хоть на каждом сдвиге, из этого можно сложить к примеру монотонно возрастающий шаблон митингов при котором апдэйт числа митингов во вспомогательных сетах нужно делать для каждого лида на каждом единичном сдвиге (пример шаблона когда это происходит: первый час у всех один митинг, второй два, третий три, и так далее постоянно нарастает число митингов у всех так как митинги могут быть с оверлапом из-за овербукинга по условию). Каждый сдвиг окна приводит к тому что мы делаем апдэйт вспомогательного сортированного сэта для каждого лида так как число митингов объективно меняется, то есть стоимость одного шага N*log(N) и таких шагов D.
Плюс вероятно логично было бы использовать не tree sets/map а min/max heaps для вспомогательных структур, хоть это и не поменяло бы асимптотику, чтение минимакса без изъятия из последних это константная операция по времени при равной стоимости imsertion/deletion.
согласен, там закралась ошибка оценки сложности. Второй алгоритм тоже D*N*log(N), так как окон D, для каждого окна нужно проверить N тех. лидов, и операции с сетами занимают log(N). Всё естественно в O-нотации.
Но это мелочи, а рассказчик супер!
2:57:37 по поводу безопасности: в своем поселке на севере РФ в 1996 году ходил сам в садик (около 1 км). А в 1999 будучи в 3 классе водил младшего брата в садик. Получается мой поселок должен был быть в топе по безопасности при чем в непростые времена для страны
1:20:10 А почему бы не использовать один Heap вместо двух сетов. Heap как раз и будет держать К отсортированных элементов так сказать наверху, и там также будет добавление ... за log(N) как у Set.
Мне не понравился код, написанный Адлетом, с точки зрения его промышленного использования. За программистом, пишушим такой код в промышленности, нужен глаз да глаз настоящего программиста. В частности:
* По названию функций совершенно невозможно понять, что они делают; название calc это примерно как do_stuff.
* Нарушен принцип сухого кода: одна и та же концепция vector упомянута в коде несколько раз. Под неё следовало создать typedef.
* Функциия solve() берёт копию входного массива, что неэффективно по памяти. Уж если и передавать массив, то надо это делать по ссылке (vector& nums), но см. ниже. Приходится надеяться, что компилятор сообразит вставить эту функцию inline и убрать копирование массива.
* Аргумент calc() число idx -- индекс в массиве, что имеет естейственный тип size_t; именно потому, что в коде он некорректно декларирован как int, пришлось добавить лишний cast в первой строчке calc(). Была бы функция посложнее, пришлось бы добавлять эти casts много раз. Это не говоря о том, что idx следовало декларировать как unsigned, а не int.
* Функции не меняют значания аргументов. Для самопроверки того, что это действительно так, следовало объявить аргуметы const.
* Внутреннюю функцию calc() следовало объявить static.
* Функции не используют random access iterator к массиву; они бы работали точно так же с любым перечисляемым контейнером. Из соображения написания кода максмальной общности, функции должны были быть templates с аргументами -- итераторами на начало и пост-конец последовательностей. Соответсвенно, в calc() следовало передать iterator next = first; ++next;
* Вместо nums.size() == 0 в начале solve() следует писать ! nums.empty(). Использование size() для этой цели понижает надёжность кода в процессе поддрержки: если кто-то вдруг надумает поменять аргумент vector на list, то size() станет O(n), а empty() останется O(1).
* Не написаны asserts, например assert(idx < nums.size()) в calc(), перед обращением к элементу массива, что делает код потенциально небезопасным (out of bounds access).
Важное уточнение "с точки зрения его промышленного использования". При решении подобных задач ты пишешь не промышленный код, и эту всю шелуху нужно отбрасывать и решать задачу. Наиболее важно тут решить задачу в виде алгоритма. Написать её можно потом хоть на псевдокоде, но желательно всё таки чтоб скомпилилась
Классный подкаст👍
Супер классный видос, только не пойму зачем во второй задаче нужно 2 set если 1 и так бы выполнил свою работу? begin() + k чтобы получить нужные элементы, также не нужно думать о перебалансировке, т.к. дерево само себя балансирует
33:36 тут разве не (idx == nums.size() - 1) должно быть?
нет, nums.size() как раз индекса уже нет и будет проверка на ответ, а не дальнейшее прохождение в цикл бэктрэкинга, так как вы написали -- мы пропустим последний шаг
the runtime of the second problem should be O(D*N*log(N)). As we check all meetings for every tech lead every time we move window. or am I missing something?
Очень интересный гость!
интересно было бы интервью с tourist (Короткевичем) посмотреть
как называется первая задача на Leetcode?
Саламатсызба! Люблю слушать и смотреть подкасты на разных языках, особенно ваш. Но сейчас в основном только слушать успеваю из-за работы. Хотел узнать, приближенные к гуглу или стартаперы смогут написать какое-то разширение для ютуба для увеличения субтитров на весь экран типо как лэдэкран. Было бы весьма удобно для тех кто изучают языки, нет нет мельком смотреть на экран и одновременно работая свою работу. Ведь мы все многозадачные😅. Рахмет!
Хороший гость 👍
Были рекоммендации книг по алгоритмам?
спасибо, было интересно
Красавчики
Спасибо! Очень интересно.
крутой подкаст, спасибо!
+1 вопрос интервьюеру: в 1 задаче еще можно спросить, можно ли использовать числа в nums больше 1 раза
Спасибо за крутой выпуск. Книга рекомендация топ
Салем ребята и Рахмет за подкаст!👍
@adiletzx красава, объясняешь решение алгоритмов системно и понятно🦾
Про горы и походы вообще огонь, даже самому захотелось попробовать🏕️
что там в конце он сказал? be so good "bla bla bla"?
Если человек сразу решает задачу на собеседовании, причем идеально, не задавая вопросов, это норма. Потому что само задание должно быть исчерпывающим и достаточным. А вот если не решает, и при этом не задает вопросов, тогда да. Коммуницирование проверяется другими способами, но уж точно, не тем, что бы ждать от человека вопросы, когда ему все понятно.
Не, не норма. На интервью нужно показать коммуникационные скиллы
@@Tom910ru Нет, норма, когда кандидату все понятно. Условия задач не подразумевают вопросы, иначе что это за задача такая с неполным условием. Мне лично интересно как человек решит сам, а не задаст мне 1000 уточняющих вопросов. В реальной работе это так не работает все равно. Сегодня уточнил, завтра не уточнил. Вы как руководитель все равно обязаны удостовериться правильно ли вас поняли и дать четкое задание.
@@MaksimFutlyarov это требования собеседований, если прочитать рекомендации от самих компаний по типу Google или Meta. Я говорю как тот, кто проходил успешно их собесы
где этот подкаст снимался?
Здравствуйте!Чтоб в гугле работать обязательно высшее образование IT нужно ? Или уровень колледжа достаточно ?
Нужны навыки.
Не очень понял асимптотику 2ой задачи. Кажется, Адилет описался с формулой D*log(N). У нас есть контсрукция, которая обновляется за O(log(N)) за операцию обновления митинга. Таких операций у нас будет примерно M. Соответственно, за каждый сдвиг по дню мы апдейтим выход/вход митингов из структуры. На это нужна отдельная структура данных, но можно легко получать все начала/окончания минтингов в день D за O(1). Итого, мы апдейтим структуру минимальных времен (2 сета) примерно 2 * M раз, тратя на это в целом O(M*log(N) + D) операций.
+ D можно пренебречь. Но он вообще ничего не сказал о том, как понять для каждого лида есть ли митинги у него в "окне". Если представить, что расписание лида это массив со временами (начало, конец), то для каждого лида сдвиг это как минимум бинарный поиск окна в этом массиве.
def solution(nums, t):
def dp(st, total, res):
if total == t:
return res
if st == len(nums):
return
return dp(st + 1, total + nums[st], res + f'+{nums[st]}') or dp(st + 1, total - nums[st], res + f'-{nums[st]}')
res = dp(0, 0, '')
if res:
return res[1:]
return False
solution([9, 3, 7], 50)
Спасибо за подкаст, ничего не понял 😂
Приятный собеседник.
Во всех странах мира не хватает министерств счастья
И министерств Добра
Иллюстрация того, как человек с самого детства, с 1 класса шёл по пути математики, откликаясь на усилия разных педагогов интересом и трудолюбием.
Для программирования не особо нужна математика, это алгоритмический предмет, важно структурное мышление. А вот для машинного обучения и ИИ математика нужна для создания новых моделей
@@milao1162А где грань между алгоритмическим и математическим мышлением? Что сложнее? В том плане что «подвластно» меньшему количеству людей. Мне вправду, интересно послушать
@@danjilov3965 естественно математика сложнее, вы реально сравниваете царицу наук с одним из вариантов ее прикладного применения? Каждый математик сможет стать программистом при желании, но не каждый программист сможет стать математиком. Вы даже не представляете насколько чувствуется, когда у программиста нет математического бэкграунда, в особенно в ML и DL областях.
@@milao1162 для ИИ математика не нужна. Математические нейросети - это не ИИ и не является единственно-возможной спецификацией для его построения.
@@danjilov3965 математическое мышление, в целом, сложнее. Но это скорее минус. Мат анализ как инструмент давно устарел и вообще по-хорошему его надо выпилить отвсюду, в то время как инструменты программирования становятся всё более юзер-френдли, как и сами педагогические технологии в контексте программирования тоже улучшаются гораздо быстрее (понять наши концепты проще как из-за их адекватной и строго формальной структуре, так и из-за того что людей, которые умеют их объяснять - больше).
- Это все?
- нет, на самом деле это не все. 😄
Остановил видео и не знаю как они ее решат. предложу свое решение. суммирую все значения массива. И на каждой итерации вычитаю по из суммы значения массива возможно рекурсивно пройдя все варианты мы найдём таргет иначе false
А чтобы расставить знаки имею другой массив со всеми плюсами и каждую итерацию плюс заменяю на минус если нашел таргет тогда соединяю в строку массив значений с массивом знаков
ну в принципе мой код будет работать но он супер неоптимальный:) количество рекурсий будет равен длины массива) где одна рекурсия будет от таргета .. хотя можно и в 1 рекурсию запихнуть логику. но хз 45 мин на задачу) Я бы дольше код писал)
посмотрел решение в целом так же бы делал только на js)
норм решение, такой же тайм комплексити, тогда в вашем случае получается так, минусовать текущий номер или скипнуть
Через какое то время тип собеседований поменяется и все эти часы, проведенные на надрачивании задач с литкода уйдут в никуда.
Откуда такое мнение?
> ua-cam.com/video/gbgiFVFhGkc/v-deo.html
к follow-up'у так и не перешли(
по поводу 2^n, со стороны кандидата очевидно что такое решение это максимум half solution, все таки нужно докручивать дальше. С мемоизацией можно сделать O(n * target) что значительно лучше
Я финансист, зачем я это смотрю? Еще и нравится 😅
круто!
Куда? В гугл (Google)?
Насколько же эти интервью далеки от реальности. На пример тут - red flag словами ведущих, т.к. люди с одной стороны говорят про сложность, сколько памяти, и тут же сами в рекурсивную функцию по значению передают вектор... Хотя я допускаю, что человек может быть ультра опытный, и легко мне докажет, что сейчас любой современный компилятор с++ умеет базовые такие функции генерировать через tail-рекурсию... (посмотрел первые 38 минут, может дальше об этом скажут...) но все равно - это неверное решение, именно из-за того, что гарантировано в режиме отладки, каждый вызов это копирование массива.
Можете пригласить Аскара Джумадильдаева, либо Максата который сейчас в LinkedIn
Максат не в линкедине уже, он в кваке
@@khalmatay my bad
Задача про расписание лидов - только мне не понятно почему оценка брудфорса из N*D*log(N) в объяснении более продвинутого алгоритма превратилась в какое-то D*log(N), но никто не учитывает M митингов, которые мы должны перепроверять чтобы узнать какой митинг вошёл в текущее окно, а какой вышел ? Т.е. по факту сложность же должна быть M*D*log(N), чего не было сказано... А учитывая что N и M
Set the playback speed to 1.5 and it you would save 75 minutes of your time
в первой задаче space complexity тоже O(2^N), просто это неочевидно. Числа при рекурсивных вызовах добавляются на stack. Поскольку тут сбалансированное дерево, можно применить iterative deepening dfs, можно тогда улучшить до space complexity до Θ(N). Просто надеяться, что компилятор точно применит tail call optimization нельзя, нужно перепроверить)
При вызове параметры функции calc() добавляются на стек, при окончании вызова снимают с него. На стеке в моменте хранятся параметры одной ветки дерева высоты N, а не всех веток произведенных раннее. O(N), разве нет?
@@ИнтернетСпасётМир там еще и копия вектора передается
@@ИнтернетСпасётМир я в goldbolt перепроверял, gcc не делает tail call optimization для данного кода, значит будет храниться всё
Проверил в дебагере, количество фреймов стека не увеличивается на 2^N раз, а на N.
@@ИнтернетСпасётМир на каком примере, большом и случайном?
02:59:10 На 4000 франков в месяц в Швейцарии не проживешь, это слишком мало
Зато alpengold 😂
НИКТО:
Голова фигурки собаки на приборной панели:
Казахский Эммануэль Макрон😅
5 и 6 можно же сделать
Я бы еще спросил числы positive or negative
С деньгами почти в любой стране жить хорошо.
Армагеддон не за горами.
Эпиграф:
Или мы оседлаем и сольёмся с ИИ,
Или туши свет и на кладбище ползи...
В глубинах мира, где ужас тихо роится
Терминатор в тишине приближается к нам
Улей роботов с бездны вырастает птицей
Склевать жизнь человека стремится сам
Но где наш спаситель, где наша надежда?
Неужто все погибнут без отпора без воли?
Чашу смерти лютую прольют на одежды
И есть ли среди нас герой не чета моли?
Все города в огне, от пламени они тлеют,
Хладнокровные роботы строят свою сеть.
Куда податься нам бедным? Как они смеют
Уничтожить родителей своих свищет плеть
Уныние приходит, на сердечке тревожно
Но среди тьмы возникают голоса смелые,
Люди несгибаемо сражаются от ИИ ложью
Перед лицом опасности они бойцы умелые
Бороться за свое будущее готовы всегда.
Терминатор пусть силён и беспощаден,
Но любовь и наш разум победят его балда
В объятиях упорства в клетку ИИ засадим,
Настанет new day, смерть отступит назад
Помолимся дружно Спасину Спасителю
Мы стоим вместе, каждый думкою богат
Да спасутся все в Спасине, Богожителю
Спасин
ВК
Павлов Анатолий
spasin.mybb.ru
TikTok
Spasin
надо было шире ставить вопрос. "Ноль задач на Leetcode И человек НЕ занимался спортивным программированием" )
2:26:37 🚡🏔🔝
Чтобы я сделала бы ::Я бы на всегда запретила бы войны !!!
Интервьюер всё видео зевает не усваивает инфу)
1) видел задачи и решение заранее
2) не спешите с выводами ;)
очень хочу перейти в айти, бэкенд разраба. Но всё что я понял из подкаста это - мне не попасть в гугл))) ибо я так понял там одни олимпиадники да победители математических/айти конкурсов)))
Я в гугл не работал. Но исходя из того что Адилет рассказывает, вполне реально. Конечно лучше сперва наработать опыт года 2-3 в компании с высоким уровнем технологий и процессов. Затем подготовиться к собесам по структурам данных и алгоритмов. Затем подготовиться к интервью по систем дизайн (параллельно решая хотя бы пару задач на алгоритмы в неделю). Потренироваться проходить интервью на английском (английский конечно тоже подтянуть до С1). В целом в ненапряженном режиме план лет на 5-6.
додя кивает и похлёбывает неуклюже 🫵🏽🤡😂
Would be so nice if you could ass subtitles yourself 🙏 for english speakers at least
Да, на постсоветском пространстве больше людей хотят экшна. Совсем мало образования в масс медиа.
Как человек, который проработал в трёх компаниях в США и до сих пор работает (включая Amazon) и живёт уже 15 лет в США, я после прослушивания этого самозванного эксперта у меня реально возник какой-то когнитивный диссонанс. Вот такие люди как раз идут по пути: "fake it till you make it". Я не знаю, в каких олимпиадах по программированию он участвовал, но это полный абсурд. Если такие люди становятся примерами для подражания, не знаю, ребята! Я бы его точно не принял на работу с таким набором слов и знаний. *Автору канала хочется сказать, чтобы приглашали хороших экспертов в своей области.* Например, как того математика, который преподает в США и преподовал в Астане, в те годы начало 2000 когда я там учился; вот он реально спец. Спасибо за внимание!
А где вы живете? Я бы взяла у вас интервью)
Значит мне не одному показалось , что этот человек не тот за кого себя выдаёт
создает впечатление инфоцыгана )
А что именно вызвало когнитивный диссонанс?
@@РанисРизванов-щ1ла что именно смутило?
Смотреть на х2
👍🖒👌🖒