METANIT.COM – Telegram
METANIT.COM
5.76K subscribers
1.64K photos
80 videos
9 files
973 links
Канал о программировании и разработке сайта metanit.com
Download Telegram
Replication, Partitioning и Sharding
(продолжение предыдущего поста)

1. Replication (репликация)

- Суть: копирование данных на множество серверов. Каждый сервер хранит полную копию датасета.
- Ключевые особенности:
- обеспечивает работу системы при сбоях (если один сервер выходит из строя, другие продолжают работать);
- масштабирует трафик чтения (но не записи);
- использует модели «ведущий–ведомый» (leader–follower) или «множество ведущих» (multi–leader);
- оптимальна для нагрузок с преобладанием операций чтения (read–heavy workloads).
- Пример использования: создание дополнительных slave–серверов для снятия нагрузки с основного сервера, выполнение ресурсоёмких задач (например, аналитических отчётов) на отдельных серверах без влияния на работу других пользователей.

2. Partitioning (партиционирование)

- Суть: разделение большой таблицы на более мелкие части (партиции) внутри одного сервера базы данных. Каждая партиция хранит подмножество строк.
- Ключевые особенности:
- ускоряет запросы к большим таблицам за счёт распределения нагрузки;
- упрощает обслуживание и очистку данных (cleanup and maintenance);
- не требует добавления новых машин — работает в рамках одного сервера;
- разбивает данные по выбранным администратором критериям (например, по дате публикации на новостных сайтах).
- Пример использования: секционирование таблиц с большим объёмом данных для ускорения обработки запросов.

3. Sharding (шардирование)

- Суть: распределение данных по разным физическим машинам (шардам) на основе ключа шардинга. Связанные данные группируются и хранятся на одном сервере.
- Ключевые особенности:
- позволяет горизонтально масштабировать систему (horizontal scaling);
- масштабирует как трафик чтения, так и записи;
- требует логики маршрутизации, «осведомлённой» о шардах (shard–aware routing logic);
- используется, когда одна база данных не справляется с нагрузкой;
- ключ шардинга (например, ID пользователя) определяет, на каком сервере будут храниться данные.
- Пример использования: в социальных сетях все данные пользователя (по ключу — ID пользователя) хранятся и обрабатываются на одном сервере, что упрощает обработку и ускоряет запросы.

### Краткое резюме:
- Replication — про отказоустойчивость и масштабирование чтения через копирование полных копий данных.
- Partitioning — про ускорение работы с большими таблицами путём разделения данных внутри одного сервера.
- Sharding — про распределение данных по разным серверам для масштабирования как чтения, так и записи, подходит для крупномасштабных систем.
3👍3🤝3
Вышла новая версия популярного отладчика - GDB 17.
GDB поддерживает отладку на уровне исходников широкого спектра языков (Ada, C, C++, D, Fortran, Go, Objective-C, Modula-2, Pascal, Rust и т.д.) на различных аппаратных (i386, amd64, ARM, RISC-V, LoongArch и т.д.) и программных платформах (GNU/Linux, *BSD, Unix, Windows, macOS).

Основные изменения направлены на повышение безопасности, удобства отладки и интеграции с современными технологиями. Ключевые нововведения в GDB 17:

1. Поддержка теневого стека (CET Shadow Stack) для x86-64. Это позволяет отлаживать программы, использующие аппаратную защиту от переполнения буфера в стеке, появившуюся в ядре Linux 6.6. Теневой стек сохраняет адреса возврата функций отдельно от основного стека, что затрудняет эксплуатацию эксплоитов.

2. Отладка программ с Guarded Control Stacks (GCS) на AArch64. GCS предоставляет аппаратную защиту адресов возврата из функций, блокируя эксплоиты, использующие методы возвратно-ориентированного программирования (ROP).

3. Полная поддержка записи выполнения программы для RISC-V RV64GC. Это позволяет воспроизводить участки кода в обратном направлении для отладки.

4. Улучшения в команде `info threads`. Добавлены опции -stopped и -running для отображения только остановленных или выполняемых потоков.

5. Расширения в команде `info sharedlibrary`. На платформах Linux и FreeBSD теперь показываются адреса для всего диапазона памяти, выделенного разделяемой библиотеке, а не только базовый адрес и адреса секции .text.

