Computer Science
8.34K subscribers
1 photo
15 links
По всем вопросам: @altmainf

Уважаемый менеджер: @altaiface
Download Telegram
Разница между процедурным и объектно-ориентированным программированием

Процедурное программирование основывается на идее написания последовательности инструкций для выполнения задач, в то время как объектно-ориентированное программирование (ООП) разделяет программу на объекты, которые содержат данные и методы для работы с ними. ООП помогает улучшить структуру и читаемость кода, а также облегчает его поддержку.
Как защитить свой код: Основы безопасной разработки программного обеспечения

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

1. Защита от SQL-инъекций
SQL-инъекция — атака, при которой злоумышленник может вставить вредоносные SQL-запросы в поля ввода, что может привести к раскрытию или изменению данных в базе данных.

Лучшие практики для предотвращения:

• Используйте подготовленные выражения или параметризированные запросы, которые автоматически обрабатывают вводимые данные.
• Пример с использованием Python и библиотеки sqlite3:
import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

user_input = "some_input"
cursor.execute("SELECT * FROM users WHERE username = ?", (user_input,))


2. Защита от XSS-атак (Cross-Site Scripting)
XSS (межсайтовое скриптование) — атака, при которой злоумышленник вставляет вредоносный JavaScript в веб-страницу, которую затем выполняет браузер другого пользователя.

Лучшие практики для предотвращения:

• Всегда фильтруйте и экранируйте данные, введенные пользователями, перед выводом на веб-страницу.
• Используйте библиотеку, такую как HTMLPurifier, для очистки данных.
• Важно избегать вставки данных напрямую в HTML без правильной обработки.

3. Шифрование данных
Для защиты данных важно использовать шифрование. Шифрование позволяет преобразовать информацию в такой формат, который невозможно расшифровать без ключа.

Рекомендации:

• Используйте современные алгоритмы шифрования, такие как AES (Advanced Encryption Standard) для защиты конфиденциальных данных.
• Используйте безопасные хеш-функции, например SHA-256, для хранения паролей. Всегда добавляйте соль (random string) к паролю перед хешированием.

Пример с использованием bcrypt для хеширования паролей:
import bcrypt

# Генерация соли
salt = bcrypt.gensalt()

# Хеширование пароля
password = "secret_password"
hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)

# Проверка пароля
if bcrypt.checkpw(password.encode('utf-8'), hashed_password):
print("Пароль правильный!")
else:
print("Пароль неправильный!")


4. Использование безопасных библиотек и фреймворков
Использование проверенных библиотек и фреймворков значительно снижает риски уязвимостей. Например:

• Использование фреймворков, таких как Django или Flask, помогает встроить основные меры безопасности, такие как защита от CSRF (межсайтовых атак подделки запросов) и XSS.
• Регулярно обновляйте зависимости, чтобы получить исправления безопасности.

5. Аутентификация и авторизация
Одним из наиболее важных аспектов безопасности является правильная реализация аутентификации и авторизации пользователей.

Рекомендации:

• Используйте многофакторную аутентификацию (MFA) для повышения безопасности.
• При хранении паролей всегда используйте соль и хеширование.
• Настройте строгие правила доступа, чтобы каждый пользователь имел доступ только к необходимым данным.
Понимание блокчейн-технологий: Как работает блокчейн и криптовалюты

Блокчейн — распределенная база данных, которая обеспечивает безопасность, прозрачность и неподкупность данных. Технология блокчейн лежит в основе таких криптовалют, как Bitcoin и Ethereum.

1. Что такое блокчейн?
Блокчейн — это цепочка блоков данных, каждый из которых содержит информацию о транзакции. Эти блоки связаны друг с другом с помощью криптографических хешей, что делает невозможным изменение данных в одном блоке без изменения всех последующих.

Каждый блок содержит:

• Транзакционные данные (например, кто, кому и сколько перевел).
• Хеш предыдущего блока, который обеспечивает безопасность всей цепочки.
• Временную метку для фиксирования времени транзакции.

