Программер
51 subscribers
107 photos
86 links
Канал о программировании, с интересной иформацией.
Download Telegram
#algorithm

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

Есть две большие таблицы чисел - матрицы, нужно их перемножить. Обычный способ - пройти по каждой строке первой матрицы и умножить её на каждую колонку второй матрицы. Это занимает много времени.

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

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

Например
--> Научные расчёты. Учёные используют матричное умножение для моделирования сложных систем, погода, движение частиц.
--> Графика и анимация. В играх и фильмах нужны быстрые расчёты для отображения трёхмерных объектов.
--> Машинное обучение. Некоторые алгоритмы машинного обучения требуют умножения больших матриц для тренировки нейронных сетей.

Программер
#структуры_данных

Бинарные деревья поиска
BST — Binary Search Tree.
Бинарные деревья поиска - эффективный способ организации данных, обеспечивающий быстрый доступ и манипуляции с ними.

Узлы дерева. Каждый узел хранит одно значение и может иметь до двух дочерних узлов.
Для эффективной работы дерево должно быть сбалансировано - разница высот левого и правого поддерева должна быть минимальной.

Операции
--> Вставка - новый узел добавляется в соответствии с порядком значений.
--> Удаление - узел удаляется, сохраняя структуру дерева.
--> Поиск - быстрый поиск элемента по значению, используя порядок дерева.

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

Программер
#структуры_данных

Двоичная куча
Двоичная куча — это специальная структура данных, организованная в виде бинарного дерева, где каждый родительский узел либо больше (максимальная куча), либо меньше (минимальная куча) своих дочерних узлов. Она поддерживает эффективные операции вставки, удаления и получения максимального/минимального элемента.
#структуры_данных

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

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

Применение
--> Автокомплит и автодополнение
--> Тезаурусы и словари
--> Анализ текстов
--> Биоинформатика

Примеры
--> Google Suggest. Предложение возможных поисков на основе частичного ввода запроса.
--> Интеллектуальное автодополнение в IDE. Подсказки по коду на основе введённых символов.
--> Проверка орфографии. Быстрый поиск слов в словаре для исправления ошибок.

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

Программер
#структуры_данных

Красно-чёрные деревья
Сбалансированные двоичные деревья поиска, обеспечивающие логарифмическое время для основных операций - вставка, удаление и поиск элементов.

Красно-чёрное дерево - дерево, с окрашенными в красный или черный цвет узлами.

Формируется по правилам
--> Корень всегда чёрного цвета.
--> Листья - чёрные.
--> Каждый красный узел имеет два чёрных дочерних узла.
--> Пути от корня до листьев содержат одинаковое количество чёрных узлов.

Применение
--> Быстрый поиск и сортировка данных.
--> Хэш-таблицы и ассоциативные массивы.
--> Графовые алгоритмы.
--> Операционные системы и базы данных.


Преимущества
--> Логарифмическая сложность операций (O(log n)).
--> Самобалансирующаяся структура, что уменьшает необходимость ручной балансировки.
--> Поддержание порядка элементов, что удобно для сортированных коллекций.

Примеры
--> Реализация множеств и словарей в стандартных библиотеках языков программирования C++, Java, Python.
--> Индексы в базах данных.
--> Организация файловой системы в некоторых ОС.

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

--> Идентификация лиц, анализ изображений, распознавание рукописного текста.
--> Прогнозирование и предсказание. Прогноз погоды, финансовые прогнозы, прогнозирование спроса.
--> Автоматическое преобразование текста из одного языка на другой.
--> Рекомендательные системы.
--> Робототехника и автономные системы. Управление беспилотниками, автомобилями, промышленными роботами.
--> Диагностика заболеваний, анализ медицинских изображений, разработка новых лекарств.
--> Голосовые помощники. Распознавание и синтез речи, виртуальные ассистенты.
--> Финансовый сектор.Оценка рисков, обнаружение мошенничества, управление инвестициями.
--> Разработка игровых персонажей с искусственным интеллектом, создание реалистичной графики.
--> Таргетинг рекламы, персонализация контента, анализ поведения пользователей.