6. Поддержка снимков состояния (checkpoint) в Linux. Позволяет использовать снимки при одновременной отладке нескольких процессов.

7. Улучшения в Python API. Добавлены новые классы gdb.Color и gdb.ParameterPrefix, атрибут gdb.Value.is_unavailable, функция gdb.warning(). Прекращена поддержка Python версий ниже 3.4. 

8. Улучшения в протоколе DAP (Debugger Adapter Protocol). Реализована поддержка запросов completions и добавлена опция --binary-output для отключения преобразования символов перевода строки на Windows.

9. Новые переменные. Добавлены _colorsupport (список цветовых пространств, поддерживаемых терминалом), linker_namespace_count и _linker_namespace (список активных пространств имён компоновщика).

10. Опции для отключения подсистем. Добавлены --disable-gdb-compile, --disable-gdb-dwarf-support и --disable-gdb-mdebug-support для отключения определённых функций.

11. Прекращение поддержки UST в gdbserver. UST (static tracepoint) больше не поддерживается.

https://www.sourceware.org/gdb/
https://www.mail-archive.com/info-gnu@gnu.org/msg03477.html
7🔥4🥰3🤮1
В руководство по языку Java добавил главу про Взаимодействие с нативным кодом с помощью JNI и Foreign Functions и Memory API
https://metanit.com/java/tutorial/16.1.php
#java
🔥13👍5👏1
Реализация кэширования на бэкенде
(продолжение в следующем посте)
5👍2💯2
Реализация кэширования на бэкенде
(продолжение предыдущего поста)

Кэширование — это процесс хранения часто используемых данных в быстром слое хранения для снижения задержки и нагрузки на бэкенд.
→ Оно повышает производительность, масштабируемость и удобство использования систем бэкенда с высокой нагрузкой.

Почему кэширование важно
→ Сокращает количество повторяющихся запросов к базе данных.
→ Ускоряет время ответа API.
→ Снижает нагрузку на сервер и базу данных.
→ Повышает масштабируемость системы.

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

Популярные технологии кэширования
Redis → хранилище данных в оперативной памяти, поддерживает сохранение данных и сложные структуры данных.
Memcached → простое и высокоскоростное кэширование по принципу «ключ‑значение».
Кэши CDN → Cloudflare, CloudFront для статического контента.

Стратегии кэширования

Cache‑Aside (отложенная загрузка)
✓ Приложение сначала проверяет кэш.
✓ При отсутствии данных в кэше извлекает их из базы данных и сохраняет в кэш.

Write‑Through Cache (запись через кэш)
✓ Данные записываются в кэш и базу данных одновременно.
✓ Обеспечивает согласованность данных.

Write‑Behind (Write‑Back) Cache (отложенная запись)
✓ Записи сначала попадают в кэш.
✓ База данных обновляется асинхронно.

Read‑Through Cache (чтение через кэш)
✓ Кэш автоматически загружает данные из базы данных при отсутствии в кэше.

Что стоит кэшировать
→ Часто используемые данные.
→ Запросы с преобладанием операций чтения.
→ Конфигурационные данные.
→ Данные сессии.
→ Вычисленные или агрегированные результаты.

Стратегии аннулирования кэша
Временное устаревание (TTL) → данные автоматически удаляются по истечении заданного времени.
Аннулирование на основе событий → кэш очищается при наступлении определённого события.
Ручная очистка кэша → принудительное удаление данных из кэша.
Версионированные ключи кэша → использование ключей с версиями для управления актуальностью данных.

Типичные проблемы
→ Использование устаревших данных.
→ Несогласованность кэша.
→ «Штурм кэша» (*cache stampede*) при высокой нагрузке.
→ Ограничения по объёму памяти.

Лучшие практики
→ Всегда указывайте TTL для кэшированных данных.
→ Избегайте кэширования сильно изменчивых данных.
→ Тщательно подбирайте ключи кэша.
→ Отслеживайте соотношение попаданий и промахов в кэш.
→ Комбинируйте кэширование с индексированием базы данных.
👍73💯2
Как работает уязвимость Man in the Middle Attack (MitM)
(продолжение в следующем посте)
🔥3👏2🥰1
Как работает уязвимость Man in the Middle Attack (MitM)
(продолжение предыдущего поста)

