Библиотека программиста | программирование, кодинг, разработка
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
Поговорим о том, что такое CUDA, как эта технология связана с NVIDIA и как ускоряет обработку данных вычислительной техникой.

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

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

https://proglib.io/p/cuda/

#fundamental
Курс "Алгоритмы и структуры данных"

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) — поведенческий паттерн, определяющий основу алгоритма и позволяющий подклассам переопределять некоторые шаги алгоритма, не меняя его общей структуры.

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

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

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