2. Как работают криптовалюты?
Криптовалюты, такие как Bitcoin или Ethereum, используют блокчейн для ведения учета всех транзакций. Когда пользователь отправляет криптовалюту, транзакция записывается в блокчейн.

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

3. Основные преимущества блокчейна:
• Децентрализация: Нет центрального органа, который контролирует систему. Вместо этого данные распределены среди всех участников сети.
• Неподкупность: Изменение информации в блоках требует изменения всех последующих блоков, что делает блокчейн защищенным от фальсификаций.
• Прозрачность: Все транзакции видны всем участникам сети, что позволяет обеспечить высокий уровень доверия.

4. Применение блокчейна
• Финансовые операции: Криптовалюты и смарт-контракты.
• Цепочки поставок: Использование блокчейн для отслеживания товаров и их происхождения.
• Голосование: Блокчейн позволяет обеспечить прозрачность и безопасность голосования в выборах.
Важность хеширования в компьютерных науках

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

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

Чат-боты становятся неотъемлемой частью различных сервисов, начиная от поддержки клиентов и заканчивая развлекательными приложениями. В этой статье мы создадим простой чат-бот с использованием Python и технологий обработки естественного языка (NLP).

Шаг 1: Установка библиотек
Для начала установим необходимые библиотеки:
pip install nltk


Шаг 2: Импортирование библиотек
Импортируем основные библиотеки для работы с текстом:
import nltk
from nltk.chat.util import Chat, reflections

# Убедитесь, что скачаны необходимые ресурсы
nltk.download('punkt')


Шаг 3: Создание правил для чат-бота
Мы создадим несколько шаблонов для простого общения. Каждый шаблон представляет собой пару: ввод пользователя и соответствующий ответ.
pairs = [
(r'Привет|Здравствуйте', ['Привет! Как я могу помочь вам?']),
(r'Как дела?', ['Хорошо, спасибо за вопрос! А у вас?']),
(r'(Что ты можешь делать\?)', ['Я могу отвечать на вопросы и помогать с простыми задачами!']),
(r'Пока', ['До свидания!'])
]


Шаг 4: Создание и запуск чат-бота
Теперь создадим чат-бота, который будет использовать наши шаблоны для общения.
chatbot = Chat(pairs, reflections)
chatbot.converse()

После запуска код будет ожидать ввода и отвечать согласно заданным шаблонам.
Как эффективно использовать Git и GitHub для управления проектами

Git — это система контроля версий, которая позволяет отслеживать изменения в коде и управлять проектами. GitHub — это платформа для хостинга проектов, использующих Git. В этой статье мы рассмотрим, как эффективно использовать эти инструменты для командной работы и управления проектами.

1. Основы Git

Git позволяет сохранять различные версии вашего кода. Для этого вам нужно создать репозиторий и выполнять следующие операции:

• Инициализация репозитория:
git init
Эта команда создаст скрытую папку .git, которая будет отслеживать изменения.

• Добавление файлов в индекс:
git add <file>
Для того чтобы сохранить изменения, нужно добавить файлы в индекс.

• Коммит изменений:
git commit -m "Your commit message"
Коммиты сохраняют изменения в репозитории.

• Просмотр истории:
git log
Команда показывает историю изменений в репозитории.

2. Использование GitHub
GitHub — сервис для хостинга репозиториев Git. Чтобы начать работать с GitHub, нужно создать репозиторий на платформе и подключить его к локальному репозиторию.

• Создание репозитория на GitHub:
1. Перейдите на GitHub и создайте новый репозиторий.
2. Скопируйте URL вашего репозитория.

• Подключение локального репозитория к GitHub:

В терминале выполните:
git remote add origin <URL вашего репозитория на GitHub>

• Отправка изменений на GitHub:
После коммита отправьте изменения на GitHub:
git push -u origin main

3. Работа с ветками
Для эффективной работы в команде часто используется принцип ветвления. Это позволяет работать над разными задачами параллельно и объединять их в основной код.

• Создание новой ветки:
git checkout -b <имя ветки>

• Переключение между ветками:
git checkout <имя ветки>