Man in the Middle Attack (MitM) — это сетевая атака, при которой злоумышленник встраивается в канал связи между двумя участниками (например, пользователем и сервером), перехватывает и, при необходимости, изменяет передаваемые данные. Жертвы при этом не подозревают о вмешательстве.

#### Этапы работы MitM-атаки:

1. Перехват трафика (например, через Wi-Fi eavesdropping):
* Злоумышленник подключается к незащищённой или поддельной Wi-Fi-точке доступа («Evil Twin»), имитирующей легитимную сеть.
* Устройства жертв автоматически подключаются к этой точке, и весь их трафик проходит через злоумышленника.
* Пример на схеме: стрелка от ноутбука к роутеру с подписью «Wifi eavesdropping».

2. Подмена HTTPS-соединения (HTTPS spoofing):
* Если трафик защищён протоколом HTTPS, атакующий пытается обойти шифрование.
* Используются техники вроде SSL Stripping — понижение протокола с HTTPS до незащищённого HTTP.
* Либо создаётся ложное TLS-соединение, чтобы данные стали читаемыми.
* На схеме это отражено стрелкой от глобуса (интернета) с подписью «HTTPS spoofing».

3. Подмена DNS-запросов (DNS spoofing):
* Злоумышленник отравляет кэш DNS или подменяет DNS-серверы.
* В результате жертва перенаправляется на фальшивый сайт, который выглядит как легитимный.
* На схеме: стрелка от глобуса к браузеру с подписью «DNS spoofing».

4. Перехват и анализ данных:
* Получив доступ к каналу связи, злоумышленник прослушивает трафик — извлекает логины, пароли, токены, cookies и другую конфиденциальную информацию.
* Данные могут передаваться в открытом виде, если отсутствует шифрование (например, из-за понижения протокола).

5. Манипуляция данными:
* Атакующий может изменять содержимое запросов и ответов:
* подменять страницы авторизации;
* внедрять вредоносный код (веб-инъекции);
* перенаправлять пользователя на фишинговые ресурсы.
* Жертва при этом не замечает подмены, так как всё выглядит легитимно.

#### Уязвимости, которые использует MitM:
* Отсутствие шифрования (незащищённые Wi-Fi-сети, HTTP вместо HTTPS).
* Слабая аутентификация конечных точек (например, отсутствие двухфакторной аутентификации).
* Ненадёжные DNS-серверы (без поддержки DNSSEC).
* Уязвимости в сетевых протоколах (ARP, TLS, Wi-Fi-аутентификация).

#### Меры защиты (указаны на схеме зелёными галочками):
1. Использование протоколов шифрования (HTTPS, VPN, TLS) — защищает трафик от перехвата.
2. Сильная аутентификация конечных точек (двухфакторная аутентификация, сертификаты) — усложняет подмену участников.
3. Регулярный аудит безопасности и мониторинг сети — позволяет обнаружить подозрительную активность (например, аномальные DNS-запросы).

Итог: MitM-атака опасна тем, что проходит незаметно для жертв и может привести к утечке конфиденциальных данных, компрометации учётных записей и финансовым потерям. Защита требует комплексного подхода: шифрования, аутентификации и постоянного мониторинга сети.
👍6🔥42
Microsoft планирует к 2030 году исключить весь код на C и C++ из основных баз

Microsoft планирует модернизировать свои крупнейшие кодовые базы и к концу десятилетия полностью исключить весь код на C/C++, заменив его на Rust.

«Моя цель — к 2030 году исключить из кода Microsoft каждую строку на C и C++. Наша стратегия заключается в объединении ИИ и алгоритмов для переписывания крупнейших кодовых баз Microsoft. Наша путеводная звезда — “1 инженер, 1 месяц, 1 миллион строк кода”. Для выполнения этой ранее невообразимой задачи мы создали мощную инфраструктуру обработки кода. Наша алгоритмическая инфраструктура создает масштабируемый граф над исходным кодом в больших масштабах. Затем инфраструктура обработки ИИ позволяет нам применять агентов ИИ, управляемых алгоритмами, для внесения изменений в код в больших масштабах. Ядро этой инфраструктуры уже работает над такими задачами, как понимание кода», — отметил ведущий инженер Microsoft Гален Хант в посте на LinkedIn.

