Forwarded from Нейронный Кот
Кстати, пару лет назад записывал лекцию о том, как можно получить дифференцируемое расстояние Левенштейна (собственно, нужно просто обучить нейронку в metric learning сетинге).
Зачем это нужно: часто есть мисматч между метрикой и лоссом. Например, в задаче машинного перевода мы обычно используем cross-entropy loss, а измеряем BLEU. Почему бы сразу не учить с помощью BLEU? Не понятно, как прокинуть градиенты :(
Так вот, кажется, с приходом ChatGPT мы все больше будем напрямую оптимизировать метрику напрямую через RL, а не пытаться найти трюки, чтобы метрику сделать дифференцируемой.
Блогпост от huggingface про Reinforcement Learning from Human Feedback
Зачем это нужно: часто есть мисматч между метрикой и лоссом. Например, в задаче машинного перевода мы обычно используем cross-entropy loss, а измеряем BLEU. Почему бы сразу не учить с помощью BLEU? Не понятно, как прокинуть градиенты :(
Так вот, кажется, с приходом ChatGPT мы все больше будем напрямую оптимизировать метрику напрямую через RL, а не пытаться найти трюки, чтобы метрику сделать дифференцируемой.
Блогпост от huggingface про Reinforcement Learning from Human Feedback
YouTube
Ivan Fursov: Deep Levenshtein
Data Fest Online 2020
NLP in Industry Track: https://ods.ai/tracks/nlp-df2020
Расскажу про то, как с помощью глубокого обучения решать задачи по поиску похожих строк (В том числе: дедупликация, текстовая кластеризация на основе расстояния Левенштейна, исправление…
NLP in Industry Track: https://ods.ai/tracks/nlp-df2020
Расскажу про то, как с помощью глубокого обучения решать задачи по поиску похожих строк (В том числе: дедупликация, текстовая кластеризация на основе расстояния Левенштейна, исправление…
Forwarded from DevFM
Индексы в PostgreSQL
До поры, до времени базами данных можно просто пользоваться, не особо вникая в детали работы. Но однажды что-то где-то начинает подтупливать. Тут-то и приходится разбираться.
У нас уже был заход про EXPLAIN. Теперь перейдем к более серьезным вещам, которые нужны при работе с реляционными базами, в частности, PostgreSQL — индексы.
Первая статья из цикла знакомит с особенностями применения индексов в PostgreSQL. Эти знания помогут лучше понимать и обосновывать, для чего и когда использовать индексы.
Статья освещает следующие моменты:
— какие есть способы сканирования — индексное, по битовой карте, последовательное
— как селективность данных влияет на способ сканирования
— почему индекс работает тем лучше, чем меньше строк удовлетворяют условию поиска
— покрывающие индексы и как они позволяют почти не обращаться к таблице
— как проиндексировать только часть строк таблицы для случая неравномерного распределения значений
— параллельное построение индексов, чтобы избежать блокировок при активных вставках и удалениях
Для освоения статьи требуется полная сосредоточенность и погружение, понадобится неоднократно гуглить. В общем, чтиво как раз на воскресный денек :)
На этой статье можно не останавливаться. Далее в цикле нас знакомят с нюансами использования конкретных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.
Многие практически значимые детали, приведенные в статьях часто спрашиваются на собеседовании разработчиков уровня middle.
#skills
До поры, до времени базами данных можно просто пользоваться, не особо вникая в детали работы. Но однажды что-то где-то начинает подтупливать. Тут-то и приходится разбираться.
У нас уже был заход про EXPLAIN. Теперь перейдем к более серьезным вещам, которые нужны при работе с реляционными базами, в частности, PostgreSQL — индексы.
Первая статья из цикла знакомит с особенностями применения индексов в PostgreSQL. Эти знания помогут лучше понимать и обосновывать, для чего и когда использовать индексы.
Статья освещает следующие моменты:
— какие есть способы сканирования — индексное, по битовой карте, последовательное
— как селективность данных влияет на способ сканирования
— почему индекс работает тем лучше, чем меньше строк удовлетворяют условию поиска
— покрывающие индексы и как они позволяют почти не обращаться к таблице
— как проиндексировать только часть строк таблицы для случая неравномерного распределения значений
— параллельное построение индексов, чтобы избежать блокировок при активных вставках и удалениях
Для освоения статьи требуется полная сосредоточенность и погружение, понадобится неоднократно гуглить. В общем, чтиво как раз на воскресный денек :)
На этой статье можно не останавливаться. Далее в цикле нас знакомят с нюансами использования конкретных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.
Многие практически значимые детали, приведенные в статьях часто спрашиваются на собеседовании разработчиков уровня middle.
#skills
Хабр
Индексы в PostgreSQL — 1
Предисловие В этой серии статей речь пойдет об индексах в PostgreSQL. Любой вопрос можно рассматривать с разных точек зрения. Мы будем говорить о том, что должно интересовать прикладного разработчика,...
Forwarded from DevFM
ООП на простых примерах
В 40-минутном видео аккуратно объясняют три кита объектно-ориентированного программирования. Примеры даны на TypeScript, но понятны любому разработчику. Автор аккуратно иллюстрирует необходимость ООП, рассказывает про инкапсуляцию, наследование и полиморфизм. Покрыты даже относительно сложные вещи вроде параметрического и ad-hoc полиморфизма.
На трёх китах ООП автор не заканчивает. Вторая половина ролика повествует о композиции и агрегации на примере автомобиля с двигателем и колёсами, об абстрактных классах и интерфейсах, и даже немного о дженериках. Завершает изложение реализация паттернов Dependency Injection и Singleton. При этом Singleton во многих случаях является антипаттерном и мы не рекомендуем его применять.
Обратите внимание, как автор умело использует IDE для автогенерации сеттеров и геттеров. Не забывайте, что IDE — ваш добрый друг, который много чего умеет.
Про нюансы getattr и setattr в питоне мы делали отдельные посты.
#sudo #youtube #procode
В 40-минутном видео аккуратно объясняют три кита объектно-ориентированного программирования. Примеры даны на TypeScript, но понятны любому разработчику. Автор аккуратно иллюстрирует необходимость ООП, рассказывает про инкапсуляцию, наследование и полиморфизм. Покрыты даже относительно сложные вещи вроде параметрического и ad-hoc полиморфизма.
На трёх китах ООП автор не заканчивает. Вторая половина ролика повествует о композиции и агрегации на примере автомобиля с двигателем и колёсами, об абстрактных классах и интерфейсах, и даже немного о дженериках. Завершает изложение реализация паттернов Dependency Injection и Singleton. При этом Singleton во многих случаях является антипаттерном и мы не рекомендуем его применять.
Обратите внимание, как автор умело использует IDE для автогенерации сеттеров и геттеров. Не забывайте, что IDE — ваш добрый друг, который много чего умеет.
Про нюансы getattr и setattr в питоне мы делали отдельные посты.
#sudo #youtube #procode
YouTube
ООП на простых примерах. Объектно-ориентированное программирование
ООП простым языком. Основные концепции объектно ориентированного программирования. Объекты, классы, инкапсуляция, полиморфизм, наследование, композиция, агрегация, интерфейсы, паттерны, solid, dependency injection.
Мой курс "Продвинутый Frontend. В production…
Мой курс "Продвинутый Frontend. В production…
Forwarded from Борис опять
# Минимальные знания Software Engineering для Data Scientist 2/3
## Память в Python
Читаем как Python работает с памятью, чтобы никогда больше не потеть на вопросе про GIL. По части DS позволяет лучше утилизировать железо, не делать глупостей вроде лишних копирований гигантских массивов и лучше интуитивно понимать работу кода.
Статья раз
Статья два
## HTTP
HTTP это то, на чем держится веб: когда вы открываете сайты, скачиваете датасеты, пользуетесь API. Инференс и деплой ML моделей почти всегда связан с HTTP.
Изучаем теорию:
Статья попроще
Статья подлиннее
Проходим туториал: Python’s Requests Library Guide
## Sklearn Pipelines
Sklearn Pipelines User Guide
С одной стороны без Sklearn в ML практически никуда и Pipeline это большая его киллер-фича, которая экономит уйму времени, позволяет избежать ошибок и упрощает перенос кода в продакшн. Но более важно то, что парадигма пайплайнов, то есть обработки данных через серию последовательных шагов, повсеместно встречается в ML экосистеме. Пайплайны в Sklearn это отличное введение. Познакомившись с ними будет гораздо проще осваивать популярные ML инструменты.
Для закрепления: берем ML задачу, которую решали (хоть Титаник на Kaggle) и переписываем с использованием Pipeline.
## SQL
https://sqlbolt.com/ - Проходим туториал вплоть до 12 урока.
Без SQL никуда. Чаще всего данные для моделей появляются когда мы заклинаем базы данных языком SQL.
Нас интересует все, касается запросов к существующим таблицам. Для минимального пути можно опустить все что касается вставок и создания таблиц.
Если вы хотите стать настоящим самураем SQL и быть круче большинства аналитиков, то надо взобраться на эту гору: www.sql-ex.ru
## Docker
Официальный туториал по Docker
Docker становится таким же необходимым, как Git. Позволяет паковать любой код в контейнеры, которые ведут себя как виртуальные машины, но делают это быстро. На практике это означает, что можно очень быстро разворачивать и сворачивать целые экосистемы прямо на своем ноуте. Хочешь базу данных: пара консольных команд и получаешь контейнер с базой данных. Хочешь Spark: пара команд и у тебя есть Spark. Хочешь, чтобы все это работало в продакшне так, как работает на твоем ноутбуке: легко, главное выполни на сервере ту же самую пару команд.
Для закрепления: берем любую свою программу (бонус очки: берем ML задачу из пункта про Pipeline) и делаем так, чтобы она запускалась в контейнере. Еще лучше если у вас два контейнера и один обращается к другому. Например в одном контейнере PostgreSQL с парой табличек, а в другом код, который делает запросы к базе данных.
## Память в Python
Читаем как Python работает с памятью, чтобы никогда больше не потеть на вопросе про GIL. По части DS позволяет лучше утилизировать железо, не делать глупостей вроде лишних копирований гигантских массивов и лучше интуитивно понимать работу кода.
Статья раз
Статья два
## HTTP
HTTP это то, на чем держится веб: когда вы открываете сайты, скачиваете датасеты, пользуетесь API. Инференс и деплой ML моделей почти всегда связан с HTTP.
Изучаем теорию:
Статья попроще
Статья подлиннее
Проходим туториал: Python’s Requests Library Guide
## Sklearn Pipelines
Sklearn Pipelines User Guide
С одной стороны без Sklearn в ML практически никуда и Pipeline это большая его киллер-фича, которая экономит уйму времени, позволяет избежать ошибок и упрощает перенос кода в продакшн. Но более важно то, что парадигма пайплайнов, то есть обработки данных через серию последовательных шагов, повсеместно встречается в ML экосистеме. Пайплайны в Sklearn это отличное введение. Познакомившись с ними будет гораздо проще осваивать популярные ML инструменты.
Для закрепления: берем ML задачу, которую решали (хоть Титаник на Kaggle) и переписываем с использованием Pipeline.
## SQL
https://sqlbolt.com/ - Проходим туториал вплоть до 12 урока.
Без SQL никуда. Чаще всего данные для моделей появляются когда мы заклинаем базы данных языком SQL.
Нас интересует все, касается запросов к существующим таблицам. Для минимального пути можно опустить все что касается вставок и создания таблиц.
Если вы хотите стать настоящим самураем SQL и быть круче большинства аналитиков, то надо взобраться на эту гору: www.sql-ex.ru
## Docker
Официальный туториал по Docker
Docker становится таким же необходимым, как Git. Позволяет паковать любой код в контейнеры, которые ведут себя как виртуальные машины, но делают это быстро. На практике это означает, что можно очень быстро разворачивать и сворачивать целые экосистемы прямо на своем ноуте. Хочешь базу данных: пара консольных команд и получаешь контейнер с базой данных. Хочешь Spark: пара команд и у тебя есть Spark. Хочешь, чтобы все это работало в продакшне так, как работает на твоем ноутбуке: легко, главное выполни на сервере ту же самую пару команд.
Для закрепления: берем любую свою программу (бонус очки: берем ML задачу из пункта про Pipeline) и делаем так, чтобы она запускалась в контейнере. Еще лучше если у вас два контейнера и один обращается к другому. Например в одном контейнере PostgreSQL с парой табличек, а в другом код, который делает запросы к базе данных.
Forwarded from Борис опять
С этими знаниями уже можно собрать рабочую схему деплоя табличной ML модели.
0. Поднимаем контейнер с базой данных.
1. На размеченных данных из бд обучаем Sklearn Pipeline, сохраняем с помощью pickle. Можно записать ее в БД, загрузить на облачное хранилище или просто сохранить на диск.
2. В контейнере для инференса периодически запускаем batch job: загрузили модель, достали из БД неразмеченные данные, сделали для них инференс, сохранили предсказания в БД.
3. Если batch job не подходит, то в контейнере для инференса запускаем API (flask, apiflask или fastapi). Принимает на вход POST запрос с json фичами примера, загружает модель, делает предикт, сохраняет пример и предсказание в БД (для дальнейшей доразметки и дообучения), возвращает предикт в виде JSON. Про API в данном гайде нет, но тоже очень полезно знать. Изучается за вечер, достаточно пройти один туториал.
0. Поднимаем контейнер с базой данных.
1. На размеченных данных из бд обучаем Sklearn Pipeline, сохраняем с помощью pickle. Можно записать ее в БД, загрузить на облачное хранилище или просто сохранить на диск.
2. В контейнере для инференса периодически запускаем batch job: загрузили модель, достали из БД неразмеченные данные, сделали для них инференс, сохранили предсказания в БД.
3. Если batch job не подходит, то в контейнере для инференса запускаем API (flask, apiflask или fastapi). Принимает на вход POST запрос с json фичами примера, загружает модель, делает предикт, сохраняет пример и предсказание в БД (для дальнейшей доразметки и дообучения), возвращает предикт в виде JSON. Про API в данном гайде нет, но тоже очень полезно знать. Изучается за вечер, достаточно пройти один туториал.
Forwarded from Борис опять
# Минимальные знания Software Engineering для Data Scientist 3/3
## Map Reduce
Туториал
Чтение
Общая парадигма того, как быстро обрабатывать данные, которые не влезают в оперативную память или даже диск сервера. Не вся Биг Дата это Map Reduce. Но позволит понять основные идеи.
## Распределенные вычисления
Выбрать одно: Spark Quickstart, Dask Quickstart
Apache Spark, Dask и аналоги это инструменты, которые реализуют Map Reduce и другие парадигмы. Они делают чтобы было быстро несмотря на то, что очень много. Очень часто встречаются в требованиях на вакансии DS, MLE и не только. Apache Spark более популярный, Dask - проще и приятнее. Для ознакомления выбирайте любой.
Для закрепления: переписываем из пункта Sklearn Pipelines так, чтобы feature engineering выполнялся с помощью Spark или Dask.
## MLOps - MLFlow
Однажды люди поняли, что при создании ML проектов можно не просто творить как получится, а использовать накопленные человечеством 40+ лет знаний о разработке софта. И придумали MLOps. Это о том, как менеджерить данные, модели, эксперименты и код экспериментов. Главные компоненты MLOps: структурирование проектов, трекинг экспериментов, версионирование данных и моделей, деплой моделей. Деплой моделей мы опустим, чтобы сэкономить в голове место, потому что для минимума он не критичен. Проще всего не осваивать все по-отдельности, а разобраться в самой популярной платформе, которая их объединяет: MLFlow.
Читаем для познания основных идей:
- Версионирование данных и моделей
- Трекинг экспериментов (сразу с MLFlow примером)
Проходим туториал по MLFlow
Для закрепления: добавляем MLFlow в свой ML проект.
- Метрики эксперимента должны отправляться при обучении в MLFlow.
- После обучения модель должна сохраняться в MLFlow Model Registry.
## Map Reduce
Туториал
Чтение
Общая парадигма того, как быстро обрабатывать данные, которые не влезают в оперативную память или даже диск сервера. Не вся Биг Дата это Map Reduce. Но позволит понять основные идеи.
## Распределенные вычисления
Выбрать одно: Spark Quickstart, Dask Quickstart
Apache Spark, Dask и аналоги это инструменты, которые реализуют Map Reduce и другие парадигмы. Они делают чтобы было быстро несмотря на то, что очень много. Очень часто встречаются в требованиях на вакансии DS, MLE и не только. Apache Spark более популярный, Dask - проще и приятнее. Для ознакомления выбирайте любой.
Для закрепления: переписываем из пункта Sklearn Pipelines так, чтобы feature engineering выполнялся с помощью Spark или Dask.
## MLOps - MLFlow
Однажды люди поняли, что при создании ML проектов можно не просто творить как получится, а использовать накопленные человечеством 40+ лет знаний о разработке софта. И придумали MLOps. Это о том, как менеджерить данные, модели, эксперименты и код экспериментов. Главные компоненты MLOps: структурирование проектов, трекинг экспериментов, версионирование данных и моделей, деплой моделей. Деплой моделей мы опустим, чтобы сэкономить в голове место, потому что для минимума он не критичен. Проще всего не осваивать все по-отдельности, а разобраться в самой популярной платформе, которая их объединяет: MLFlow.
Читаем для познания основных идей:
- Версионирование данных и моделей
- Трекинг экспериментов (сразу с MLFlow примером)
Проходим туториал по MLFlow
Для закрепления: добавляем MLFlow в свой ML проект.
- Метрики эксперимента должны отправляться при обучении в MLFlow.
- После обучения модель должна сохраняться в MLFlow Model Registry.
Forwarded from Базы данных & SQL
Хабр
Не все типы репликации одинаково полезны, или почему две MySQL лучше одной
В это сложно поверить, но MySQL как продукт появился еще в 1995 году. Со временем название СУБД стало таким же нарицательным, как Xerox. Сегодня под этим термином могут понимать самые разные связки:...
Forwarded from Дмитрий phd anetto
В тему последней рекламы платных курсов по питону. Перед тем, как брать курсы, посмотрите на тонны бесплатного материала. Сможете понять, надо ли вам оно
Если нужно, я подобрал годные бесплатные материалы (курсы, книги, лекции) по питону, SQL, git, тестам, докеру и другим нужным начинающему разработчику темам
Если нужно, я подобрал годные бесплатные материалы (курсы, книги, лекции) по питону, SQL, git, тестам, докеру и другим нужным начинающему разработчику темам
Пикабу
Ответ trdm в «Яндекс и "Цифровые профессии"»
Автор: anetto1502
#python #career
Тут в свободный доступ выложили книгу «Software engineering at Google» издательства O’Reilly
https://abseil.io/resources/swe-book/html/toc.html
Тут в свободный доступ выложили книгу «Software engineering at Google» издательства O’Reilly
https://abseil.io/resources/swe-book/html/toc.html
Forwarded from Quant Valerian
Как считать волу?
Давеча мне, внезапно, понадобилось посчитать по работе волатильность в паре, для которой мои товарищи мне волу дать не могли (рынка нет). Я закатал рукава и... пошел искать в своем канале, как там эстимировать волу эту вашу. И не нашел ответа, только вопрос в зал. Короче, пришлось заново вспоминать, перепроверять на монте-карлах и вообще тратить время. Документируем-с.
Итак, чуть больше деталей задачи. Хочется очень примерно, но очень быстро прикинуть АТМ волатильность на короткий срок (меньше месяца). Делаем сильное предположение о нормальности распределения данных. Есть несколько способов (но на самом деле они все одинаковые), щас мы с вами их разберем в деталях и поймем, когда чем пользоваться.
В интернетике есть такой rule of thumb: (max - min) / 4, чуть реже можно встретить (max - min) / 6. Смысл здесь вот какой. Предполагается, что мы смотрим на small sample, т.е. данных мало. С вероятностью 95% все эти данные лежат в интервале двух сигм, с вероятностью 99% — в интервале трёх сигм. Тогда (max - min) / 2 = 2*sigma для 95%% или (max - min) / 2 = 3*sigma для 99%%.
Уточним, что у нас все-таки случайный процесс, поэтому наш разброс не просто sigma, а sigma*sqrt(t). Чтобы получить именно сигму, нужно делить на корень из времени.
Можно посмотреть по картинке (стартуем из 100, с sigma=5%, t=5 дней, 15 реализаций). Видим max=125, min=75. (125 - 75) / 4 = 12,5 (sigma=5,6%); (125 - 75) / 6 = 8,3 (sigma=3,7%); avg(12,5; 8,3) = 10,4 (sigma=4,65%). То есть истина где-то посередине на такой выборке.
Что мы имеем в жизни? У нас не то, что small sample, у нас вообще всего одна реализация, одна единственная траектория. Вспомним, что с вероятностью 68% мы в одной сигме с этой своей одной траекторией. И на самом деле, если использовать sigma = (max - min) / 2, то получается даже точнее.
Не лишним будет отметить, что по выходным торгов нет, поэтому оценивая волатильность за неделю, нужно брать t=5, а за месяц — t=22. При этом волатильность котируется в процентах годовых (причем в календарных днях), поэтому сигму нужно умножить на sqrt(365) и поделить на спот, чтобы получить котировку.
Итого. Чтобы посчитать АТМ 1W:
1. смотрим, какой примерно был разброс за неделю
2. делим этот разброс на средний за неделю или на текущий спот (не суть на самом деле)
3. делим пополам
4. делим на sqrt(5)~2.2
5. умножаем на sqrt(365)~19
Формулы для кручения в мозгу:
(max - min) / (max + min) * 19 / 2.2
(max - min) / (2 * spot) * 19 / 2.2
Давеча мне, внезапно, понадобилось посчитать по работе волатильность в паре, для которой мои товарищи мне волу дать не могли (рынка нет). Я закатал рукава и... пошел искать в своем канале, как там эстимировать волу эту вашу. И не нашел ответа, только вопрос в зал. Короче, пришлось заново вспоминать, перепроверять на монте-карлах и вообще тратить время. Документируем-с.
Итак, чуть больше деталей задачи. Хочется очень примерно, но очень быстро прикинуть АТМ волатильность на короткий срок (меньше месяца). Делаем сильное предположение о нормальности распределения данных. Есть несколько способов (но на самом деле они все одинаковые), щас мы с вами их разберем в деталях и поймем, когда чем пользоваться.
В интернетике есть такой rule of thumb: (max - min) / 4, чуть реже можно встретить (max - min) / 6. Смысл здесь вот какой. Предполагается, что мы смотрим на small sample, т.е. данных мало. С вероятностью 95% все эти данные лежат в интервале двух сигм, с вероятностью 99% — в интервале трёх сигм. Тогда (max - min) / 2 = 2*sigma для 95%% или (max - min) / 2 = 3*sigma для 99%%.
Уточним, что у нас все-таки случайный процесс, поэтому наш разброс не просто sigma, а sigma*sqrt(t). Чтобы получить именно сигму, нужно делить на корень из времени.
Можно посмотреть по картинке (стартуем из 100, с sigma=5%, t=5 дней, 15 реализаций). Видим max=125, min=75. (125 - 75) / 4 = 12,5 (sigma=5,6%); (125 - 75) / 6 = 8,3 (sigma=3,7%); avg(12,5; 8,3) = 10,4 (sigma=4,65%). То есть истина где-то посередине на такой выборке.
Что мы имеем в жизни? У нас не то, что small sample, у нас вообще всего одна реализация, одна единственная траектория. Вспомним, что с вероятностью 68% мы в одной сигме с этой своей одной траекторией. И на самом деле, если использовать sigma = (max - min) / 2, то получается даже точнее.
Не лишним будет отметить, что по выходным торгов нет, поэтому оценивая волатильность за неделю, нужно брать t=5, а за месяц — t=22. При этом волатильность котируется в процентах годовых (причем в календарных днях), поэтому сигму нужно умножить на sqrt(365) и поделить на спот, чтобы получить котировку.
Итого. Чтобы посчитать АТМ 1W:
1. смотрим, какой примерно был разброс за неделю
2. делим этот разброс на средний за неделю или на текущий спот (не суть на самом деле)
3. делим пополам
4. делим на sqrt(5)~2.2
5. умножаем на sqrt(365)~19
Формулы для кручения в мозгу:
(max - min) / (max + min) * 19 / 2.2
(max - min) / (2 * spot) * 19 / 2.2
Forwarded from DziS Science | Data Science
В процессе реализации решений на Leetcode понял, что совсем не помню алгоритмы прохода по бинарному дереву 🌳.
Предлагаю вспомнить варианты поиска в глубину (Depth-first search).
Классических вариантов 3:
1. DFS Preorder. Классический проход в глубину, где сначала проходится корень дерева, далее спускается по каждой ветке слева направо вглубь до самого глубокого листа.
2. DFS Inorder. Обратный проход. Начинается с левого листа, далее в вершину, потом обратно на уровень ниже в правый лист.
3. DFS Posorder. Обратный проход. Начинается с левого листа нижнего, проходя по всем одноуровневым листам слева направо, только потом поднимаемся на уровень выше.
Для тех кто ничего не понял, приведены картинки и справа для сравнения поиск в ширину (BFS).
Предлагаю рассмотреть красивые рекурсивные реализации данных методов для примера с картинки.
Предлагаю вспомнить варианты поиска в глубину (Depth-first search).
Классических вариантов 3:
1. DFS Preorder. Классический проход в глубину, где сначала проходится корень дерева, далее спускается по каждой ветке слева направо вглубь до самого глубокого листа.
2. DFS Inorder. Обратный проход. Начинается с левого листа, далее в вершину, потом обратно на уровень ниже в правый лист.
3. DFS Posorder. Обратный проход. Начинается с левого листа нижнего, проходя по всем одноуровневым листам слева направо, только потом поднимаемся на уровень выше.
Для тех кто ничего не понял, приведены картинки и справа для сравнения поиск в ширину (BFS).
Предлагаю рассмотреть красивые рекурсивные реализации данных методов для примера с картинки.
class Node:В целом, полезно знать при работе с графами. Могут спросить на душных технических собесах, к которым я и готовлюсь🤓💼
def __init__(self, key):
self.left = None
self.right = None
self.val = key
def preorder(root):
return [root.val] + preorder(root.left) + preorder(root.right) if root else []
def inorder(root):
return inorder(root.left) + [root.val] + inorder(root.right) if root else []
def postorder(root):
return postorder(root.left) + postorder(root.right) + [root.val] if root else []
# Пример
if __name__ == "__main__":
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
# Вызов функций
print(f"DFS preorder {preorder(root)}")
print(f"DFS inorder {inorder(root)}")
print(f"DFS postorder {postorder(root)}")