• Слияние веток:
Когда работа в ветке завершена, ее нужно объединить с основной веткой:
git checkout main
git merge <имя ветки>


4. Разрешение конфликтов
Иногда при слиянии веток могут возникать конфликты, когда изменения в разных ветках касаются одних и тех же строк. Git помечает такие места, и вам нужно вручную выбрать, какие изменения оставить.

5. Использование Pull Requests
Pull Requests (PR) позволяют предложить изменения в проект, который находится в удаленном репозитории. Это позволяет коллегам обсудить и проверить изменения до их слияния в основной код.
Основные различия между IPv4 и IPv6:

1. Адресная разрядность:
• IPv4 использует 32-битные адреса и поддерживает около 4,3 миллиарда уникальных адресов.
• IPv6 использует 128-битные адреса и обеспечивает гораздо большее количество уникальных адресов, практически неограниченное количество.

2. Формат адреса:
• IPv4 адреса записываются в десятичной системе, разделенные точками, например, 192.168.1.1.
• IPv6 адреса записываются в шестнадцатеричной системе, разделенные двоеточиями, например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334.

3. Поддержка и распространение:
• IPv4 широко используется в настоящее время, но из-за ограниченного количества адресов возникает проблема исчерпания адресов.
• IPv6 разработан для решения проблемы исчерпания адресов IPv4 и постепенно внедряется в сети.

4. Безопасность и другие функции:
• IPv6 включает в себя встроенные функции безопасности, такие как IPsec, что делает его более безопасным и защищенным по сравнению с IPv4.
• IPv6 также поддерживает более эффективную маршрутизацию и улучшенную поддержку качества обслуживания (QoS).
Типы флеш-памяти

Флеш-память - это тип энергонезависимой памяти, которая используется в различных электронных устройствах, таких как USB-накопители, твердотельные накопители (SSD) и мобильные телефоны. Существует несколько типов флеш-памяти, каждый из которых имеет свои преимущества и недостатки.

Основные типы флеш-памяти:

• NOR Flash: NOR Flash позволяет выполнять чтение и запись на уровне байта, что делает ее подходящей для использования в коде и данных. Однако она имеет более низкую плотность хранения и более высокое энергопотребление, чем другие типы флеш-памяти.
• NAND Flash: NAND Flash позволяет выполнять чтение и запись на уровне страницы (обычно 512 байт или 4 КБ), что делает ее более эффективной для хранения больших объемов данных. Она имеет более высокую плотность хранения и более низкое энергопотребление, чем NOR Flash.
• SLC NAND Flash (одноуровневая ячейка): SLC NAND Flash хранит один бит данных на ячейку памяти, что обеспечивает высокую надежность и производительность. Однако она имеет более низкую плотность хранения и более высокую стоимость, чем другие типы флеш-памяти.
• MLC NAND Flash (многоуровневая ячейка): MLC NAND Flash хранит два или более бит данных на ячейку памяти, что обеспечивает более высокую плотность хранения и более низкую стоимость. Однако она имеет более низкую надежность и производительность, чем SLC NAND Flash.
• TLC NAND Flash (трехуровневая ячейка): TLC NAND Flash хранит три бита данных на ячейку памяти, что обеспечивает еще более высокую плотность хранения и более низкую стоимость. Однако она имеет еще более низкую надежность и производительность, чем MLC NAND Flash.
• QLC NAND Flash (четырехуровневая ячейка): QLC NAND Flash хранит четыре бита данных на ячейку памяти, что обеспечивает максимальную плотность хранения и самую низкую стоимость. Однако она имеет самую низкую надежность и производительность среди всех типов флеш-памяти.

Другие типы флеш-памяти:


• EEPROM (электрически стираемое программируемое ПЗУ): EEPROM позволяет выполнять чтение и запись на уровне байта, как и NOR Flash. Однако она имеет более низкую плотность хранения и более высокое энергопотребление.
• FeRAM (ферроэлектрическая ОЗУ): FeRAM позволяет выполнять чтение и запись на уровне бита, как и SRAM. Однако она имеет более низкую плотность хранения и более высокое энергопотребление.
Контрольные суммы 