https://www.thurrott.com/dev/330980/microsoft-to-replace-all-c-c-code-with-rust-by-2030
🤣32🖕17🤡8👍6🤯6😭2👎1🔥1🌭1
Минцифры РФ хочет ввести единый идентификатор пользователя для всех интернет‑платформ

Минцифры введет единый идентификатор пользователя для всех цифровых платформ, чтобы точнее считать аудиторию. Об этом рассказала заместитель главы Минцифры России Бэлла Черкесова на заседании Общественного совета при министерстве.
Замминистра отметила, что идет работа по улучшению подходов к медиаизмерениям через способы унифицирования данных. По ее словам, сейчас совместно с отраслью идут обсуждения о том, как повысить прозрачность этой информации. Например, к диалогу уже присоединились российские онлайн-кинотеатры.

В пресс-службе Минцифры рассказали, что данные о просмотрах и активности пользователей онлайн-кинотеатров и соцсетей помогают оценить популярность контента. Для сбора этой статистики интернет-ресурсы из реестра Роскомнадзора передают компании Mediascope - измерителю ТВ и онлайн-аудитории - обезличенные данные в зашифрованном виде.
"Никто никогда не узнает, что смотрел конкретный пользователь. Данные передаются компании Mediascope в уже обезличенном виде. То есть обезличивает их не измеритель аудитории, а интернет-ресурсы", - рассказали в ведомстве.

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

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

https://rg.ru/2025/12/22/v-rossii-poiavitsia-edinyj-identifikator-polzovatelia-v-internete.html
🤬26🤡16👌2🌭2🖕21🤯1
3G, 4G и 5G вкратце
🤪14👍6🔥4😢32
Принципы ACID
(продолжение в следующем посте)
🔥3
Принципы ACID
(продолжение предыдущего поста)

ACID — это набор свойств, обеспечивающих надёжность и целостность данных при обработке транзакций в системах управления базами данных (СУБД). Аббревиатура включает четыре ключевых принципа: Atomicity (атомарность), Consistency (согласованность), Isolation (изолированность) и Durability (долговечность).
Соблюдение принципов ACID гарантирует надёжность, целостность и доступность данных в СУБД, что критически важно для финансовых, медицинских и других транзакционных систем.

1. Atomicity (Атомарность)
- Суть: каждая транзакция — единый неделимый блок операций, который либо выполняется полностью, либо не выполняется вовсе.
- Пример: при переводе денег с одного счёта на другой все шаги (проверка баланса, списание средств, зачисление) либо завершаются, либо отменяются, если что-то пошло не так.
- Механизм: СУБД использует логирование и откат транзакций для поддержания атомарности.

2. Consistency (Согласованность)
- Суть: каждая транзакция должна соблюдать правила и ограничения базы данных, поддерживая её целостность. Благодаря чему обеспечивается корректное состояние данных после транзакции.
- Пример: если в базе данных есть связь «клиент — заказ», транзакция не сможет создать заказ для несуществующего клиента.
- Механизм: ограничения целостности (уникальность, ссылочная целостность) гарантируют согласованность.

3. Isolation (Изолированность)
- Суть: параллельные транзакции выполняются независимо друг от друга, их промежуточные результаты невидимы до завершения.
- Пример: если два пользователя одновременно обновляют одну запись, изменения одного не повлияют на другого до фиксации транзакции.
- Механизм: СУБД использует блокировки и уровни изоляции (например, Serializable) для предотвращения конфликтов.

4. Durability (Долговечность)
- Суть: результаты завершённых транзакций сохраняются в энергонезависимой памяти и не теряются даже при сбоях системы. Данные остаются сохранёнными, несмотря на возможные ошибки.
- Пример: после подтверждения покупки в интернет-магазине данные о заказе останутся в базе, даже если произойдёт сбой сервера.
- Механизм: записи транзакций фиксируются в журнале (log) и переносятся в постоянное хранилище.
👍7🔥5🥰1🗿1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2🤪1
Работа с Cron
(продолжение в следующем посте)
6🥰1👏1
Работа с Cron
(продолжение предыдущего поста)

1. Что такое Cron и Crontab?

Cron — это планировщик задач в Linux, который автоматически выполняет скрипты или команды по расписанию. Crontab — это файл с расписанием задач (таблицы заданий), доступный каждому пользователю системы.
Cron позволяет автоматизировать выполнение задач с высокой гибкостью: от ежеминутных проверок до ежегодных операций. Главное — правильно настроить расписание с помощью синтаксиса и операторов, а также использовать удобные макросы для стандартных интервалов.