Программер
Реактивное программирование.
Подход, подразумевает реакцию программы на изменения данных в реальном времени. Это помогает лучше справляться с асинхронными задачами и улучшает производительность.

Асинхронные задачи - разные части программы работают независимо друг от друга. Что позволяет программе выполнять несколько задач одновременно, увеличивая скорость и отзывчивость.

Принципы работы реактивного программирования

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

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

Семафор - примитив, контролирующий доступ к ресурсам. Имеет счетчик, указывающий, сколько потоков одновременно могут использовать ресурс. Когда счетчик достигает нуля, последующие потоки блокируются до освобождения ресурса. Ждут очереди.
Применение
--> Контроль доступа к многопользовательским системам.
--> Синхронизации сложных/многопоточных приложений.

Мьютекс - примитив, гарантирующий доступ к ресурсу только одному потоку. Другие потоки ожидают, когда мьютекс освободится.
Применение
--> Защита критических участков кода.
--> Предупреждение взаимоблокировки, когда потоки ждут друг друга, создавая тупик.

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

Программер
Примитивы синхронизации. Продолжение.

Condition variables
Условия ожидания - примитивы синхронизации, позволяют блокироваться/засыпать потокам до наступления одного условия и пробуждаться/разблокироваться, когда выполнено другое условие. Используются для координации работы потоков, ожидающих изменений в общем состоянии ресурсов.

Active objects
Активные объекты. Модель программирования, где объект имеет собственный поток исполнения. Используются для изоляции логики объекта от вызовающих потоков. Это упрощает написание многопоточного кода. Часто применяются в системах реального времени и высоконагруженных приложениях, где важна низкая задержка и высокая производительность.

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

Читатели-писатели. Readers-Writers Locks.
Разрешает потокам читать общий ресурс одновременно, но допускает запись только одним потоком за раз. При записи остальные потоки блокируются.

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

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

Принципы
--> Инкапсуляция. Скрытие внутренней реализации класса и предоставление доступа только к необходимым методам.
--> Наследование. Возможность создания нового класса на основе существующего с добавлением или изменением функциональности.
--> Полиморфизм. Способность объектов разных классов реагировать на одни и те же сообщения по-разному.
--> Абстракция. Определение важных характеристик объекта, скрывая детали реализации.

Программер
Классы в ООП.

Класс - шаблон для создания объектов. Определяет данные - свойства, и методы - функции, доступные созданным на его основе объектам.

Виды классов
--> Базовый класс или родительский класс - предоставляет общие свойства и методы для наследуемых классов.
--> Производный класс - наследует свойства и методы базового класса. Может добавлять свои.
--> Абстрактный класс - содержит абстрактные методы, которые должны быть реализованы в производных классах.
--> Интерфейс - описывает контракт методов, которые класс обязан реализовать.
--> Конкретный класс - полностью реализованный класс, готовый для создания объектов.

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

Используется в Веб-приложениях, для улучшения производительности и расширения возможностей.
В играх, для запуска игр и медиа в браузере. Для визуализации расчетов и данных в браузере.

Преимущества WASM
--> Поизводительность.
--> Безопасность.
--> Портативность.
--> Многоязычность.

WebAssembly открывает новые горизонты для веб-разработки, позволяя запускать высокопроизводительный код непосредственно в браузерах.

Программер
Svelte - фреймворк для создания веб-приложений.

Позволяет с высокой скоростью разрабатывать интерактивные веб-интерфейсы.
Подходит для быстроработающих SPA. Single Page Application.


--> Svelte компилирует компоненты в чистый HTML, CSS и JavaScript, уменьшая размер итогового кода.
--> Благодаря отсутствию необходимости в DOM, Svelte работает быстрее и потребляет меньше ресурсов.
--> Интуитивно понятен и удобен для начинающих разработчиков.
--> Компактный код ускоряет загрузку страниц.

Идеально подходит для создания быстрых и легких веб-приложений с минимальным размером бандла. Оптимизирован для производительности и простоты использования. Это отличный вариант для проектов любого масштаба.