Распространенный способ быстро и эффективно обнаружить повреждение данных в современных системах.

Для вычисления простой контрольной суммы нужно лишь сложить байты блока данных, но, конечно, придумано много более изощренных контрольных сумм, в том числе циклический избыточный код (CRC), контрольная сумма Флетчера и другие [MK09].

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

КС оцениваются по нескольким критериям. Самый важный – сила, или способность к обнаружению ошибок: приводит ли изменение данных к изменению контрольной суммы? Чем сильнее контрольная сумма, тем больше шансов, что изменение данных не останется незамеченным.
Еще один важный критерий – производительность: каковы затраты на вычисление контрольной суммы?

К сожалению, сила и производительность редко уживаются, т. е. высококачественную контрольную сумму труднее вычислить.
RAID-массив

RAID (Redundant Array of Independent Disks) — технология виртуализации данных, которая объединяет несколько дисков в логический элемент для повышения производительности. Соответственно, минимальное количество требуемых дисков — 2.

Есть несколько видов RAID-массива:
RAID 0 — принцип работы - чередование. Массив при котором информация разбивается на одинаковые по длине блоки, а затем записывается поочерёдно на каждый диск в структуре (фактическое увеличение производительности в 2 раза)

RAID 1 — принцип работы — «зеркалирование». Представляет собой параллельную запись информации с основного диска на другие — дублирующие. 

RAID 10 (1+0) — совмещает в себе всё самое лучшее из RAID 1 и RAID 0

RAID 5 — схож по своему принципу работы с RAID 1. Только тут потребуется минимум 3 накопителя, на одном из которых будет храниться продублированная информация
Дефрагментация дисков

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

Именно благодаря дефрагментации происходят следующие изменения в работе ПК:
 ⁃ Увеличивается скорость чтения/записи на диск.
 ⁃ Быстрее открываются приложения.
 ⁃ Повышается срок службы накопителя.
Штрих-коды — универсальный способ представления данных о товарах с помощью черных и белых полос.

Основные стандарты, такие как UPC (Universal Product Code) и EAN (European Article Number), позволяют однозначно идентифицировать продукт. Когда штрих-код сканируется, лазерный сканер считывает отражение света, преобразуя его в последовательность нулей и единиц. Эти данные отправляются в базу, где происходит сопоставление с информацией о товаре, такой как цена и описание.

Стандарты штрих-кодов различаются по формату, области применения и количеству закодированной информации. UPC, например, используется в основном в США и Канаде и состоит из 12 цифр, в то время как EAN, более распространенный в Европе, может иметь 13 цифр. ISBN (International Standard Book Number) применяется для книг и имеет уникальный формат. QR-коды, хотя и не являются традиционными штрих-кодами, могут содержать гораздо больше данных, включая ссылки и текст.
Что такое RegExp?

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

Они удобны тем, что позволяют создать шаблон для поиска.

Метасимволы:
. — соответствует любому одному символу
[ ] — соответствует одному символу из содержащихся в квадратных скобках
^ — соответствует началу строки
$ — соответствует концу строки
*— соответствует 0 или более предыдущих элементов
? — соответствует 0 или одному предыдущему элементу
+ — означает, что предшествующий символ присутствует и может повторяться несколько раз
{ } — кол-во повторений предыдущего символа
Принципы SOLID в ООП

SOLID — это акроним, обозначающий 5 ключевых принципов проектирования ПО в ООП. Они помогают создавать гибкий, поддерживаемый и расширяемый код. Принципы были сформулированы Робертом Мартином (Uncle Bob). Каждый принцип решает конкретные проблемы в архитектуре классов и модулей.

1. Single Responsibility Principle (SRP) — Принцип единственной ответственности
Суть: Каждый класс должен иметь только одну причину для изменения, то есть выполнять только одну задачу. Это предотвращает "божественные" классы, которые делают всё и ломаются при малейших изменениях.
Пример: Класс User должен только хранить данные пользователя (имя, email), а не отправлять письма. Для отправки создайте отдельный класс EmailService.
• Нарушение: Класс, который и сохраняет пользователя в БД, и логирует, и отправляет уведомления — изменение логики ломает всё.
• Преимущества: Легче тестировать, поддерживать и переиспользовать.