2. Синтаксис Cron-выражений

Cron-выражение состоит из 5 полей, определяющих расписание выполнения задачи:

- Минуты (0–59);
- Часы (0–23);
- День месяца (1–31);
- Месяц (1–12);
- День недели (0–6, где 0 = воскресенье, 6 = суббота).

Формат записи:
* * * * * команда
(где * — любое значение, команда — выполняемая команда/скрипт).

Примеры из изображения:
- # every Mon midnight0 0 * * 1 command (выполняется в полночь по понедельникам);
- # everyday 05:04 AM4 5 * * * command (каждый день в 05:04 утра);
- # every Sun 12:05 PM5 12 * * 0 command (каждое воскресенье в 12:05).

3. Специальные сокращения (макросы)

Для удобства используются макросы — короткие обозначения стандартных расписаний:
- @reboot — при загрузке системы;
- @hourly — каждый час;
- @daily (или @midnight) — ежедневно в полночь;
- @weekly — каждую неделю;
- @monthly — каждый месяц;
- @yearly (или @annually) — каждый год.

Примеры:
- @reboot command — запуск команды при старте системы;
- @hourly command — выполнение команды каждый час;
- @yearly command — выполнение команды раз в год.

4. Операторы в Cron

В Cron используются специальные операторы для настройки расписаний:
- `*` — все возможные значения (например, * * * * * — каждую минуту каждого часа);
- `,` — перечисление значений (например, 0 8,12,16 * * * command — в 8:00, 12:00 и 16:00);
- `-` — диапазон значений (например, 0 9-17 * * 1-5 command — с 9:00 до 17:00 по будням);
- `/` — шаг (например, */5 * * * * command — каждые 5 минут);
- `L` — последнее значение (используется в полях «день месяца» и «день недели»);
- `W` — ближайший будний день (например, 15 10 * * 5W — в 10:15 в ближайшую пятницу);
- `?` — игнорирование поля (используется в «день месяца» или «день недели»).

5. Команды для работы с Crontab

Для управления заданиями Cron используются команды:
- $ crontab -e — редактирование/создание файла crontab;
- $ crontab — просмотр текущего crontab-файла;
- $ crontab -r — удаление crontab-файла;
- $ crontab -u username -l — просмотр crontab другого пользователя;
- $ crontab -u username -e — редактирование crontab другого пользователя;
- $ echo "username" > /etc/cron.allow — разрешение пользователю использовать cron;
- $ echo "username" > /etc/cron.deny — запрет пользователю использовать cron;
- $ crontab -v — показ времени последнего изменения crontab.

6. Примеры расписаний из изображения

- Каждые 6 часов: 0 */6 * * * command;
- Каждые 5 минут: */5 * * * * command;
- Ежемесячно: 0 0 1 * * command (1-го числа каждого месяца в 00:00);
- Раз в год: @yearly command или @annually command.

7. Практические шаги

1. Откройте файл crontab: $ crontab -e.
2. Добавьте расписание и команду (используя синтаксис из п. 2–4).
3. Сохраните изменения (например, в редакторе nanoCtrl+O, затем Ctrl+X).
4. Проверьте список задач: $ crontab -l.
5. При необходимости удалите задачи: $ crontab -r.
👍83👏2🔥1
В Южной Корее покупателей новых смартфонов обязали проходить процедуру распознавания лица

Граждан Южной Кореи обязали проходить процедуру распознавания лица при настройке нового смартфона. Со вторника эта мера стала обязательной для всех новых пользователей независимо от того, покупают они устройство онлайн или в магазинах, сообщает Korea Herald.

Согласно правилам, подтверждение личности через распознавание лица требуется при активации смартфона. Пользователям нужно сфотографировать своё лицо через приложение аутентификации PASS. Ранее хватало предъявления паспорта, но теперь добавлен дополнительный шаг биометрической проверки.

Требование касается трёх основных операторов (SK Telecom, KT и LG Uplus), а также бюджетных провайдеров. Власти планируют распространить систему на всех к 23 марта 2026 года.

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

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