Программер
Nest.js. Фреймворк для создания серверных приложений на языке TypeScript.
Построен поверх Node.js и Express. Добавляет уровень архитектуры и удобные инструменты для разработки масштабируемых и поддерживаемых приложений.

С его помощью создают
--> REST API. Отлично подходит для разработки серверных API, обеспечивающих взаимодействие между фронтендом и бэкендом.
--> Микросервисная архитектура. Помогает создавать и управлять микросервисами, что полезно для крупных и сложных систем.
--> Идеален для создания надежных и масштабируемых корпоративных приложений.

Преимущества
--> Nest.js предлагает чёткую архитектуру, что упрощает поддержку и расширение проекта.
--> Поддержка TypeScript обеспечивает типизацию и улучшает качество кода.
--> Легко интегрируется с другими библиотеками и фреймворками.

Программер
Create-React-App
Упрощает настройку окружения для разработки React-приложений. Избавляет т настройки Webpack, Babel и других инструментов. Налицо экономия времени и снижение порога входа для начинающих разработчиков.
Create-React-App
--> Позволяет мгновенно создать новое React-приложение с минимальными усилиями.
--> Устраняет необходимость вручную настраивать Webpack, Babel и другие инструменты сборки.
--> Обеспечивает актуальную версию зависимостей и инструментов, необходимых для работы с React.
--> Созданные проекты легко переносятся между разработчиками и могут быть развернуты на различных платформах.

Программер
Webpack

--> Объединяет все модули JavaScript, CSS и другие ресурсы вашего проекта в один или несколько файлов, что облегчает их загрузку браузером.
--> Может минимизировать код, удалять неиспользуемые части tree-shaking, оптимизировать изображения.
--> Webpack поддерживает ES6+ синтаксис, а также новые возможности JavaScript и CSS.

Представь, у тебя есть много разбросанных игрушек. Нужно потратить много времени и сил, чтобы собрать их в одну коробку. Webpack - помощник, который собирает игрушки (файлы JavaScript, CSS, картинки и т.д.) в одну большую коробку, где тебе легче их взять и поиграть.

Программер
Babel - инструмент транспиляции JavaScript
Трансляция кода.
Babel преобразует современный JavaScript-код ES6+ в более старый синтаксис поддерживаемый большинством браузеров.

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

То же самое происходит с кодом. Современные браузеры иногда не понимают новый код. Babel берёт новый код и превращает в старый, понятный всем браузерам. И тогда самые современные программы будут везде работать!

Программер
Create-react-app

Установка инструмента
npm install -g create-react-app

Создание нового проекта
npx create-react-app my-app

Переход в папку проекта
cd my-app

Запустить сервер разработки
npm start
Откройте браузер по адресу http://localhost:3000, чтобы увидеть ваше приложение.

Программер
#javascript

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

Создадим объект.
Назовем его primitiveObject.
let = primitiveObject{ id: 1, // ключ id, значение 1
name: "Ivan", // ключ name значение Ivan
age: 30 // ключ age, значене 30
};

Чтобы получить значение объекта, делаем запись через точку.
console.log(primitiveObject.id); // получаем значение ключа id - 1
console.log(primitiveObject.name); // получаем значение ключа name - Ivan
console.log(primitiveObject.age); // получаем значение ключа age - 30

Для перебора свойств объекта удобно использовать цикл for . . in

Программер
#javascript

Чтобы создать множество похожих объектов, а не один, мы используем функцию конструктор.
Функция начинается с большой буквы, и выполняется благодаря оператору new.

Создадим простую функцию-конструктор

function Instrument(name) {
this.name = name;
this.prise = prise;
}

присвоим переменной значение "внутренности" функции.
let mallet = new Instrument("molotok", 20);

console.log(mallet.name); // molotok
console.log(mallet.prise); // 20

Хотим создать другой инструмент, с набором заданных характеристик?
Пожалуйста!
let saw = new Instrument("saw", 40);
let pliers = new Instrument("pliers", 30);
let wrench = new Instrument("wrench", 15);

Программер