Библиотека программиста | программирование, кодинг, разработка
82.2K subscribers
3.11K photos
146 videos
88 files
6.34K links
Все самое полезное для программиста в одном канале.

Список наших каналов: https://t.me/proglibrary/9197
Учиться у нас: https://proglib.io/w/a32a0d94

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv
Прайс: @proglib_advertising
Download Telegram
Курс "Алгоритмы и структуры данных"

1. О курсе
2. Базовые структуры данных
3. Очереди с приоритетом
4. Системы непересекающихся множеств
5. Хеш-таблицы
6. АВЛ-деревья
7. Дополнительные операции
8. Сплей-деревья

https://www.youtube.com/watch?v=jD_A74xER9E&list=PLwwk4BHih4fhz7NtsPUbk7B3JXh_CPt3m

#algorithms #fundamental
Видеокурс. Введение в алгоритмы

1. Пример простого алгоритма
2. Знакомство с алгоритмами
3. Разделяй и влавствуй
4. Сложность алгоритмов и Big O
5. Графы
6. Структуры данных
7. Деревья и двоичные деревья
8. Машина Тьюринга
9. P и NP

Ссылка на плейлист: https://www.youtube.com/watch?v=8JlTwMg1dyw&list=PLwwk4BHih4fjIT5cT4i1s93b99aJScUGB

#fundamental
Один из лучших курсов по алгоритмам и структурам данных

1. О курсе
2. Базовые структуры данных
3. Очереди с приоритетом
4. Системы непересекающихся множеств
5. Хеш-таблицы
6. АВЛ-деревья
7. Дополнительные операции
8. Сплей-деревья

Ссылка на плейлист: https://bit.ly/2w8jJn9

#algorithms #fundamental
​​Редакция «Библиотеки программиста» совместно с командой Алексея Никитина, доцента ВМК МГУ рассмотрела в наглядных иллюстрациях один из важных разделов курса мат. анализа, дифференцируемость.

#math #fundamental

https://proglib.io/p/diff/
#notes #fundamental

Массивы против связных списков

Языки программирования с широким набором средств обычно включают встроенные реализации абстрактных типов данных (список, очередь, стек и другие), которые зачастую основаны на некоторой стандартной структуре данных. Более того, отдельные из них могут даже автоматически переключаться с одной структуры данных на другую во время выполнения программ, в зависимости от способа доступа к данным.

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

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

Массивы предпочтительнее связных списков, когда:
– необходим произвольный доступ к данным и очень быстрый доступ к элементам;
– число элементов не изменяется во время выполнения программы, благодаря чему легко выделить непрерывное пространство памяти.
#fundamental #patterns #cheatsheet

📌 Наблюдатель (англ. Observer) — поведенческий паттерн, создающий механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.

Можно привести аналогию из жизни: Вы оформили подписку на журнал, после чего вам больше не нужно ездить в супермаркет и проверять, не вышел ли очередной номер. Вместо этого издательство регулярно присылает новые номера по почте прямо к вам домой сразу после их выхода.
Издательство ведёт список подписчиков и знает, кому какой журнал высылать. Вы можете в любой момент отказаться от подписки, и журнал перестанет вам приходить.

Паттерн Наблюдатель применяется, когда система обладает следующими свойствами:
✔️Существует как минимум один объект, рассылающий сообщения.
✔️Имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения.
✔️Позволяет избежать сильного зацепления взаимодействующих классов.
#fundamental #patterns #cheatsheet

📌 Состояние (англ. State) — поведенческий паттерн, позволяющий объектам менять поведение в зависимости от своего состояния.

Идея: программа может находиться в одном из нескольких состояний, сменяющих друг друга. Количество состояний и переходов между ними конечно. Находясь в разных состояниях, программа может по-разному реагировать на одни и те же события, которые происходят с ней.

Проблема: машину состояний чаще всего реализуют с помощью условных операторов (if/switch), проверяющих текущее состояние объекта. Набор возможных состояний бывает трудно предопределить заранее, поэтому они добавляются в процессе развития программы, что впоследствии может вызвать проблемы.

Решение: создать отдельные классы для каждого состояния, в котором может пребывать объект, а затем вынести туда поведения, соответствующие этим состояниям.

Паттерн применяется, когда:
✔️Есть объект, поведение которого кардинально меняется.
✔️Код класса содержит множество похожих условных операторов.
#fundamental #patterns #cheatsheet

📌 Стратегия (англ. Strategy) — поведенческий паттерн, опредяющий семейство схожих алгоритмов и помещающий каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять во время исполнения программы.

Идея: использовать различные бизнес-правила или алгоритмы исходя из контекста.

Проблема: по типу клиента (или по типу обрабатываемых данных) выбрать подходящий алгоритм, который следует применить.

Решение: определить семейство схожих и часто изменяющихся/расширяющихся алгоритмов, и вынести их в собственные классы-стратегии.

Паттерн Состояние можно рассматривать как надстройку над Стратегией, но в Стратегии объекты не знают друг о друге и никак не связаны, а в Состоянии сами состояния могут переключать контекст.

Паттерн применяется, когда:
✔️Необходимо использовать разные вариации какого-то алгоритма внутри одного объекта.
✔️Есть множество похожих классов, отличающихся только некоторым поведением.
✔️Не хотитите обнажать детали алгоритмов для других классов.
#fundamental #patterns #cheatsheet

📌 Шаблонный метод (англ. Template Method) — поведенческий паттерн, определяющий основу алгоритма и позволяющий подклассам переопределять некоторые шаги алгоритма, не меняя его общей структуры.

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

Решение: разбить алгоритм на последовательность шагов, описать эти шаги в отдельных методах и вызывать их в одном шаблонном методе друг за другом, что позволит подклассам переопределять некоторые шаги алгоритма, оставляя без изменений его структуру.

Паттерн применяется, когда:
✔️Подклассы должны расширять базовый алгоритм, не меняя его структуры.
✔️Есть несколько классов, реализующих одно и то же с незначительными отличиями.
#fundamental #patterns #cheatsheet

📌 Посетитель (англ. visitor) — поведенческий паттерн, позволяющий добавлять в функционал новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.

Проблема: над каждым объектом некоторой структуры выполняется одна или более операций, но вам требуется определить новую операцию, не изменяя классы объектов.

Решение: разместить новое поведение в отдельном классе, вместо его размножения сразу в нескольких классах. Объекты, с которыми должно было быть связано поведение, не будут выполнять его самостоятельно. Вместо этого вы будете передавать эти объекты в методы посетителя.

Паттерн применяется, когда:
✔️Требуется выполнить какую-то операцию над всеми элементами структуры объектов, например, деревом.
✔️Над объектами сложной структуры объектов необходимо выполнять некоторые не связанные между собой операции, но вы не хотите «засорять» классы такими операциями.
✔️Новое поведение имеет смысл только для некоторых классов из существующей иерархии.
#fundamental #patterns #cheatsheet

📌 Посредник (англ. Mediator) — поведенческий паттерн, позволяющий свести к минимуму связанность множества классов между собой посредством перемещения этих связей в один класс-посредник.

Проблема: необходимо обеспечить взаимодействие множества объектов, сформировав при этом слабую связанность и избавив объекты от необходимости явно ссылаться друг на друга.

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

Паттерн применяется, когда:
✔️Сложно менять некоторые классы из-за того, что они имеют множество хаотичных связей с другими классами.
✔️Нет возможности повторно использовать класс, поскольку он зависит от большого количества других классов.
✔️Приходится создавать множество подклассов компонентов, чтобы использовать одни и те же компоненты в разных контекстах.