https://www.koreaherald.com/article/10642116
🤡16👎5👍3😭2🫡2
Microsoft опровергла информацию (или отказалась под влиянием общественности) о том, что компания намерена переписать код Windows 11 на Rust с использованием ИИ. Ранее это заявление от имени одного из инженеров вызвало возмущение пользователей.

«Моя цель — к 2030 году полностью исключить использование C и C++ в коде Microsoft. Наша стратегия заключается в объединении ИИ и алгоритмов для переписывания крупнейших кодовых баз Microsoft. Наша путеводная звезда — “1 инженер, 1 месяц, 1 миллион строк кода”», — писал Гален Хант, ведущий инженер Microsoft.

Между тем большая часть кода уровня API Windows, а также ядро ОС, написаны на C, в то время как некоторые приложения работают на C++.

После возмущения по поводу планов «исключить каждую строку C и C++ из кода Microsoft к 2030 году» компания заявила, что таких планов у неё нет.

Фрэнк X. Шоу, глава отдела коммуникаций Microsoft, также подтвердил, что компания не планирует переписывать Windows 11 с использованием ИИ.

https://www.windowslatest.com/2025/12/24/microsoft-denies-rewriting-windows-11-using-ai-after-an-employees-one-engineer-one-month-one-million-code-post-on-linkedin-causes-outrage/
🤡27😁9🤣6🤪3👍1
Шаблоны (паттерны) решения задач по Структурами данных и алгоритмам (Data Structures and Algorithms / DSA)
(продолжение в следующем посте)
2👍2🤝2
Шаблоны (паттерны) решения задач по Структурами данных и алгоритмам (Data Structures and Algorithms / DSA)
(продолжение предыдущего поста)

1. Array / String Inputs (Массивы / строки):

1. Отсортирован ли массив?
→ Использовать бинарный поиск, два указателя или префиксные суммы.
2. Задачи оптимизации (максимум/минимум/подмассив)?
→ Подумать о скользящем окне, динамическом программировании или жадных алгоритмах.
3. Поиск дубликатов, подсчёта или частот?
→ Использовать HashMap, HashSet или массив для подсчёта.
4. Нужны подстроки или подмассивы фиксированного размера?
→ Применить скользящее окно с двумя указателями.
5. Часто встречающиеся минимум/максимум в окне?
→ Использовать монотонную очередь, deque или кучу.
6. Генерация подмножеств, перестановок, комбинаций?
→ Использовать обратный ход (backtracking).
7. Сопоставление или разбор символов?
→ Использовать стек, особенно для сбалансированных скобок, инфиксной/постфиксной записи.

2. Graph Inputs (Графы):

1. Кратчайший путь в невзвешенном графе?
→ Использовать поиск в ширину (BFS).
2. Кратчайший путь в взвешенном графе?
→ Использовать алгоритм Дейкстры, Беллмана-Форда или A*.
3. Связные компоненты / обнаружение циклов?
→ Использовать DFS или Union-Find (DSU).
4. Топологическая сортировка?
→ Использовать алгоритм Кана или DFS с набором посещённых вершин.
5. Оптимизация, например, MST (минимальное остовное дерево)?
→ Использовать алгоритмы Крускала или Прима.

3. Linked List Inputs (Связанные списки):

1. Обнаружение циклов?
→ Использовать «медленный и быстрый указатели» (алгоритм Флойда).
2. Перевороты или частичные изменения?
→ Использовать жонглирование указателями: prev, curr, next.
3. Пересечение или средний узел?
→ Использовать два указателя.

4. Tree Inputs (Часто бинарные деревья):

1. Обходы?
→ Использовать inorder, preorder, postorder или обход по уровням (BFS).
2. Проверка сбалансированности или расчёт диаметра?
→ Использовать postorder + расчёт высоты.
3. Наименьший общий предок?
→ Использовать рекурсивный DFS или карту родителей + набор предков.

5. Dynamic Programming Use-Cases (Случаи применения динамического программирования):

1. Оптимальный выбор / перекрывающиеся подзадачи?
→ Использовать ДП с мемоизацией (сверху вниз) или табуляцией (снизу вверх).
2. Задачи типа «подмножество» или "knapsack"?
→ Использовать 1D/2D массивы ДП.
3. Сопоставление строк или редактирование?
→ Использовать матрицу ДП (например, расстояние редактирования, LCS).
👍622
Please open Telegram to view this post
VIEW IN TELEGRAM