Вторая задача с первого собеседования в Яндекс

Поделиться
HTML-код
  • Опубликовано: 22 сен 2021
  • #Программирование #Яндекс #Деревья #Алгоритмы
  • НаукаНаука

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

  • @wolf_code
    @wolf_code  2 года назад +24

    Вот такой вот фетиш в яндекс на алгоритмические задачи)

  • @abdelk.2060
    @abdelk.2060 2 года назад +3

    Очень помогло, спасибо за видео!!!

  • @a.khakimov
    @a.khakimov 2 года назад +10

    Выглядит очень красиво и лаконично

  • @user-xr7ou1xf9x
    @user-xr7ou1xf9x Год назад +4

    Любые задачи на дерево решаются через BFS или DFS. Или обход в ширину, или в глубину. Тут, очевидно, в глубину. Такую задачу дают на собесах в Гугл и Амазон. Не знаю, кто начал раньше. Решение - отличное! Интересно было посмотреть, как оно на Scala реализуется. Спасибо за контент!

  • @TheSanSanch
    @TheSanSanch 2 года назад +12

    Лет пять назад собеседовался в яндекс, после созвона с HR было онлайн-интервью с разрабом и одной из задач он меня как раз просил посчитать максимальную сумму ветки) Ничего не меняется) забавно, но помню, как будто бы вчера было)

  • @alexb1708
    @alexb1708 2 года назад +2

    привет с пикабу
    Подписался, спасибо теперь буду смотреть

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

    How interesting!

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

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

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

      есть второе видео, где мы ломаем данное решение, там будет проще сделать то что Вы хотите
      ruclips.net/video/0_4cgLGSmKA/видео.html

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

    дак если дерево - это рекурсивная структура, то как тогда мы можем идти снизу вверх, если число конечных узлов не известно?
    почему нельзя идти сверху вниз, и если мы к примеру знаем максимальное число, которое способно содержать узел (видимо 9 в этой задаче), понимать, идти ли нам дальше вглубь, или нет

  • @user-bu5hg5ru3d
    @user-bu5hg5ru3d 2 года назад +20

    Не совсем понятно: в начале вы сказали что нужно найти ветку с максимальной суммой, а нашли сумму чисел в ветке с максимальной суммой. Если гооврить строго то ответ должен представлять собой перечисление идентификаторов узлов дерева по которым нашлась максимальная сумма, это потребует модификации метода MAX - но алгоритм по сути будет то же.

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

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

    • @igorromanenko336
      @igorromanenko336 2 года назад +2

      … душнила

    • @Disorrder
      @Disorrder 2 года назад +2

      @@igorromanenko336 вообще, я бы перед решением уточнил, что в ответе нужно вернуть: просто сумму или прям саму ветку? Но поскольку мне не у кого спросить, я подумал, что наверное это усложнённая задача и имелась в виду сумма. Так что не душнила. Нормально подмечено.

  • @user-eg6yg7xt9b
    @user-eg6yg7xt9b 2 года назад

    Проходил собеседование в Microsoft. Спрашивали больше об абстрактном понимании рекурсии и многопоточности. Когда yandex в последний раз видел деревья на интерпрайзе?

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

      Не знаю, не работал в яндексе)
      Эти вопросы оч мало связаны не энтерпрайзом если конечно не писать либы

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

    Вот смотрю я на этот Scala, рассказываете про его фишечки типа параметры по умолчанию, sealed, object и понимаю, что эти штуки есть в Kotlin.
    Scala появился в 2003г., Kotlin - в 2011г. Похоже, что Kotlin у них позаимствовал некоторые вещи.

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

    В задаче сказано: найти ветку с максимальной суммой узлов. Алгоритм просто выводит эту сумму. Это разные вещи.

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

      Да, это мой просчет, но алгоритм легко переделать чтобы возвращал ветку

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

      @@wolf_code как?

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

      @@zugzug90 при рекурсивном спуске храним еще и список узлов по которым спустились и возвращаем как значение из функции

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

    Не знаю зачем это мне, но было интересно!

  • @user-zp7ey1sl5b
    @user-zp7ey1sl5b Год назад +1

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

  • @pavuk7086
    @pavuk7086 10 месяцев назад

    Подскажите, какими материалами пользовались для изучения алгоритмов? Хочу к ним на фронта попасть)

    • @wolf_code
      @wolf_code  10 месяцев назад

      кормэн - алгоритмы построение и анализ

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

    я бы решал от корня к листьям и потом взял бы максимум от всех листьев.
    Но так даже красивее) Хотел сказать я, но вспомнил про рекурсию.
    Я предпочитаю деревья упаковывать в массив, так можно обойтись без рекурсии. Достаточно понимать, что индекс корня = 1, а индекс потомков любой ноды = 2i и 2i+1.

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

      А если дерево неполное?

  • @7Denial7
    @7Denial7 8 месяцев назад

    А вот мое решение на VBA, тоже рекурсивное. Оно учитывает варианты когда веса заданы отрицательные. И собирает в один лист (коллекцию) все узлы максимальной ветки:
    Public Function FindMaxBranch(BinTree As BinTreeNode, _
    Optional ByRef total As Long) As Collection
    Dim ListL As Collection, ListR As Collection
    Dim totalL As Long, totalR As Long
    If BinTree Is Nothing Then Exit Function
    Set ListL = FindMaxBranch(BinTree.Left, totalL)
    Set ListR = FindMaxBranch(BinTree.Right, totalR)
    total = totalL
    Select Case True
    Case ListL Is Nothing And ListR Is Nothing: Set FindMaxBranch = New Collection
    Case ListR Is Nothing: Set FindMaxBranch = ListL
    Case ListL Is Nothing Or totalR > totalL: Set FindMaxBranch = ListR: total = totalR
    Case Else: Set FindMaxBranch = ListL
    End Select
    FindMaxBranch.Add BinTree
    total = total + BinTree.Weight
    End Function

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

    А за рекурсию в Яндексе ни кто не спросил? или данный подход вполне применим к данной задаче?

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

      Есть еще одно видео на канале, где эту рекурсию я переделываю в хвостовую

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

      ruclips.net/video/0_4cgLGSmKA/видео.html
      Подбробил на 2 части, т к мою дикцию пока врядли можно больше 10 минут выдержать)))

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

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

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

      Можно было, второе видео почти про это, там поиск в глубину

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

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

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

      Не понял вопроса

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

      ​@@wolf_code Извиняюсь.. Это я ошибся.. Я думал, что есть просто дерево, и на каждом узле свой вес, отличный от значения этого узла должен быть.. а на самом деле значение узла и есть вес этого узла. А не взвешенное бинарное дерево, это когда веса каждого узла равны, и тогда поиск наибольшей суммы по ветке равен ветке с наибольшим количеством узлов.

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

    Как же в этом языке всё лаконично выглядит) Вы, я так понимаю, на нём работаете?

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

    Что это у вас за IDE ?

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

      Intellij Idea от Jet Brains

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

    А задачки со всторого собеседования будут?

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

      Второй раз не ходил

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

      @@wolf_code не понравилось?

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

      @@obukhoff в первый раз ходил чтобы устроиться к ним, ходить чисто ради спортивного интереса - неуважение чужого времени

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

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

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

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

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

      @@wolf_code а по какому алгоритму в это дерево туда кладут элементы и как их находят, и какой смысл от такого бинарного дерева?

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

      @@alexandrguravskiy9985 смысл какой от такого дерева это уже другой вопрос
      искуственная задача по алгоритмам для проверки знаний

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

      @@wolf_code Спасибо, пытаюсь найти практическое применение а его нет!🙃

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

      @@alexandrguravskiy9985 по условию надо найти максимальную ветку, поиск практического применения это уже другая задача)

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

    Решение с DFS проще, зачем так усложнять?

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

      и какое оно будет?

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

      @@wolf_code если я правильно понял, его вы разобрали в следующем видео

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

      @@linuxeed уже и не помню

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

    Это собеседование на кого, джуниор фронт энд?)

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

      🤣🤣🤣

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

      @@wolf_code да сегодня для джунов пол сотни библиотек требуют, пара деревьев там совсем не заметны.)

  • @user-wz2sl8yu6s
    @user-wz2sl8yu6s 2 года назад

    Я тоже подумал о обходе в глубину

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

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

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

    Решение не будет работать если в дереве есть отрицательные числа

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

      Почему?
      Есть контртест?

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

      @@wolf_code Да, правда мой косяк. Это следующая задача, найти максимальную сумму любого подбранча в дереве.

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

    Это че на джуна задание ? Выглядит крайне просто

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

      Наверное ты слишком скиловый)

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

      @@wolf_code да нет, просто вполне ясная реализация

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

      @@wolf_code так на какую позицию такой таск ?

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

      @@KeizashiAcidRain я тогда на мидла шел, это был первый этап из 3х

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

      @@wolf_code o_o спасибо за информацию