2. Open-Closed Principle (OCP) — Принцип открытости-закрытости
• Суть: Классы должны быть открыты для расширения, но закрыты для модификации. Добавляйте новую функциональность через наследование или интерфейсы, а не меняя существующий код.
• Пример: Интерфейс Shape с методом area(). Классы Circle и Rectangle реализуют его. Для нового Triangle просто добавьте класс, не трогая старые.
• Нарушение: Если в классе Calculator добавить новый тип операции прямо в код, это модификация.
• Преимущества: Минимизирует риски багов в существующем коде.

3. Liskov Substitution Principle (LSP) — Принцип подстановки Барбары Лисков
• Суть: Объекты подклассов должны быть взаимозаменяемы с объектами базового класса без нарушения корректности программы. Дочерний класс не должен ломать ожидания от родителя.
• Пример: Класс Bird с методом fly(). Подкласс Penguin не должен наследовать fly(), если пингвины не летают — лучше использовать композицию или интерфейсы.
• Нарушение: Подкласс бросает исключение в методе родителя, ломая полиморфизм.
• Преимущества: Обеспечивает правильное наследование и полиморфизм.

4. Interface Segregation Principle (ISP) — Принцип разделения интерфейсов
• Суть: Клиенты не должны зависеть от интерфейсов, которые они не используют. Разделяйте жирные интерфейсы на мелкие, специфичные.
• Пример:
Вместо одного интерфейса Worker с work() и eat(), создайте Workable и Eatable. Робот реализует только Workable.
• Нарушение: Класс, реализующий интерфейс с 10 методами, но использующий только 2, вынужден реализовывать пустышки.
• Преимущества: Уменьшает связанность и упрощает код.

5. Dependency Inversion Principle (DIP) — Принцип инверсии зависимостей
• Суть: Зависимости должны строиться на абстракциях, а не на конкретных классах. Модули верхнего уровня не должны зависеть от нижних; оба зависят от абстракций.
• Пример: Класс OrderService зависит от интерфейса PaymentProcessor, а не от конкретного PayPalProcessor. Легко заменить на StripeProcessor.
• Нарушение: Прямое создание объектов (new PayPal()) в классе.
• Преимущества: Увеличивает гибкость, облегчает тестирование (mock'и) и инверсию контроля (IoC-контейнеры).
Главная загрузочная запись (MBR)

Нулевой сектор физического жёсткого диска содержит так называемую главную загрузочную запись (MBR — Master Boot Record). При начальной загрузке компьютера с жёсткого диска BIOS считывает этот сектор в оперативную память и передаёт управление содержащемуся в нём коду начального загрузчика.

MBR логически можно разделить на три области: код начального загрузчика, таблицу разделов и сигнатуру — слово со значением AA55h, занимающее последние два байта MBR. BIOS проверяет сигнатуру, чтобы убедиться в корректности MBR; если сигнатура не равна указанному значению, загрузка не выполнения и выдаётся сообщение об ошибке. 

Начальный загрузчик, находящийся в MBR, в общем случае определяет, какой из разделов диска является активным, загружает в память первый сектор этого раздела и передаёт ему управление.
EXE (Windows Executable)

Структура:
• DOS Header: Первые 64 байта, служат для обратной совместимости с DOS. Содержит метку "MZ".
• PE Header: Заголовок Portable Executable, содержащий информацию о типе файла, секциях, размерах, точках входа и т. д.
• Секции:
.text: Код программы.
.data: Глобальные и статические переменные.
.rsrc: Ресурсы, такие как изображения и строки.
• Import Table: Содержит список используемых внешних функций и библиотек.

Использование:
• EXE файлы запускаются через двойной щелчок или через командную строку Windows.
• Поддерживает графические интерфейсы и консольные приложения.


ELF (Executable and Linkable Format)

Структура:
• ELF Header: Содержит информацию о типе файла (исполняемый, объектный и т. д.), архитектуре, размере заголовка и других метаданных.
• Program Header Table: Описывает сегменты, которые будут загружены в память.
• Section Header Table: Описывает секции файла (например, .text, .data, .bss и другие).
• Секции:
.text: Код программы.
.data: Инициализированные данные.
.bss: Неинициализированные данные.
.dynamic: Динамическая информация для линковщиков.

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

Ключевые различия:

• EXE предназначен для Windows, ELF — для Linux и других UNIX-подобных систем.
• ELF более модульный и гибкий, поддерживает динамическую линковку и различные типы секций.
• ELF включает больше информации о типах данных и секциях, что упрощает работу компиляторов и отладчиков.
Wi-Fi обычно работает на двух основных частотах: 2.4 ГГц и 5 ГГц.

• 2.4 ГГц
Преимущества: Лучшее покрытие и большая дальность действия.
Недостатки: Более загруженная частота, подвержена помехам от других устройств (например, микроволновок, беспроводных телефонов).

• 5 ГГц
Преимущества: Более высокая скорость передачи данных и меньшее количество помех.
Недостатки: Меньшее покрытие и более слабое проникновение через стены.

Соответственно, если нужна скорость, лучше выбрать 5 ГГц, а для большого покрытия — 2.4 ГГц.
Топологии сетей на реальных примерах

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

2. Кольцевая топология - узлы сети соединены в кольцо, где данные передаются последовательно через каждое устройство. Примером может быть локальная сеть на базе технологии Token Ring.

3. Шина - это тип топологии, где все узлы сети подключены к одной основной кабельной линии. Примером может быть Ethernet сеть, где все компьютеры подключены к одному коммутатору через один кабель.

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

5. Сеть с полной (полукольцевой) связностью - это тип топологии, где каждый узел сети имеет прямое подключение ко всем остальным узлам. Примером может быть машинный парк, где все компьютеры между собой связаны.

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

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

Основные понятия:
Граф: Сеть представляется в виде направленного графа, где узлы — это точки, а рёбра — это связи между ними с заданными пропускными способностями.
Поток: Это количество "ресурса" (например, воды, информации), передаваемого от источника к стоку через сеть.
Пропускная способность: Максимальное количество потока, которое может проходить через ребро.

Основные алгоритмы:
Алгоритм Форда-Фалкерсона: Базовый алгоритм, который использует метод увеличивающих путей. На каждой итерации ищется путь от источника к стоку, по которому можно увеличить поток.
Алгоритм Эдмондса-Карпа: Это улучшенная версия алгоритма Форда-Фалкерсона, использующая поиск в ширину (BFS) для нахождения увеличивающих путей, что обеспечивает полиномиальную временную сложность.
Алгоритм Линка: Использует метод "потока по потоку" и подходит для больших и сложных сетей.

Применение:
Логистика: Оптимизация транспортировки товаров.
Телекоммуникации: Управление пропускной способностью сетей.
Электросети: Оптимизация распределения электроэнергии.

Пример задачи:
Предположим, у вас есть сеть с 4 узлами: A (источник), B, C и D (сток). Рёбра между узлами имеют следующие пропускные способности:
A → B: 3
A → C: 2
B → D: 2
C → D: 3
Необходимо определить максимальный поток из A в D.

Решение может быть найдено с использованием одного из алгоритмов, например, алгоритма Эдмондса-Карпа.
Делегирование домена 

Делегированием домена — передача корневым сервером зоны права размещения домена на определенном NS-сервере

Для примера, корневые сервера делегируют зону .COM на серверы, которые будут за нее отвечать, а серверы зоны .COM делегируют домен MYDOMAIN.COM на NS-сервера хостинг-провайдера или на какие-либо другие. 

Само делегирование означает, что на корневом сервере для домена присутствуют записи IN NS, указывающие на NS-сервер, на котором размещена информация по домену. 

Делегирование предполагает наличие только записей IN NS и никаких других. Поэтому домену второго уровня нельзя прописать, к примеру, запись CNAME.