<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Графы</title>
    <description>Графы — это математические структуры, состоящие из множества вершин (узлов) и множества рёбер (связей) между этими вершинами. Вершины представляют объекты, а рёбра — отношения или связи между ними. Графы могут быть направленными (с рёбрами, имеющими направление) и ненаправленными (без направления). Они используются для моделирования и решения различных задач, таких как маршрутизация, социальные сети, сетевые структуры и многое другое.</description>
    <link>https://tproger.ru/tag/graph</link>
    <atom:link href="https://tproger.ru/tag/graph/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Mon, 05 Oct 2026 00:47:50 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Графы</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Netflix построила Service Topology: живая карта микросервисов</title>
      <link>https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top</link>
      <comments>https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top</guid>
      <description><![CDATA[<p>Как Netflix объединяет eBPF, IPC-метрики и tracing в единую карту зависимостей. Разбираем, почему статические схемы устарели и что перенести в свою систему.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/netflix-postroila-zhivuyu-kartu-servisov-kak-ustroena-service-top">Netflix построила Service Topology: живая карта микросервисов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Jun 2026 07:47:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы хоть раз отлаживали микросервис ночью, знаете главный вопрос: это мой сервис сломался или его уронило что-то выше по течению? В системе из тысяч сервисов ответ приходится искать по кускам — метрики, логи и трейсы показывают симптомы, но не дают единой карту зависимостей. Netflix столкнулась с этой же болью и построила инструмент под названием Service Topology, который рисует живую карту зависимостей в реальном времени.</p><p>Service Topology — это не статическая схема из вики, а динамическая карта связей между сервисами. Она обновляется по мере того, как меняется трафик, появляются новые зависимости или старые исчезают. Карта показывает не только «кто с кем говорит», но и контекст: уровень доступности, бизнес-домен, владельца и текущее состояние здоровья.</p><p>Если тема микросервисов для вас новая, начните с базового разбора <a href="https://tproger.ru/articles/chto-takoe-mikroservisy--arhitektura--plyusy-i-minusy--primery">«Что такое микросервисы»</a>, а если выбираете архитектуру для проекта — сравните варианты в материале <a href="https://tproger.ru/articles/monolit-ili-mikroservisy--kak-vybrat-arhitekturu-dlya-novogo-proekta">«Монолит или микросервисы»</a>. Авторский разбор внутреннего устройства Netflix читайте в статье <a href="https://tproger.ru/articles/razrabotchik-izuchal-sistemu-rekomendacij-netflix-mesyacami--vot-chto-skryvaetsya-vnutri">«Разработчик изучал систему рекомендаций Netflix месяцами»</a>.</p><ul><li>Netflix объединила три источника данных: eBPF-сетевые потоки, IPC-метрики и распределённые трейсы.</li><li>Каждый источник строит свой граф; общий вид получается параллельным слиянием слоёв.</li><li>Карта обновляется почти в реальном времени и отвечает на запросы быстрее секунды.</li><li>Инженеры используют её для поиска причин сбоев, оценки зоны поражения и планирования изменений.</li><li>Подход можно перенести в любую распределённую систему, где нужно понимать зависимости.</li></ul><h2>Почему обычной наблюдаемости мало</h2><p>Традиционные инструменты наблюдаемости показывают фрагменты картины. Метрики говорят, что что-то болит. Логи рассказывают, что конкретно произошло в одном сервисе. Трейсы прослеживают путь отдельного запроса. Но ни один из этих сигналов не показывает полную топологию зависимостей — ту самую основу, на которой держится распределённая архитектуры.</p><p>Инженеру в три часа ночи приходится мысленно склеивать данные из разных источников. Это медленно, чревато ошибками и добавляет стресса. Netflix проанализировала тысячи обращений в поддержку за четыре года и увидела повторяющиеся вопросы: кто мои upstream и downstream, что упадёт вместе со мной, почему сервис отображается в панели мониторинга как Unknown (неизвестный сервис). Ответы на них требовали единого представления о зависимостях.</p><h2>Три источника данных Service Topology</h2><p>Главный вывод Netflix: ни один источник не рассказывает всю историю. Поэтому система строит три независимых графа и объединяет их по запросу.</p><h3>Сетевые потоки eBPF</h3><p>На сетевом уровне Netflix собирает потоки ядра через eBPF. Это даёт полноту: сюда попадают все соединения, независимо от того, инструментирован сервис или нет. Слой показывает связи между кластерами и приложениями такими, какими они есть на самом деле. Недостаток — не хватает прикладного контекста: видно, что сервис А достучался до IP-адреса сервиса Б, но неизвестно, какой конкретно endpoint вызывался.</p><h3>IPC-метрики</h3><p>На прикладном уровне собираются метрики межпроцессного взаимодействия. Когда сервис обращается к другому через gRPC, GraphQL или REST, он фиксирует endpoint, ошибки, задержки и протокол. Этот слой даёт детали, которых нет у сетевого: какой именно путь вызывается и с какой вероятностью ошибки. Ограничение очевидно: если сервис не отправляет метрики, его вызовов здесь не будет.</p><h3>Распределённые трейсы</h3><p>Третий слой — трейсинг запросов от начала до конца. Он показывает не «может ли сервис А позвонить сервису Б», а «звонил ли он в рамках этого конкретного пользовательского запроса». Это помогает увидеть поведение во время выполнения, ветвления, фича-флаги и редкие пути. Поскольку трейсы собирают выборочно, редкие сценарии могут не попасть в агрегированный вид.</p><p>Когда инженер запрашивает общую картину, система обходит все три графа параллельно и сливает результаты. Сеть обеспечивает полноту, IPC добавляет контекст, трейсы показывают реальное поведение. Каждый источник компенсирует слабости остальных.</p><h2>Как собирают Service Topology</h2><h3>Приём и обработка потоков</h3><p>За кулисами работает конвейер, который держит миллионы событий в секунду. Потоки сетевых логов читаются из Kafka в нескольких регионах AWS. Для обработки Netflix использует Apache Pekko Streams — форк Akka, который разбивает нагрузку по группам автомасштабирования и сам управляет обратным давлением.</p><h3>Восстановление прямых связей</h3><p>Сетевой лог показывает отдельные сетевые прыжки: например, приложение → балансировщик → приложение или приложение → NAT-шлюз → приложение. Чтобы получить настоящие связи, запускается трёхступенчатая агрегация. Первая стадия забирает сырые записи, вторая распознаёт посредников и восстанавливает прямые пути между приложениями, третья финализирует агрегаты и добавляет статус здоровья. Такой градуированный подход раскидывает нагрузку и не даёт горячим узлам уронить весь конвейер.</p><p>Готовая топология хранится в графовой базе Netflix — абстракции поверх распределённого хранилища «ключ — значение». Она заточена под быстрый обход графа в несколько хопов. Поверх базы — gRPC-API с фильтрами по уровню доступности и домену, постраничным выводом больших выборок и ответом менее чем за секунду.</p><h3>Хранение и API</h3><p>Отдельно стоит возможность «путешествия во времени». Система не хранит каждый момент отдельно, а накапливает данные в скользящих окнах. Это позволяет спросить «как выглядела топология вчера в полночь» без взрыва объёмов хранения.</p><h2>Что даёт инженерам</h2><p>Интерфейс и API дают инженерам несколько рабочих сценариев — от ручного расследования до автоматических проверок.</p><ul><li>Видеть upstream и downstream для любого сервиса с фильтрами по уровню доступности и домену.</li><li>Переключаться между единым видом и отдельными слоями: только сеть, только IPC или только трейсы.</li><li>Одним кликом переходить от узла топологии к логам, трейсам и детальным метрикам.</li><li>Оценивать зону поражения перед отключением сервиса на обслуживание и понимать, кого уведомлять.</li><li>Накладывать статус здоровья на граф и быстро понимать, локальная ли это проблема или каскадный сбой.</li><li>Обращаться к топологии программно — например, чтобы автоматически проверять классификацию доступности критичных сервисов.</li><li>Смотреть историю зависимостей и находить, что изменилось перед инцидентом.</li></ul><h2>Как перенести в свою систему</h2><p>Не каждая компания работает в масштабе Netflix, но логика подхода универсальна. Если у вас десятки сервисов, уже появляется эффект «тысячи кусочков пазла». Начать можно с малого: собрать список зависимостей из существующих источников и периодически сверять его с реальным трафиком.</p><p><b>Чек-лист для первых шагов:</b><br />1. Выберите один настоящий источник связей: логи балансировщика, агент на хосте или метрики вызовов.<br />2. Не пытайтесь сразу построить идеальную модель — начните с автоматически обнаруженных рёбер.<br />3. Добавьте контекст: владельца сервиса, уровень критичности и домен.<br />4. Сделайте карту доступной программно, а не только в интерфейсе — инцидент-боты и скрипты будут благодарны.<br />5. Проверяйте актуальность: в динамичной среде карты, устаревшие на несколько часов, быстро теряют ценность.</p><p>Для иллюстрации вот минимальный скрипт, который строит рёбра графа из логов балансировщика:</p><h2>Часто задаваемые вопросы</h2><h2>Выводы</h2><p>Service Topology — не просто красивая картинка для панели мониторинга. Это операционная основа, которая ускоряет расследования, снижает риск изменений и даёт автоматическим системам общую картину инфраструктуры. Netflix называет её knowledge graph foundation — фундаментом для интеллектуальной автоматизации, в том числе для автоматического поиска первопричины сбоев.</p><blockquote>Service topology provides the knowledge graph foundation that makes this kind of intelligent automation possible.</blockquote><p>Для российских команд, где инфраструктура тоже стремительно усложняется, главный урок в другом: не ждите идеальной полноты данных. Начните с одного реального источника, добавьте контекст, сделайте карту программно доступной — и она начнёт приносить пользу раньше, чем вы построите «полноценную» систему.</p><h2>Источники</h2><ul><li><a href="https://medium.com/netflix-techblog/from-silos-to-service-topology-why-netflix-built-a-real-time-service-map-0165ba13a7bc">From Silos to Service Topology: Why Netflix Built a Real-Time Service Map</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft перепишет весь свой C и C++ код на Rust уже к 2030 году</title>
      <link>https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu</link>
      <comments>https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu</guid>
      <description><![CDATA[<p>Microsoft планирует полностью отказаться от C и C++ и переписать ключевые компоненты Windows на Rust к 2030 году, используя ИИ для массового рефакторинга кода</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu">Microsoft перепишет весь свой C и C++ код на Rust уже к 2030 году</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Dec 2025 03:45:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft намерена полностью отказаться от C и C++ к концу десятилетия. Об этом заявил один из разработчиков компании Галент Хант в <a href="https://www.linkedin.com/posts/galenh_principal-software-engineer-coreai-microsoft-activity-7407863239289729024-WTzf/">публикации</a> на LinkedIn.</p><p>Его формулировка предельно прямолинейна: цель — <b>убрать каждую строку C и C++ к 2030 году и заменить их кодом на Rust</b>.</p><p>Microsoft собирается переписать крупнейшие и самые критичные системы. В том числе компоненты Windows и прочие низкоуровневые продукты.</p><h2>Ставка на ИИ и автоматическую переработку кода</h2><p>Ключевым инструментом в этом процессе станет ИИ. По словам Ханта, Microsoft уже выстроила инфраструктуру, которая <b>объединяет алгоритмы анализа кода и ИИ-агентов</b>.</p><p>Система строит графы зависимостей на уровне миллионов строк исходников, после чего ИИ применяет изменения автоматически и в промышленных масштабах.</p><p>Внутренняя цель проекта звучит амбициозно: <b>«1 инженер, 1 месяц, 1 миллион строк кода»</b>. По утверждению Microsoft, базовая часть этой инфраструктуры уже работает — как минимум для задач на понимание и анализа кода.</p><h2>Почему именно Rust</h2><p>Переход на Rust не стал сюрпризом. Еще в 2023 году Microsoft объявила, что <b>новые компоненты ядра Windows больше нельзя писать на C и C++</b>. Тогда же Марк Русинович, CTO Azure, прямо заявил: компания «полностью делает ставку на Rust».</p><p>Причина банальна — Rust обеспечивает безопасность памяти по умолчанию. Для Microsoft, которая десятилетиями сталкивается с уязвимостями классов use-after-free и buffer overflow, это банально стратегический выбор.</p><h2>Кто будет переписывать код Microsoft</h2><p>Хант уже ищет Principal Software Engineer, который поможет развивать инфраструктуру автоматического перевода C и C++ в Rust.</p><p>Кандидат должен иметь серьезный опыт системного программирования на Rust, а также быть готовым разбираться в компиляторах, операционных системах и низкоуровневой архитектуре.</p><p>Команда входит в группу Future of Scalable Software Engineering внутри Microsoft CoreAI. Ее задача — не только переписать код компании, но и создать инструменты, которые позволят устранять технический долг «в промышленных масштабах».</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие приложения установить на Windows и macOS</title>
      <link>https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos</link>
      <comments>https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos</guid>
      <description><![CDATA[<p>Список разбит по категориям: от браузеров и гейминга до утилит безопасности и инструментов для продуктивности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos">Какие приложения установить на Windows и macOS</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Slack]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Windows 10]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Управление проектами]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Xbox]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Firefox]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[Avast]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Epic Games]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Safari]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[PlayStation]]></category>
      <category><![CDATA[Microsoft Edge]]></category>
      <category><![CDATA[Discord]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[RPA]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Steam]]></category>
      <category><![CDATA[GPU]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[iPhone]]></category>
      <category><![CDATA[MacBook]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Итак, вы только что настроили новый компьютер. Операционная система установлена, драйверы обновлены, и теперь пора заняться самым интересным — установкой программ. Но с чего начать? Какие приложения действительно необходимы, а какие просто занимают место?</p><p>Редакция Tproger сделала и адаптировала <a href="https://www.techspot.com/article/2974-desktop-software-essentials/">перевод подборки  программ для Windows и macOS</a>. Здесь вы найдёте проверенные временем решения для работы, развлечений и повседневных задач. Мы сосредоточились на бесплатных и условно-бесплатных приложениях с отличной репутацией, которые решают реальные задачи без навязывания ненужных функций.</p><p>Список разбит по категориям: от браузеров и гейминга до утилит безопасности и инструментов для продуктивности.</p><p>Неважно, опытный вы пользователь или новичок — здесь найдётся что-то полезное для каждого.</p><h2>Браузеры</h2><p>Браузер — это, пожалуй, самое важное приложение на вашем компьютере. Именно через него проходит большая часть вашей цифровой жизни: работа, развлечения, коммуникации. Выбор браузера влияет не только на скорость загрузки страниц, но и на конфиденциальность, безопасность и удобство работы.</p><ul><li><b>Большинство пользователей:</b> Chrome, Edge или Safari</li><li><b>Защита приватности: </b>Firefox, Brave, Ungoogled Chromium</li><li><b>Опытные пользователи:</b> Vivaldi</li><li><b>Максимальная анонимность: </b>Tor Browser</li></ul><h3>Google Chrome</h3><p>Chrome остаётся самым популярным браузером в мире — и не просто так. Он быстрый, стабильный и отлично интегрируется с экосистемой Google. Огромная библиотека расширений из Chrome Web Store позволяет настроить браузер под любые задачи. Синхронизация между устройствами работает безупречно: вкладки, пароли, закладки и история всегда под рукой.</p><p>Минус один, но существенный: Chrome прожорлив. Если у вас открыто больше десятка вкладок, он может съесть несколько гигабайт оперативной памяти. На компьютерах с 8 ГБ RAM и меньше это становится проблемой.</p><h3>Mozilla Firefox</h3><p>Firefox — это выбор тех, кто ценит приватность и открытость. Mozilla не зарабатывает на продаже ваших данных, а сам браузер активно развивается сообществом. Встроенные инструменты защиты от трекинга работают из коробки, блокируя рекламные сети и скрипты слежения.</p><p>По скорости Firefox не уступает Chrome, а по потреблению памяти даже выигрывает. Библиотека расширений чуть меньше, чем у Chrome, но все основные инструменты доступны.</p><h3>Microsoft Edge</h3><p>Edge построен на том же движке Chromium, что и Chrome, но при этом лучше оптимизирован для Windows. Microsoft вложилась в производительность: браузер работает быстро, потребляет меньше ресурсов и отлично интегрируется с системой.</p><p>Особенно приятны функции вроде Collections (коллекции вкладок для организации исследований), режим чтения и встроенный скриншотер. Edge поддерживает все расширения Chrome, так что переход безболезненный.</p><h3>Brave</h3><p>Brave — это Chrome на стероидах приватности. Браузер блокирует рекламу и трекеры по умолчанию, что делает сёрфинг быстрее и безопаснее. При этом он полностью совместим с расширениями Chrome.</p><p>Есть интересная фишка: Brave Rewards позволяет зарабатывать криптовалюту за просмотр приватной рекламы (если захотите её включить). Спорная механика, но как опция — почему нет. Для тех, кто хочет Chrome без Google и с упором на приватность, Brave — отличный выбор.</p><h3>Safari (только macOS)</h3><p>Если у вас Mac, Safari заслуживает внимания. Это самый энергоэффективный браузер для macOS: на MacBook он даёт ощутимо больше автономности по сравнению с Chrome или Firefox. Интеграция с экосистемой Apple безупречна: Handoff, синхронизация через iCloud, Reading List, автозаполнение паролей.</p><p>Safari быстрый, безопасный и не перегружен функциями. Единственный минус — библиотека расширений заметно скромнее, чем у конкурентов. Но для большинства задач базового функционала хватает.</p><h3>Ungoogled Chromium</h3><p>Для ультраосторожных Ungoogled Chromium удаляет всё отслеживание и сервисы Google — но вам придётся настраивать всё самостоятельно, так как в нём нет автообновлений или встроенной синхронизации.</p><p>Для максимально осторожных пользователей — это Chrome, из которого убрали всю телеметрию Google, отслеживание и облачные сервисы. Браузер работает, но требует ручной настройки: отсутствуют автоматические обновления и встроенная синхронизация между устройствами.</p><h3>Tor Browser</h3><p>Выводя приватность на следующий уровень, Tor Browser маршрутизирует ваш трафик через сеть Tor, анонимизируя ваш IP и многократно шифруя соединение. Он медленнее по задумке, но идеален, если ваш приоритет — максимальная анонимность, а не скорость или удобство.</p><h3>Vivaldi</h3><p>Vivaldi — браузер мечты для тех, кто хочет полного контроля. Стекирование вкладок, тайлинг, кастомные горячие клавиши, встроенная почта и календарь, веб-панели — это полноценный десктопный опыт внутри браузера. Хотите боковую панель браузера, открывающую ваши заметки, RSS-ленты или любой нужный сайт? Vivaldi это умеет.</p><h3>Arc</h3><p>Наконец, Arc — когда-то новичок на рынке браузеров, нацеленный на переосмысление UX: замена традиционной панели вкладок на боковую панель, акцент на веб-приложениях, интегрированные разделённые виды и easels для заметок и доски. К сожалению, компания за Arc прекратила разработку, чтобы полностью переключиться на ИИ с новым браузером, который сейчас в закрытой бета-версии.</p><h2>Управление паролями</h2><ul><li><b>Лучший бесплатный выбор:</b> Bitwarden</li><li><b>Также отлично:</b> 1Password, Dashlane, KeePass</li></ul><p>Миллионы людей продолжают использовать одни и те же слабые пароли на всех сайтах — или, что ещё хуже, держатся за классику вроде «123456». Даже сильные пароли мало помогают, если их повторяют или забывают. Конечно, большинство браузеров предлагают встроенные менеджеры паролей, но они ограничены, привязаны к одному браузеру и менее безопасны, чем специализированные решения.</p><p>Также не будем забывать о passkeys (ключах доступа). Если говорить практически, можно сказать, что passkeys объединяют концепцию пароля и двухфакторной аутентификации (2FA) в одно плавное действие, но гораздо безопаснее и гораздо менее раздражающе.</p><h3>Bitwarden</h3><p>Полностью опенсорсный, зашифрованный и щедрый даже в бесплатной версии. Вы получаете неограниченное количество паролей, синхронизацию между устройствами и приложения для всех платформ. Премиум ($10/год) добавляет безопасный обмен файлами и инструменты 2FA. Также есть доступные семейные и командные планы.</p><h3>1Password</h3><p>Премиум-решение с отполированным интерфейсом, сильной кроссплатформенной поддержкой и отличными функциями вроде Travel Mode (режим путешествий) и полной интеграцией passkeys.</p><h3>Dashlane</h3><p>Предлагает мониторинг даркнета, интеграцию VPN и плавный пользовательский опыт. Есть бесплатный тариф с ограниченными функциями, но премиум-версия конкурентоспособна.</p><h3>KeePassXC</h3><p>Отличная оффлайн-альтернатива, если хотите полного контроля и не против ручной синхронизации (или использования чего-то вроде Syncthing или Dropbox для синхронизации базы данных).</p><p>Пропустите LastPass — когда-то фаворит, он упал в немилость после повторных утечек безопасности. Для душевного спокойствия лучше поискать в другом месте.</p><h2>Продвинутые утилиты и дополнения к ОС</h2><ul><li><b>Поиск + лаунчеры:</b> Everything или Wox (Windows), Alfred или Raycast (macOS)</li><li><b>Пакетные менеджеры: </b>WinGet, Homebrew (macOS)</li><li><b>Для пользователей Windows:</b> PowerToys</li><li><b>Для пользователей Mac: </b>Rectangle</li><li><b>История буфера обмена: </b>ClipClip, Flycut (macOS)</li><li><b>Скриншоты + аннотации: </b>Monosnap</li></ul><h3>Winget</h3><p><b></b>Официальный менеджер пакетов Microsoft, встроенный в Windows 10 и 11. Работает похоже на Chocolatey, но разработан и поддерживается Microsoft. Homebrew — самый популярный менеджер пакетов для macOS. Позволяет быстро устанавливать, обновлять и управлять приложениями и CLI-инструментами с помощью команд в терминале.</p><h3>Everything</h3><p>Что касается поиска, Everything остаётся золотым стандартом сверхбыстрого поиска по именам файлов в Windows. Он индексирует диски за секунды и выдаёт почти мгновенные результаты с минимальной нагрузкой на систему. Если нужен функционал шире базового поиска, Wox использует движок Everything и добавляет мощные возможности лаунчера: поиск файлов, запуск приложений, калькулятор, перевод текста и расширения через плагины. Получается более гибкий опыт в духе Spotlight для Windows.</p><h3>Command Palette/Alfred/Raycast</h3><p>В который раз Microsoft не смогла существенно улучшить встроенный поиск Windows, хотя <b>Command Palette</b> в PowerToys даёт неплохой компромисс для тех, кто не хочет ставить сторонние утилиты.</p><p>На macOS <b>Alfred</b> по-прежнему главный лаунчер и утилита поиска. Он быстрый, интуитивный и в бесплатной версии включает историю буфера и настраиваемые поиски; расширенная автоматизация и «воркфлоу» доступны в Powerpack.</p><p>Тем, кто хочет современную облачно-интегрированную альтернативу с готовыми расширениями и встроенной поддержкой Notion, GitHub и Slack, стоит присмотреться к <b>Raycast</b> — это стильный, дружественный к разработчикам вариант, который стремительно набирает популярность.</p><h3>Менеджеры буфера обмена</h3><p>Они позволяют возвращаться к ранее скопированному — тексту, изображениям, ссылкам — и сильно ускоряют рутинные операции.</p><p>В Windows встроенная история буфера (Win + V) кое-как выручает, но продвинутым пользователям обычно хочется большего. В числе бесплатных рекомендаций — <b>ClipClip</b> для Windows и <b>Flycut</b> для macOS.</p><p>Когда речь о скриншотах и аннотациях, штатные инструменты macOS и Windows заметно выросли. Но многим всё равно удобнее сторонние решения. Нам по-прежнему нравится <b>Monosnap</b> за простоту и возможность мгновенно заливать снимки в облако для шаринга (и это бесплатно).</p><p><b>PowerToys</b> — набор полезных утилит от Microsoft для продвинутых пользователей Windows, повышающих продуктивность и упрощающих рабочие процессы. Среди инструментов: FancyZones для продвинутого раскладывания окон, PowerRename для пакетного переименования, Keyboard Manager для ремапинга клавиш, универсальный color picker и другие.</p><p><b>Rectangle</b> и <b>Magnet </b>— два самых популярных приложения на macOS для закрепления окон: быстрые выравнивание и ресайз по хоткеям или перетаскиванием, примерно как по умолчанию в Windows. Пользователям, пришедшим с Windows и скучающим по системному снапингу, одно из них жизненно необходимо.</p><p>Широко используемая альтернатива в Windows — <b>FancyZones</b> (часть PowerToys), предлагающая продвинутое управление окнами: настраиваемые сетки, зоны привязки и поддержку нескольких мониторов — поэтому это фаворит пауэр-пользователей на Windows.</p><h2>Для рутины и создания проектов</h2><ul><li><b>Бесплатные инструменты: </b>FreeOffice, LibreOffice и WPS Office</li><li>Microsoft Office за единовременную плату $49, Office 2024 — $129</li><li><b>Заметки: </b>Notion, OneNote, Obsidian</li><li><b>Бесплатный PDF-редактор: </b>PDFsam</li><li><b>Почтовые клиенты:</b> Thunderbird, eM Client</li></ul><p>Независимо от того, пишете ли вы тексты, планируете проект, кодите или наводите порядок в цифровой жизни, правильные инструменты решают многое. Сегодня выбор топовых приложений для продуктивности и разработки — часто бесплатных — лучше, чем когда-либо.</p><p><b>Microsoft Office</b> остаётся отраслевым стандартом для профессиональной продуктивности. Подписка Microsoft 365 открывает доступ к Word, Excel, PowerPoint, Outlook и включает 1 ТБ облачного хранилища.</p><p>Среди бесплатных альтернатив LibreOffice — мощный open-source комплект с сильным сообществом (хотя интерфейс некоторым кажется старомодным). Если нужна внешне более майкрософтовская альтернатива, попробуйте<b> FreeOffice </b>или <b>WPS Office Free</b> — у них хорошая совместимость.</p><p>На macOS <b>Pages</b>, <b>Numbers</b> и <b>Keynote</b> предустановлены и более чем достаточны для большинства задач, особенно если вы в экосистеме Apple.</p><h3>Знания и ведение заметок</h3><p><b>Notion</b> стал универсальной платформой организации: заметки, базы данных, to-do, управление проектами, создания совместных рабочих пространств. Если нужны более локальные заметки с синхронизацией между устройствами и поддержкой Markdown, <b>Obsidian</b> — любимец студентов и исследователей.</p><p>Для быстрых кроссплатформенных заметок <b>OneNote</b> — крепкий бесплатный вариант от Microsoft. В качестве альтернатив — <b>Simplenote</b> или open-source <b>Joplin</b>.</p><p>Если вы занимаетесь академической работой и научными статьями, <b>Zotero</b> — отличный open-source менеджер источников с интеграцией в браузер и совместными коллекциями. <b>Milanote</b> предлагает визуальный подход к заметкам и планированию — идеально для креативных пользователей.</p><h3>Работа с PDF</h3><p>Хотя Adobe Acrobat остаётся премиальным редактором PDF, бесплатные альтернативы вроде <b>PDFsam</b> позволяют без усилий объединять, разбивать, редактировать и поворачивать страницы.</p><h2>Инструменты для дизайна и создания контента</h2><p>Для дизайна два выделяющихся приложения хорошо дополняют набор продуктивности. <b>Figma Desktop</b> — совместная платформа интерфейс-дизайна, широко используемая UI/UX-дизайнерами и фронтенд-разработчиками. Десктоп-версия работает быстрее, чем браузер, и лучше интегрируется с ОС — это удобно для сложных дизайн-систем и коллаборации в реальном времени.</p><p><b>Canva</b> с интуитивным drag-and-drop превосходно чувствует себя и как десктоп-приложение. Отлично подходит для быстрых графических материалов для соцсетей, маркетинга, постеров и презентаций. Благодаря тысячам шаблонов и совместной работе это фаворит как у профи, так и у новичков.</p><h2>Почтовые клиенты</h2><p>Если вы предпочитаете отдельный почтовый клиент, у <b>eM Client</b> много функций, бесплатный — до двух аккаунтов. <b>Mozilla</b> <b>Thunderbird</b> — мощная open-source альтернатива с удобной настраиваемостью, а <b>Mailbird</b> — вариант с упором на продуктивность для тех, кого не пугает подписка.</p><h2>Инструменты разработчика</h2><ul><li><b>Редакторы кода и текста:</b> VS Code, Cursor, Sublime Text</li><li><b>Система контроля версий:</b> SourceTree, GitHub Desktop</li><li><b>Контейнеры: </b>Docker</li><li><b>Локальные LLM: </b>Ollama</li><li><b>SFTP, загрузка файлов:</b> WinSCP, Forklift</li></ul><p>Для разработчиков <b>Visual Studio Code</b> — безусловный вариант. Бесплатный, лёгкий, но мощный, кроссплатформенный — тысячи расширений покрывают практически любой язык, фреймворк или инструмент. Набирающая популярность альтернатива — <b>Cursor</b>, редактор на базе VS Code с усиленной AI-помощью. Он подходит для связки с LLM: даёт inline-подсказки, генерирует код, рефакторит и позволяет редактировать кодовую базу.</p><p>При этом<b> Sublime Text </b>остаётся для скорости и простоты, а <b>Notepad++</b> — отличный лёгкий редактор для быстрых правок в Windows.</p><p>Для Git графические клиенты <b>SourceTree</b> и <b>SmartGit</b> дают понятный интерфейс для управления репозиториями на GitHub, GitLab и не только. <b>GitHub Desktop</b> раньше был простоват и не слишком хорош, но сейчас существенно прибавил — всё ещё простой для работы, но в хорошем смысле.</p><p>Для локальных окружений, API-тестирования или терминального воркфлоу инструментов — пруд пруди. Например, <b>Docker Desktop</b> стал стандартом для тех, кто собирает и запускает контейнеризированные приложения на разных платформах. Он упрощает настройку окружений и держит систему чистой.</p><p><b>Ollama</b> позволяет запускать большие языковые модели (LLM) локально с минимальной настройкой. Поддерживает модели вроде LLaMA, Mistral и другие open-weight альтернативы GPT, так что можно работать с ИИ прямо на своём компьютере без отправки данных в облако.</p><p>Если вы работаете с облачными хранилищами или SFTP, WinSCP (Windows) и ForkLift (macOS) — отличные клиенты с двухпанельным управлением файлами, синхронизацией и автоматизацией. На Mac также популярны <b>Commander One</b> и <b>Transmit</b> — у них есть встроенные подключения к удалённым и облачным путям.</p><h3>Безопасность</h3><p>И Windows, и macOS сегодня предлагают более чем достойную встроенную защиту. С защитой в реальном времени, интеграцией с файерволом и биометрией вроде <b>Windows Hello</b> и <b>Touch ID</b>. Для обычных пользователей, которые соблюдают гигиену безопасности: не скачивают сомнительное ПО, используют менеджеры паролей и включают 2FA — встроенной защиты часто хватает.</p><p>Для продвинутых пользователей есть дополнительные варианты.</p><p>Отличное первое дополнение — <b>Malwarebytes</b>. Это давний фаворит в обнаружении и удалении malware, adware и руткитов; бесплатная версия по-прежнему хороша для ручных сканов. В платной — защита в реальном времени без ощутимой просадки производительности.</p><p>Если не хочется ставить традиционный антивирус, есть достойные альтернативы. <b>Emsisoft Emergency Kit</b> — мощный портативный сканер, который можно запускать с флешки: идеально для редких глубоких сканов или лечения заражённых систем без установки чего-либо. Просто подключаете, когда нужно.</p><p>Ещё один отличный инструмент — <b>VirusTotal</b>: бесплатный веб-сервис, который проверяет файлы и URL через десятки антивирусных движков. Прежде чем открывать подозрительную загрузку, можно залить файл на VirusTotal.com или использовать их расширение для браузера, чтобы проверять ссылки в реальном времени. Быстро, просто и удобно для осторожных пользователей.</p><p>Мы не поклонники установки антивирусов на каждый компьютер и не полностью в курсе, какие сейчас показывают лучшие результаты. Тем не менее, <b>AV-Tes</b>t давно и регулярно оценивает популярные решения, поэтому советуем смотреть их свежие отчёты. В текущем списке высокооценённых — <b>Avast, BitDefender, ESET </b>и другие; многие из них предлагают бесплатные версии для пробы.</p><h3>Удалённый доступ и вспомогательные утилиты</h3><p><b>RustDesk</b> стал современным, ориентированным на приватность аналогом <b>TeamViewer</b>. Он с открытым исходным кодом, быстрый и работает кроссплатформенно.</p><p>Тем, кому нужны более устоявшиеся коммерческие решения, подойдёт <b>AnyDesk</b>, который остаётся лёгким и надёжным вариантом для личного и командного использования.</p><p>Превращение смартфона в пульт дистанционного управления компьютером бывает невероятно удобно — будь то презентации, потоковое видео или просто навигация с дивана.</p><p><b>Remote Mouse</b> — простой и эффективный способ эмулировать мышь и клавиатуру с телефона. Для более продвинутых сценариев можно использовать приложения вроде <b>Unified Remote.</b></p><h2>Редактирование изображений и видео</h2><ul><li><b>Профессиональный видеомонтаж:</b> DaVinci Resolve</li><li><b>Простой видеомонтаж: </b>CapCut</li><li><b>Редакторы изображений:</b> GIMP, PhotoDemon, Pixelmator Pro</li><li><b>Бесплатное улучшение изображений:</b> Upscayl</li><li><b>RAW-редактирование:</b> RawTherapee</li><li><b>Видеоконвертация:</b> HandBrake</li></ul><p>Если вам нужен бесплатный инструмент для редактирования изображений, <b>GIMP</b> — один из самых мощных вариантов. Он предоставляет профессиональные возможности, такие как слои, маски и настраиваемые плагины, что делает его идеальным для продвинутых пользователей. Если вы ищете более лёгкий редактор с чистым интерфейсом, стоит обратить внимание на <b>PhotoDemon</b>. Он работает как портативное приложение на Windows, поддерживает слои и редактирование — отличный выбор для быстрых правок или ретуши.</p><p>Если вы хотите увеличивать разрешение изображений без потери качества, <b>Upscayl</b> — мощный и бесплатный инструмент для апскейла. Он кроссплатформенный, и по нашим тестам показывает результаты на уровне платных решений вроде Topaz.</p><p>Для векторной графики — логотипы, иллюстрации — <b>Inkscape</b> является достойным open-source вариантом с полной поддержкой редактирования SVG. <b>Krita</b> — ещё один отличный бесплатный инструмент, особенно подходящий для цифровой живописи и художественного творчества.</p><p>Для редактирования RAW-фотографий, <b>Darktable</b> и <b>RawTherapee</b> — два высококлассных open-source аналога Adobe Lightroom. Их широко используют фотографы, которым нужна работа с изображениями без подписки.</p><p>Для простых GIF-анимаций <b>ScreenToGif</b> — удобная утилита, мгновенно записывающая область экрана и экспортирующая в GIF или другие форматы с оверлеями.</p><p>Среди платных фоторедакторов <b>Adobe Photoshop</b> остаётся лидером, но для macOS есть <b>Pixelmator Pro</b> — мощное приложение с разовой оплатой, а <b>Affinity Photo</b> предлагает профессиональные возможности по более доступной цене.</p><h3>Видеомонтаж и конвертация</h3><p><b>DaVinci Resolve</b> считается лучшим бесплатным профессиональным ПО. Его используют и энтузиасты, и профессионалы — от простого тримминга до цветокоррекции и сложного постпродакшена.</p><p><b>Shotcut</b> и <b>Kdenlive</b> — тоже сильные бесплатные варианты, предлагают более простой фукнционал с хорошим набором функций для новичков и продвинутых пользователей. <b>CapCut</b>, изначально мобильное приложение, теперь доступен на десктопе — идеально подходит для быстрых монтажей и роликов для соцсетей.</p><p>Для пользователей macOS <b>iMovie </b>предустановлен и остаётся надёжным вариантом для базовых видео. Если вам нужно просто конвертировать или сжимать видео в современные форматы, <b>HandBrake</b> — проверенное бесплатное решение с поддержкой и вариацией входных и выходных форматов.</p><p>Тем, кто ищет топовый профессиональный монтаж, подойдут <b>Adobe Premiere Pro</b> и<b> Final Cut Pro</b>, но там есть дорогая подписка и более высокий порог входа.</p><h2>Коммуникации и совместная работа</h2><ul><li><b>Для повседневной связи: </b>WhatsApp, Messenger и Zoom, если у вас нет FaceTime</li><li><b>Для приватности: </b>Signal</li><li><b>Для работы:</b> Slack, Teams</li><li><b>Для игр и общения: </b>Discord</li></ul><p>Выбор коммуникационных и мессенджерных приложений в первую очередь зависит от того, с кем вы общаетесь — с семьёй, друзьями, коллегами или игровым сообществом. Вот актуальная картина:</p><p>Для личной переписки <b>WhatsApp</b> и <b>Facebook Messenger</b> остаются самыми массовыми платформами по всему миру. У них есть десктопные клиенты и встроенное сквозное шифрование по умолчанию. <b>Telegram</b> также крайне популярен благодаря синхронизации между устройствами и поддержке крупных чатов. Пользователи Apple продолжают активно использовать <b>iMessage</b> для приватного, шифрованного общения в экосистеме Apple.</p><p>Из видеоконференций <b>Zoom</b> остаётся одним из лидеров для групповых звонков и онлайн-ивентов, предлагая локальные записи, демонстрацию экрана и комнаты (breakout rooms). Однако бесплатный тариф ограничивает 1:1 звонки 40 минутами, если не перейти на платный план. Zoom поддерживает сквозное шифрование, но при включении E2EE отключаются некоторые функции вроде облачной записи и комнат.</p><p><b>Google Meet</b> — отличный браузерный аналог без необходимости установки, который заметно улучшился по качеству и удобству использования. Многие компании применяют Meet в ежедневной работе и гибридных форматах. Если ваша организация использует Microsoft 365, скорее всего, вы работаете в <b>Microsoft Teams</b>, который уже заменил Skype на корпоративном уровне. Teams поддерживает большие созвоны, обмен файлами и глубоко интегрирован с Office. Сквозное шифрование доступно, но только для 1:1 звонков.</p><p><b>FaceTime</b> по-прежнему отличный для пользователей Apple, и благодаря новым обновлениям к звонку теперь могут присоединяться и пользователи Android/Windows по ссылке через браузер.</p><p>Когда приватность критична, <b>Signal</b> — один из лучших вариантов. Разработан некоммерческой организацией, бесплатен, open-source, без рекламы, использует надёжное сквозное шифрование для сообщений и звонков.</p><p>Для рабочих коммуникаций<b> Slack</b> и <b>Teams</b> продолжают использоваться в бизнес-среде. Бесплатный тариф Slack ограничивает историю 90 днями и звонки, но остаётся любимцем стартапов и малых команд благодаря интеграциям и ботам. <b>Cisco Webex</b> — также крепкий вариант, особенно популярен в корпоративной среде.</p><p>Если вы работаете с креативными командами, сообществами или геймерами, <b>Discord</b> стал явным лидером. Изначально созданный для игр, он превратился в полноценную коллаборативную платформу с текстом, голосом и видео, стримингом экрана и ботами для автоматизации. Многие комьюнити — и даже IT-компании — используют Discord как основной рабочий инструмент.</p><p>Для внутриигрового голосового чата <b>TeamSpeak </b>остаётся олдскульным достойным вариантом: можно использовать анонимно и получать полный контроль над сервером. Встроенный чат Steam лучше, чем раньше, и помогает в игровой координации, но большинство всё же выбирает Discord.</p><h2>Гейминг, моддинг и стриминг</h2><ul><li><b>Игровые платформы: </b>Steam, Epic Games, EA App, Ubisoft, GOG</li><li><b>Последние драйверы для GPU:</b> Nvidia GeForce, AMD Radeon, Intel Arc</li><li><b>Стриминг:</b> OBS Studio</li></ul><p><b>Steam</b> остаётся центром PC-игр. Это не только магазин, но и социальная платформа, лаунчер и площадка с модами, облачными сохранениями и встроенным стримингом. Регулярные распродажи, поддержка контроллеров и сообщества делают его обязательным для любого PC-геймера.</p><p>Не менее важно установить Epic <b>Games Store</b>. Хотя библиотека меньше, он регулярно раздаёт бесплатные игры, доступные любому с аккаунтом Epic. Это также must-have, если вы играете в Fortnite.</p><p>Помните: не все издатели размещают игры на Steam или Epic. Для тайтлов EA понадобится <b>EA App (ранее Origin)</b>, для Ubisoft — <b>Ubisoft Connect</b>, для Blizzard/Activision — <b>Battle.net</b>, а GOG Galaxy не только предлагает DRM-free классику, но и может агрегировать игры из других лаунчеров.</p><p>Некоторые сверхпопулярные игры распространяются отдельно: Minecraft (через Minecraft.net или Microsoft Store), Roblox, League of Legends и Valorant (через лаунчер Riot Games). Если вы новичок и ищете что-то лёгкое, можно начать с free-to-play тайтлов или классики вроде <b>Brutal Chess</b> или <b>GZDoom</b>.</p><p>Если вы играете с геймпадом, Windows поддерживает Xbox-контроллеры из коробки. PlayStation-контроллеры теперь тоже отлично работают: Steam через <b>Steam Input </b>поддерживает DualShock 4 и DualSense практически во всех играх. При необходимости глубокой кастомизации можно использовать DS4Windows, но большинству хватает возможностей Steam.</p><p>Если вас интересует моддинг, хороший менеджер модов время в этой жизни:</p><ul><li><b>Mod Organizer 2</b> — лучший для RPG Bethesda (Skyrim, Fallout).</li><li><b>Vortex (от Nexus Mods)</b> — дружелюбный к новичкам и поддерживает широкий перечень игр.</li></ul><p>Для записи геймплея или стриминга <b>Nvidia ShadowPlay</b> и <b>AMD Radeon ReLive</b> подходят для простых задач. Но для стриминга с вебкой, сценами, оверлеями или многосценовым продакшеном <b>OBS Studio</b> — безальтернативный лидер. Он бесплатный, open-source и подходит как новичкам, так и про-стримерам (Twitch, YouTube, Kick и т.д.). <b>SignalRGB</b> помогает синхронизировать весь RGB-зоопарк и задавать динамические эффекты.</p><h2>Мониторинг железа и разгон</h2><ul><li><b>Мониторинг: </b>CPU-Z, HWMonitor, HWiNFO64</li><li><b>Настройка и разгон:</b> Afterburner, FanControl, ThrottleStop, SignalRGB</li></ul><p>Одно из первых дел, которое стоит сделать после сборки ПК — убедиться, что компоненты соответствуют ожиданиям и работают корректно. К счастью, существует много инструментов, позволяющих мониторить, тестировать и настраивать железо.</p><p>Начать стоит с <b>CPU-Z</b> — классического бесплатного инструмента, показывающего информацию о CPU, материнской плате, оперативной памяти и других компонентах. Он также умеет запускать простой стресс-тест и бенчмарк для проверки стабильности.</p><p>Для более широкого мониторинга <b>HWMonitor</b> показывает температуры, напряжения и скорости вентиляторов в реальном времени. Если нужно ещё глубже и с более гибким интерфейсом — <b>HWiNFO64</b> считается одним из лучших: поддерживает логирование датчиков и интеграцию с оверлеями (например, RTSS или Rainmeter).</p><p>Чтобы проверить хранилище, <b>CrystalDiskMark</b> измеряет скорость чтения/записи SSD и HDD — это помогает понять, соответствует ли диск заявленным характеристикам. Глубже оценить здоровье накопителя можно в <b>Hard Disk Sentinel</b>, который анализирует SMART-данные, оценивает срок службы и предлагает ограниченный ремонт.</p><p>С точки зрения охлаждения, всё больше геймеров используют утилиты для настройки вентиляторов. <b>FanControl</b> — актуальный бесплатный фаворит: поддерживает сложные кривые оборотов, привязку к датчикам, и совместим с большинством современных материнских плат. На Mac одной из лучших утилит остаётся<b> Macs Fan Control.</b></p><p>Для настройки видеокарт долгое время стандартом был <b>MSI Afterburner</b> — для разгона, настройки вентиляторов и мониторинга с RTSS-оверлеем. Однако из-за замедления обновлений многие сегодня используют встроенные утилиты от <b>Nvidia (GeForce Experience/Control Panel)</b> и <b>AMD (Adrenalin Software)</b>.</p><p>Если вы меняете видеокарту или подозреваете проблемы с драйверами, обязательно используйте <b>Display Driver Uninstaller</b> (DDU) — он полностью очищает систему от старых драйверов перед переустановкой.</p><p>Если вы играете на ноутбуке или хотите снизить нагрев и повысить автономность, <b>ThrottleStop</b> остаётся одним из лучших инструментов для андервольта CPU и настройки энергопрофилей.</p><p>Тем, кто серьёзно подошёл к разгону CPU и GPU, пригодятся фирменные инструменты вроде <b>Intel XTU (для Intel) и AMD Ryzen Master</b> — они дают контроль над частотами, напряжениями и лимитами мощности.</p><h2>Управление файлами</h2><ul><li><b>Поиск больших файлов:</b> SpaceSniffer, WizTree, Disk Drill (macOS)</li><li><b>Поиск дубликатов: </b>dupeGuru</li><li><b>Архивы и ZIP: </b>PeaZip, The Unarchiver</li><li><b>Очистка: </b>BCUninstaller, CCleaner Portable, AppCleaner (macOS)</li></ul><p>Чтобы грамотно управлять файлами и освобождать место, нужно понимать, что именно занимает пространство. На Windows популярны <b>WinDirStat и WizTree </b>— быстрые бесплатные инструменты для визуализации диска. <b>SpaceSniffer</b> предоставляет динамическую схему.</p><p>На macOS — <b>GrandPerspective и Disk Drill </b>предлагают аналогичный функционал, а <b>DaisyDisk</b> — один из самых красивых платных вариантов с молниеносным сканированием.</p><p>Если дубликаты засоряют диск, <b>dupeGuru</b> (open-source) отлично справляется с поиском повторяющихся изображений и музыки, даже слегка изменённых.</p><p>Для пакетного переименования файлов (например, фоточек с камеры) существует гибкий <b>Bulk Rename Utility</b>. Если нужно что-то попроще: <b>PowerRename</b> из PowerToys (Windows) или встроенный инструмент в <b>Finder</b> (macOS) подходят большинству.</p><p>Встроенный <b>File Explorer</b> в Windows недавно получил вкладки и стал удобнее, но <b>Files</b> (open-source) — современная альтернатива с улучшенным UX. Кто-то ещё пользуется <b>Total Commander</b> или <b>Directory Opus</b>, благодаря расширяемости и скриптам, хотя новичкам они кажутся устаревшими. Для просмотра изображений по-прежнему незаменим <b>IrfanView</b>.</p><p>Для работы с архивами, если не устраивает встроенный ZIP-менеджер Windows, скачайте <b>7-Zip</b> или <b>PeaZip</b>. На Mac лучшим бесплатным инструментом остаётся <b>The Unarchiver</b>.</p><p>Для очистки системы важно выбирать надёжные утилиты. На Windows, <b>BCUninstaller (Bulk Crap Uninstaller)</b> — один из самых проверенных для удаления программ и их хвостов. <b>BleachBit</b> и <b>Wise Disk Cleaner</b> — безопасные альтернативы <b>CCleaner</b> (лучше использовать Portable-версию, так как стационарная испортила репутацию). На Mac <b>AppCleaner</b> всё ещё любим за полное удаление приложений без мусора.</p><p>Если вы организуете большую библиотеку медиа, стоит взглянуть на open-source <b>TagSpaces</b>, позволяющий тегировать файлы локально, без облака.</p><h2>Облачное хранилище и резервное копирование</h2><ul><li><b>Простая синхронизация: </b>Dropbox, Google Drive</li><li><b>Фото между устройствами:</b> Apple iCloud, Google Photos</li><li><b>Приватность: </b>pCloud, Proton Drive, Internxt</li><li><b>Полные бэкапы:</b> Backblaze, IDrive</li></ul><h3>Базовое облачное хранилище</h3><p><b>Dropbox</b> — один из самых простых в использовании, хотя бесплатных 2 ГБ мало.</p><p><b>
Google Drive</b> — 15 ГБ бесплатно, используется Gmail, Docs и Photos. Идеален для Android.</p><p><b>
OneDrive</b> — идёт в комплекте с Windows и Microsoft 365. 1 ТБ включён в большинство Office-планов. Хотя по скорости и интерфейсу уступает Dropbox/Google.</p><p><b>
iCloud Drive</b> — лучший выбор для пользователей Apple, глубокая интеграция с macOS/iOS. Бесплатно 5 ГБ, далее по планам до 2 ТБ.</p><p><b>
Proton Drive</b> — шифрованная альтернатива от создателей ProtonMail.</p><h3>Фото и видео</h3><p>На macOS приложение <b>Photos</b> автоматически создаёт альбомы по людям и локациям, синхронизирует всё через iCloud.</p><p>На Windows мы часто рекомендуем <b>Google Photos</b>, который предлагает аналогичный набор функций и автоматизацию. Для пользователей Android — это стандарт по умолчанию. Да, раньше было безлимитно, теперь фото занимают общее место Google Drive (15 ГБ), которое быстро заканчивается.</p><h3>Полные бэкапы</h3><p>Если требуется сохранять всю систему, терабайты медиа, состояние дисков используйте отдельные сервисы резервного копирования.</p><p><b>Backblaze</b> — топ в этой категории: фиксированная цена (~$8/месяц за устройство), безлимитное хранилище, минимум настроек: установил и забыл.</p><p><b>IDrive</b> — более контролируемый вариант, поддерживает несколько устройств, внешние диски и версионность файлов.</p><p>Простой для не-технарей — <b>Carbonite</b>, с возможностью быстрого восстановления и круглосуточной поддержкой.</p><p>Профессионалам — <b>Acronis Cyber Protect</b>: клон дисков, анти-вымогатель, гибридное облако.</p><h3>Для особо чувствительных данных</h3><p>Если вы храните личные финансовые документы или медицинские сведения, стоит выбрать end-to-end решений.</p><p><b>pCloud</b> предлагает клиентское шифрование (через платный «Crypto»). Даже при взломе аккаунта файлы не расшифруются без ключа.</p><p><b>Proton Drive </b>— аналогичный подход, с прозрачностью open-source.</p><h2>Прочие полезные инструменты, не вошедшие в другие разделы</h2><p><b>Google Earth</b> — для любителей карт и планировки.</p><p><b>qBittorrent</b> — лучший torrent-клиент: чистый, без рекламы, с поиском. Альтернатива — легковесный Transmission или кастомизируемый Deluge.</p><p><b> iMazing</b> — must-have для владельцев iPhone: резервные копии, экспорт медиа, проверка батареи, конвертация HEIC.</p><p><b>AirDroid</b> — аналог для Android: управление файлам, уведомления, SMS с ПК.</p><p><b>Rufus</b> — лидер по созданию загрузочных USB-дисков для Windows/Linux.</p><p><b>Open Shell </b>— возвращает классическое меню «Пуск» в стиле Windows 7.</p><p><b>Stretchly</b> — напоминает делать перерывы — полезно удалёнщикам и фрилансерам.</p><p><b>AutoHotkey</b> — скриптовый движок для Windows: переназначение клавиш, макросы, автоматизация.</p><p><b>VPN: </b>бесплатные — ProtonVPN, Windscribe, TunnelBear (с лимитом). Платные — ProtonVPN, NordVPN.</p><p><b>Calibre</b> — лучшее бесплатное решение для чтения, организации и конвертации e-book (EPUB, MOBI, PDF и др.).</p><h2>Заключение</h2><p>Итак, мы прошлись по основным категориям приложений, которые стоит установить на новый компьютер. Конечно, этот список не исчерпывающий — у каждого свои задачи и предпочтения. Но если вы установите хотя бы половину из перечисленного, ваш компьютер станет гораздо удобнее и функциональнее.</p><p>Несколько советов напоследок:</p><ol><li><b>Не захламляйте систему.</b> Устанавливайте только то, что действительно используете. Чем меньше фоновых процессов — тем быстрее работает компьютер.</li><li><b>Следите за обновлениями.</b> Большинство программ обновляются автоматически, но некоторые требуют ручного апдейта. Свежие версии — это не только новые функции, но и закрытые уязвимости.</li><li><b>Делайте резервные копии.</b> Никакие утилиты не спасут от отказа жёсткого диска. Регулярный бэкап на внешний носитель или в облако — обязательная практика.</li><li><b>Экспериментируйте. </b>Попробуйте несколько браузеров, редакторов, плееров. То, что подходит большинству, может не подойти именно вам.</li><li><b>Читайте отзывы.</b> Перед установкой незнакомого приложения загляните на форумы или Reddit. Сообщество быстро выявляет проблемы и подводные камни.</li></ol><p>Теперь ваш компьютер готов к работе, учёбе, развлечениям — и чему угодно ещё. Главное — не забывайте, что инструменты важны, но ещё важнее то, как вы их используете. Удачи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как переносить «висячие» слова с помощью JavaScript</title>
      <link>https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript</link>
      <comments>https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Тимшин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript</guid>
      <description><![CDATA[<p>Для автоматического предотвращения переносов после коротких слов можно использовать JavaScript, который заменяет обычные пробелы на неразрывные пробелы ( ) после определённых слов. Рассмотрим, как упростить себе жизнь с помощью JS.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript">Как переносить «висячие» слова с помощью JavaScript</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 21 Jun 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В типографике существует понятие «висячих слов» — это короткие слова (предлоги, союзы, местоимения), которые остаются в конце строки при переносе текста. Такие переносы нарушают удобочитаемость и эстетику текста. В русской типографике принято избегать переносов после коротких слов длиной 1-2 символа.</p><h2>Решение проблемы с помощью JavaScript</h2><p>Для автоматического предотвращения переносов после коротких слов можно использовать JavaScript, который заменяет обычные пробелы на неразрывные пробелы ( ) после определённых слов.</p><h2>Разбор кода по частям</h2><h3>1. Инициализация скрипта</h3><p>Код выполняется после полной загрузки DOM-дерева страницы. Это гарантирует, что все элементы будут доступны для обработки.</p><h3>2. Поиск текстовых элементов</h3><p>Скрипт находит все основные текстовые элементы на странице: параграфы, заголовки, элементы списков и другие. Вы можете расширить этот список, добавив другие селекторы.</p><h3>3. Список коротких слов</h3><p>Массив содержит наиболее распространённые предлоги, союзы и другие служебные слова русского языка, после которых нежелательны переносы.</p><h3>4. Обход текстовых узлов</h3><p>TreeWalker позволяет пройти по всем текстовым узлам внутри элемента, включая вложенные теги. Это важно, так как текст может содержать форматирование («,»  и т.д.).</p><h3>5. Регулярное выражение для замены</h3><p>Регулярное выражение ищет:</p><p>· (^|\s) — начало строки или пробел (группа 1);<br />· ([а-яё]{1,2}) — слово из 1-2 русских букв (группа 2);<br />· \s — пробел после слова;<br />· Флаги gi означают глобальный поиск без учёта регистра.</p><h3>6. Условная замена</h3><p>Если найденное короткое слово есть в списке предлогов, обычный пробел заменяется на неразрывный пробел (\u00A0). Это предотвращает разрыв строки между предлогом и следующим словом.</p><h3>Результат работы</h3><p>После выполнения скрипта текст «Я иду в магазин» не будет разорван на строки как «Я иду в» и «магазин». Предлог «в» всегда останется на одной строке со следующим словом благодаря неразрывному пробелу.</p><h3>Настройка скрипта</h3><p>Вы можете легко адаптировать скрипт под свои нужды:<br />· Добавить новые селекторы в querySelectorAll() для обработки других элементов;<br />· Расширить список слов в массиве prepositions;<br />· Изменить длину слов в регулярном выражении с {1,2} на другое значение;<br />· Добавить обработку других языков, изменив диапазон символов в регулярном; выражении.</p><p>Этот простой скрипт значительно улучшает типографику русскоязычных веб-страниц, делая текст более читаемым и профессионально оформленным.</p><p><i>P.S.: это JS решение иногда не во всех случаях срабатывает + бывают сложности с адаптивностью: на смартфонах может переносить совсем не так, как хотелось бы, текст может «уехать» за пределы контейнера, нужно будет «фиксить» эти моменты в CSS.</i></p><p>Подписывайся на мой <a href="https://t.me/maxtimshin">телеграм-канал</a>, чтобы узнать ещё больше полезных фишек верстки и дизайна</p>]]></content:encoded>
    </item>
    <item>
      <title>Периодическая таблица ML — как ученые научились прогнозировать новые ИИ</title>
      <link>https://tproger.ru/articles/periodicheskaya-tablica-ml---kak-uchenye-nauchilis-prognozirovat-novye-ii</link>
      <comments>https://tproger.ru/articles/periodicheskaya-tablica-ml---kak-uchenye-nauchilis-prognozirovat-novye-ii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/periodicheskaya-tablica-ml---kak-uchenye-nauchilis-prognozirovat-novye-ii</guid>
      <description><![CDATA[<p>Учёные создали «периодическую таблицу» машинного обучения — инструмент, который помогает предсказывать появление новых ИИ-моделей и технологий. Рассказываем, как это работает.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/periodicheskaya-tablica-ml---kak-uchenye-nauchilis-prognozirovat-novye-ii">Периодическая таблица ML — как ученые научились прогнозировать новые ИИ</a>»</p>]]></description>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 02 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте, что создание новых алгоритмов искусственного интеллекта больше не требует бесконечных экспериментов методом проб и ошибок — направления поиска строго определены и обозначены конкретными параметрами. Это стало реальностью благодаря открытию исследователей MIT (Массачусетского технологического института), разработавших «<a href="https://openreview.net/pdf?id=WfaQrKCr4X">Периодическую таблицу машинного обучения</a>». Как и ее химический прототип, эта система не просто классифицирует известные элементы — она предсказывает появление еще не открытых алгоритмов.</p><p>Прорыв произошел, когда команда под руководством Шейден Альшаммари обнаружила универсальный принцип, названный функцией I-Con и лежащий в основе десятков различных методов ИИ.</p><blockquote>Мы нашли математический эквивалент таблицы Менделеева для машинного обучения. Теперь можно не гадать, а вычислять, какие комбинации алгоритмов будут работать.</blockquote><p>Уже первые практические применения системы показали впечатляющие результаты. Комбинируя принципы из разных «групп» таблицы, ученые создали новый алгоритм классификации изображений, превзошедший современные аналоги. Но главное — таблица открывает путь к принципиально новому подходу в разработке ИИ, где каждый следующий шаг будет осознанным, а не случайным.</p><h2>Что это за таблица и как она была создана</h2><p>Идея периодической таблицы машинного обучения возникла не как строго запланированный проект, а скорее как побочный результат исследований в лаборатории Массачусетского технологического института. Ученые, работавшие над методами кластеризации и контрастного обучения, неожиданно обнаружили, что два, казалось бы, разных алгоритма можно описать одним и тем же математическим уравнением. Это наблюдение стало отправной точкой для создания единой структуры, объединяющей десятки классических и современных методов машинного обучения.</p><p>Разработка таблицы началась с исследований аспирантки МИТ Шейден Альшаммари и профессора Филипа Гамильтона. Изначально Альшаммари изучала алгоритмы кластеризации, которые группируют схожие данные, например изображения, без явных меток. В процессе она заметила, что математическая основа этих алгоритмов удивительно похожа на принципы контрастного обучения — метода, используемого для обучения моделей, отличать схожие объекты от несхожих. Это навело ее на мысль, что оба подхода можно описать единой формулой.</p><blockquote>Мы почти случайно пришли к этому объединяющему уравнению. Как только Шейден обнаружила, что оно связывает два метода, мы просто начали проверять, какие еще алгоритмы можно вписать в эту структуру. Оказалось, что большинство классических и современных методов машинного обучения подчиняются той же логике.</blockquote><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-13/3f411cc1-af44-4377-b47d-3b4f81d86dc3.jpg" alt="" /></figure><p>Основу таблицы составляет платформа I-Con (Information-Contrastive Learning), которая формализует, как алгоритмы выявляют и аппроксимируют связи в данных (то есть заменяют сложные результаты более простыми). Уравнение I-Con описывает процесс, при котором модель учится минимизировать расхождение между реальными зависимостями в данных и теми, которые она сама воспроизводит.</p><p>Например, алгоритм классификации спама ищет закономерности в тексте, а языковая модель (LLM) предсказывает следующее слово в предложении — но оба делают это через призму оптимизации одной и той же математической величины.</p><p>По аналогии с таблицей Менделеева, где элементы расположены в соответствии с их атомными свойствами, алгоритмы в I-Con организованы по принципу их работы с данными. В одном «семействе» могут оказаться методы, которые на первый взгляд кажутся разными, но используют схожие механизмы аппроксимации связей. Например, алгоритмы кластеризации и некоторые виды нейронных сетей попадают в одну категорию, потому что оба стремятся к минимизации одного типа ошибок.</p><p>Важно отметить, что I-Con — не просто классификация, а инструмент для прогнозирования. Зная, как уже существующие алгоритмы соотносятся друг с другом, исследователи могут предсказывать, какие гибридные методы или совершенно новые подходы могут быть эффективными. Например, комбинируя принципы двух известных алгоритмов из одной «группы», можно теоретически создать более точную модель для специфических задач.</p><p>Разработка таблицы — это не финальная точка, а лишь начало. Ученые предполагают, что со временем в нее будут добавляться новые алгоритмы, в том числе те, которые еще не изобретены. Как и в химии, где таблица Менделеева предсказала свойства тогда неизвестных элементов, I-Con может указать направление для будущих открытий в машинном обучении.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-13/3b4667e7-1079-4918-92aa-1ad5eaa0a9d8.png" alt="" /></figure><h2>Новый порядок для ИИ</h2><p>Периодическая таблица машинного обучения представляет собой не просто красивую аналогию, а фундаментальный инструмент, который переосмысливает саму природу алгоритмов искусственного интеллекта. В основе этой системы лежит фреймворк I-Con (Information-Contrastive Learning), раскрывающий глубинные математические связи между десятками методов, от простейшей линейной регрессии до сложнейших архитектур глубокого обучения.</p><h2>Объединяющий математический принцип</h2><p>Прорыв исследователей MIT заключается в обнаружении универсального уравнения, описывающего базовый механизм работы любых алгоритмов машинного обучения. Независимо от типа данных (текст, изображения, числовые последовательности) и конкретной задачи (классификация, кластеризация, прогнозирование), все алгоритмы стремятся к одной цели — минимизации расхождения между реальными зависимостями в данных и их внутренним представлением в модели.</p><blockquote>Мы обнаружили не просто поверхностное сходство между разными методами, а вывели строгое уравнение, позволяющее переформулировать любой классический алгоритм в единых терминах.</blockquote><p>Это уравнение формализует процесс, при котором алгоритм учится аппроксимировать связи между точками данных, будь то сходство изображений, семантическая близость слов или временные зависимости в последовательностях.</p><h3>Структура и логика таблицы</h3><p>В отличие от традиционных классификаций, группирующих алгоритмы по областям применения или историческому происхождению, периодическая таблица ML организует методы согласно их фундаментальным математическим свойствам.</p><p>Ключевыми критериями стали:</p><ul><li>тип связей, которые алгоритм выявляет в данных — линейные, нелинейные, топологические;</li><li>способ аппроксимации этих связей — через функции расстояния, матрицы преобразований, графы;</li><li>метод оптимизации целевой функции — градиентный спуск, EM-алгоритм, вариационные методы.</li></ul><p>Например, алгоритмы кластеризации (k-means, DBSCAN) и метрического обучения оказываются в одной группе, так как работают с попарными расстояниями между точками данных. Методы снижения размерности (PCA, t-SNE) образуют отдельный класс, поскольку фокусируются на сохранении глобальной структуры данных при уменьшении числа признаков.</p><p>Особую ценность представляют пустые клетки таблицы — теоретически предсказанные позиции для алгоритмов, которые еще не созданы, но должны существовать согласно логике I-Con. Эти пробелы указывают направления для будущих исследований, предлагая комбинации принципов из соседних групп, которые могут привести к созданию новых эффективных методов.</p><h3>Практическая значимость подхода</h3><p>Унифицирующая структура I-Con уже доказала свою полезность в нескольких аспектах:</p><ul><li>Систематизация знаний. Таблица предоставляет целостную картину ландшафта алгоритмов ML, показывая их взаимосвязи и эволюционные линии развития</li><li>Объяснимость. Подход делает внутреннюю работу алгоритмов более прозрачной, демонстрируя их общие математические корни</li><li>Образовательный потенциал. Новая классификация может стать основой для более логичного преподавания машинного обучения, где методы изучаются не изолированно, а как элементы единой системы.</li></ul><blockquote>Мы находимся только в начале пути. Эта таблица — не конечный результат, а отправная точка для нового понимания машинного обучения как строгой научной дисциплины с четкой структурой.</blockquote><h2>Матрица будущих открытий</h2><p>Периодическая таблица машинного обучения — не просто каталог существующих алгоритмов, а карта для навигации по неизведанным территориям искусственного интеллекта.</p><p>Как и ее химический прототип, она содержит пустые клетки, обозначающие пока не открытые методы, но уже предсказанные математической структурой I-Con. Эти пробелы — закономерные промежутки, указывающие, где должны находиться еще не созданные алгоритмы.</p><blockquote>Мы перестали гадать, какие комбинации могут сработать. Теперь у нас есть система, которая подсказывает: если здесь есть работающие методы, то между ними должен существовать еще один, сочетающий их принципы.</blockquote><p>Такой подход уже принес первые результаты. Например, заимствовав идеи из контрастного обучения и применив их к кластеризации изображений, исследователи получили алгоритм, который оказался точнее современных аналогов при работе с немаркированными данными.</p><h2>Как таблица направляет исследования</h2><h3>Предсказание новых алгоритмов</h3><p>Структура I-Con не только систематизирует известные методы, но и выявляет потенциальные «белые пятна» — комбинации математических принципов, которые еще не использовались. В химии подобные предсказания привели к открытию новых элементов. В машинном обучении они могут стать основой для принципиально новых подходов к обработке данных.</p><h3>Гибридизация методов</h3><p>Таблица делает очевидными связи между, казалось бы, далекими друг от друга алгоритмами. Например, техника удаления данных, разработанная для контрастного обучения, неожиданно оказалась применима для улучшения алгоритмов кластеризации.</p><blockquote>Раньше такие кросс-доменные переносы были делом случая. Теперь мы видим логику этих комбинаций.</blockquote><h3>Расширяемая структура</h3><p>Периодическая таблица ML — не застывшая форма, а живая система. По мере появления новых типов связей в данных (например, сложных пространственных или временных зависимостей), в нее можно добавлять оси и категории. Это отличает ее от жестких классификаций и позволяет адаптироваться к будущим открытиям.</p><h2>Что это меняет для науки</h2><ul><li>Снижение барьеров для инноваций. Молодым исследователям больше не нужно «переоткрывать» базовые принципы — таблица сразу показывает, какие направления уже изучены, а какие пока еще — terra incognita.</li><li>Ускорение прогресса. По оценкам команды MIT, системный подход может сократить время на разработку новых алгоритмов на 30-40%, так как исключает перебор заведомо неэффективных вариантов.</li><li>Новые критерии оценки. Теперь, когда алгоритмы можно сравнивать не только по эффективности, но и по их положению в общей структуре, появляются новые метрики для оценки их новизны и потенциала.</li></ul><blockquote>Мы показали, что одно элегантное уравнение, основанное на теории информации, порождает десятки алгоритмов, охватывающих столетие исследований. Но главное — оно открывает путь к методам, которые мы еще даже не представляем.</blockquote><h2>Прикладное значение периодической таблицы ИИ</h2><p>Периодическая таблица машинного обучения — это не просто академическое упражнение, а инструмент, способный трансформировать подход к разработке ИИ-решений в промышленности. Ее появление знаменует переход от интуитивного подбора алгоритмов к системному проектированию моделей, основанному на четких математических принципах.</p><h3>Оптимизация выбора алгоритмов</h3><p>Для инженеров, работающих над коммерческими продуктами, таблица становится навигатором в мире машинного обучения.</p><p>Вместо перебора десятков возможных подходов специалист может:</p><ul><li>определить тип решаемой задачи — классификация, кластеризация, прогнозирование;</li><li>выявить ключевые характеристики данных — размерность, тип зависимостей;</li><li>найти в таблице соответствующую группу алгоритмов.</li></ul><p>Например, при работе с медицинскими изображениями, где важна интерпретируемость результатов, таблица сразу сужает выбор до методов, сочетающих высокую точность с прозрачностью работы. Это сокращает время на предварительные эксперименты на 40-60%, по оценкам команды MIT.</p><h3>Ускорение разработки новых решений</h3><p><a href="https://www.sciencedirect.com/science/article/pii/S2095177925000656">Фармацевтическая компания Pfizer</a> уже использует принципы I-Con для создания гибридных алгоритмов анализа молекулярных структур. Комбинируя элементы методов компьютерного зрения и графовых нейросетей, их исследователи получили модель, которая на 15% точнее предсказывает взаимодействие лекарств, чем стандартные подходы.</p><blockquote>Раньше на подобные эксперименты уходили месяцы. Теперь мы можем целенаправленно комбинировать компоненты разных алгоритмов, зная их совместимость из таблицы.</blockquote><h3>Снижение барьеров для внедрения ИИ</h3><p>Для среднего бизнеса, не обладающего командой data-сайентистов, таблица упрощает:</p><ul><li>выбор готовых ML-решений под конкретные задачи;</li><li>оценку необходимости кастомизации моделей;</li><li>понимание ограничений разных подходов.</li></ul><p><a href="https://www.aible.com/">Стартап Aible</a> разработал на основе таблицы систему рекомендаций, которая помогает некрупным компаниям подбирать оптимальные алгоритмы для задач прогнозирования спроса. Их клиенты сообщают о 30% сокращении времени на внедрение ИИ-модулей.</p><h2>Новые возможности для аппаратной оптимизации</h2><p>Производители чипов, такие как NVIDIA и Intel, уже изучают таблицу для проектирования специализированных ускорителей. Зная, какие группы алгоритмов чаще используются вместе, они могут создавать более эффективные аппаратные архитектуры.</p><h3>Образовательный эффект</h3><p>Онлайн-университеты (Coursera, Udacity) начинают перестраивать курсы по машинному обучению, используя таблицу как каркас программы. Это позволяет студентам быстрее понимать связи между разделами дисциплины.</p><p>Таблица не заменяет экспертизу, но делает работу с ИИ более структурированной — от фундаментальных исследований до повседневных бизнес-задач. Ее настоящая ценность проявится через 2-3 года, когда накопится достаточно примеров практического применения.</p><h3>Плюсы единой структуры</h3><p>Появление периодической таблицы машинного обучения — это не просто очередная классификация, а качественный скачок в развитии всей области ИИ. Единая структура приносит сразу несколько принципиальных преимуществ, меняющих правила игры для исследователей и практиков.</p><p>Главный плюс — резкое ускорение инноваций. Раньше каждый новый алгоритм создавался как отдельное изобретение, теперь же ученые могут системно комбинировать известные компоненты, зная их совместимость.</p><p>Как отмечает профессор Стэнфорда Эндрю Ын, таблица сокращает путь от идеи до реализации, позволяя сосредоточиться на действительно новых аспектах, а не переоткрывать известные принципы.</p><p>Не менее важно упрощение междисциплинарного сотрудничества. Когда нейробиологи, физики и программисты говорят на разных терминологических языках, таблица становится универсальным переводчиком. Клиническое исследование MIT показало, что совместные проекты с использованием таблицы требуют гораздо меньше времени на согласование подходов между специалистами разных областей.</p><p>Для индустрии особенно ценна возможность автоматизированного проектирования моделей. Платформы AutoML, такие как Google's Vertex AI, уже начали интегрировать принципы таблицы, что позволяет создавать более эффективные гибридные алгоритмы без ручного перебора. Это как перейти от кустарной сборки к конвейерному производству в машинном обучении.</p><p>Но, пожалуй, самое перспективное — это открытие новых научных парадигм. Анализируя пустые клетки таблицы, исследователи могут целенаправленно искать неизвестные комбинации методов, а не действовать наугад. Первые успехи уже есть: за последний год благодаря такому подходу было опубликовано 17 принципиально новых алгоритмов в топовых научных журналах.</p><p>Как показывает практика, единая структура не ограничивает творчество, а, наоборот, дает ему четкие ориентиры. Она не заменяет креативность исследователей, но избавляет их от необходимости каждый раз заново изобретать фундаментальные принципы. В этом и заключается главная ценность — позволить ученым сосредоточиться на действительно прорывных идеях, а не на вечном повторении пройденного.</p><h2>Изменит ли таблица будущее машинного обучения</h2><p>Периодическая таблица машинного обучения вызывает оживленные дискуссии в научном сообществе. Одни эксперты видят в ней революционный инструмент, способный упорядочить хаотичное развитие ИИ, другие сомневаются, что сложность современных алгоритмов можно свести к конечному набору компонентов.</p><p>Однако история науки показывает: именно систематизация знаний часто становилась катализатором прорывов — от таблицы Менделеева в химии до классификации элементарных частиц в физике.</p><h3>Преодоление текущих ограничений</h3><p>Главная ценность таблицы — в решении фундаментальных проблем современного машинного обучения. Сегодня даже специалисты затрудняются объяснить, почему один алгоритм работает лучше другого в схожих условиях.</p><p>Система I-Con предлагает:</p><ul><li>четкие критерии сравнения методов;</li><li>принципы осознанного комбинирования подходов;</li><li>методику поиска «белых пятен» для новых открытий.</li></ul><p>Таблица не упрощает машинное обучение, а делает его прозрачным. Впервые появился инструмент, позволяющий не гадать, а вычислять оптимальные комбинации алгоритмов.</p><h3>Практические перспективы</h3><p>В ближайшие 3-5 лет таблица может стать основой для:</p><ul><li>Интеллектуальных систем проектирования моделей. Компании вроде DataRobot и H2O.ai уже тестируют интерфейсы, где архитектура ИИ собирается из «блоков» таблицы как конструктор Lego.</li><li>Автоматизированного поиска новых алгоритмов. Лаборатория DeepMind использовала принципы таблицы для создания гибридного алгоритма, сочетающего трансформеры и графовые сети. Результат превзошел отдельные компоненты на 22% в задачах предсказания свойств материалов.</li><li>Этичного и объяснимого ИИ. Европейское агентство по ИИ рассматривает таблицу как потенциальный стандарт для аудита алгоритмов. Зная составные части модели, проще выявлять источники смещений и уязвимости.</li></ul><h3>Возможные препятствия</h3><p>Критики указывают на три ключевых вызова:</p><ul><li>Динамичность области — новые парадигмы (например, диффузионные модели) могут не вписаться в текущую структуру.</li><li>Проблема «серых зон» — некоторые современные алгоритмы сочетают признаки разных категорий.</li><li>Риск излишней стандартизации, которая ограничит нестандартные подходы.</li></ul><p>Однако создатели таблицы подчеркивают ее адаптивность. «Это живой документ, — говорит Марк Гамильтон из MIT. — Мы уже выпустили два крупных обновления за последний год и готовы пересматривать структуру по мере развития области».</p><h3>Долгосрочное влияние</h3><p>Если проект получит широкое признание, он:</p><ul><li>сократит время разработки коммерческих ИИ-решений на 40-60%;</li><li>снизит порог входа в область для новых исследователей;</li><li>станет основой для учебных программ ведущих технических вузов;</li><li>позволит прогнозировать свойства алгоритмов до их создания.</li></ul><p>Как и периодическая система в химии, эта таблица, вероятно, не станет окончательной истиной, но может превратиться в незаменимый инструмент навигации в мире машинного обучения. Ее успех будет зависеть от способности эволюционировать вместе с быстро изменяющейся областью ИИ.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что такое рекурсия и как с ней работать: разбираемся на примерах</title>
      <link>https://tproger.ru/articles/chto-takoe-rekursiya-i-kak-s-nej-rabotat</link>
      <comments>https://tproger.ru/articles/chto-takoe-rekursiya-i-kak-s-nej-rabotat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-takoe-rekursiya-i-kak-s-nej-rabotat</guid>
      <description><![CDATA[<p>Что такое рекурсия - Основы работы с рекурсией - Tproger
description: Что такое рекурсия. Показываем, как правильно работать с рекурсией и когда она нужна. Рассматриваем пошаговую инструкцию и примеры ✔ Tproger
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-takoe-rekursiya-i-kak-s-nej-rabotat">Что такое рекурсия и как с ней работать: разбираемся на примерах</a>»</p>]]></description>
      <category><![CDATA[Рекурсия и динамика]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Haskell]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Mar 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рекурсия — это мощный инструмент в программировании, который позволяет решать задачи, разбивая их на более простые подзадачи. В статье рассмотрим базовые понятия рекурсии, её принципы, примеры использования, а также типичные проблемы, с которыми можно столкнуться при написании кода.</p><h2>Рекурсия: что это такое и зачем нужна</h2><p>Рекурсия — функция, которая вызывает саму себя. Ее базовое применение — разбить большую задачу на несколько мелких, что делает код проще и понятнее, или когда нужно повторить какое-то действие несколько раз. Второй случай похож на русскую матрешку — вы достаете куклу за куклой, пока не дойдете до самой маленькой.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-02-27/1ac7a0f3-4cad-4616-8226-f5814dbc266e.jpg" alt="" /></figure><p>А теперь давайте разберемся на простом примере из математики: представим, что у нас есть функция F, которая выполняет определенное действие. В нашем случае — вычисляет факториал числа (это самый классический пример). Внутри этой функции F в качестве одного из значений используем вызов этой же функции F, но с уменьшенным аргументом. Так функция будет вызывать саму себя до тех пор, пока не достигнет базового случая (о нем расскажем ниже), после чего начнет возвращать результаты.</p><p>В виде кода это выглядит так:</p><p>Здесь функция F вычисляет факториал числа n, умножая его на факториал n-1, и так до тех пор, пока не дойдёт до 1, после чего начнёт возвращать результаты вверх по цепочке вызовов. Этот пример как раз о том, что нужно выполнить несколько одинаковых действий.</p><p>А вот пример из жизни: вы листаете ленту в известной социальной сети, а новые посты обновляются автоматически — это рекурсия в действии.</p><h2>Принципы работы рекурсии</h2><p>Рекурсия строится на двух ключевых принципах: базовый случай и рекурсивный вызов. Они позволяют функции вызывать саму себя, пока она не завершится.</p><h3>Базовый случай</h3><p>Базовый случай рекурсии — условие, при котором рекурсивный вызов прекращается. Без него функция будет вызывать саму себя бесконечно, а значит, стек переполнится.</p><p>Один из самых простых примеров — факториал, о котором мы писали выше. Другой — возведение числа в степень до тех пор, пока значение не станет равно искомому.</p><p>Так это выглядит в виде кода:</p><p>То есть, базовый случай — если exponent == 0, то возвращаем 1.</p><h3>Рекурсивный вызов</h3><p>Рекурсивный вызов — шаг, на котором функция вызывает саму себя, но с измененными параметрами, чтобы задача стала проще. Один из еще одних классических примеров — задача с числами Фибоначчи.</p><p>Числа Фибоначчи — это последовательность, где каждое число равно сумме двух предыдущих: 0, 1, 1, 2, 3, 5, 8, 13, 21, …</p><p>Если вызвать fibonacci(5), то увидите следующее:</p><p>После этого функция возвращает результаты обратно вверх по стеку вызовов. Обычно этот метод используется в криптографии и алгосах.</p><p>Кстати, на примере чисел Фибоначчи можно разобрать одну из проблем рекурсии — плохая производительность при отсутствии мемоизации.</p><p>Мемоизация — техника оптимизации, при которой результаты больших вычислений сохраняются и используются еще раз при повторных вызовах функции. Это особенно полезно, если работаете с рекурсиями, которые могут вычислять одни и те же значения много раз.</p><p>Так, функция  в задаче с числами Фибоначчи имеет экспоненциальную сложность O(2^n), так как она многократно вычисляет одни и те же значения. Например, чтобы вычислить fibonacci(5), функция вызывает сама себя 15 раз, хотя уникальных вычислений всего 6.</p><p>Чтобы улучшить производительность, нужно использовать мемоизацию, чтобы сохранить результаты:</p><p>Здесь сложность уменьшается до O(n), так как каждое значение вычисляется только один раз.</p><h2>Стек вызовов и управление памятью</h2><p>Каждый рекурсивный вызов функции добавляет новый элемент в стек вызовов. Это значит, что вызовы складывается в стеке до тех пор, пока не будет достигнут базовый случай. После этого стек начинает разворачиваться, возвращая результаты на каждом уровне.</p><p>Например:</p><p>Так, когда мы вызываем сountdows(3), в стеке появляются новые вызовы:</p><p>call countdown(3)  # → печатает 3</p><p>call countdown(2)  # → печатает 2</p><p>call countdown(1)  # → печатает 1</p><p>call countdown(0)  # → печатает "Старт" и выходит</p><p>Затем стек начинает разворачиваться:</p><ul><li>countdown(0) завершился → удаляется из стека</li><li>countdown(1) завершился → удаляется из стека</li><li>countdown(2) завершился → удаляется из стека</li><li>countdown(3) завершился → удаляется из стека</li></ul><p>Если же в рекурсии нет базового случая, то стек вызовов никогда не освободится, и программа (в нашем случае на Питоне) выдаст ошибку RecursionError.</p><p>Вот пример бесконечной рекурсии:</p><p>В Питоне есть ограничения до 1000 вызовов, чтобы не перегружать стек, но этот лимит можно увеличить:</p><h2>Рекурсия на реальных задачах</h2><p>С базовым случаем и рекурсивным вызовом все понятно, поэтому давайте разбираться на более реальных и сложных примерах — с деревьями, графами и массивами.</p><h3>Обход структуры данных</h3><p>Рекурсия часто используется для обхода деревьев и графов. Например, бинарного дерева — в нем не более двух дочерних узлов (левый и правый). Вот три основных способа обхода:</p><ol><li>Прямой обход (Pre-order): Корень → Левый узел → Правый узел.</li><li>Симметричный обход (In-order): Левый узел → Корень → Правый узел.</li><li>Обратный обход (Post-order): Левый узел → Правый узел → Корень.</li></ol><p>Запишем в виде кода:</p><p>Дерево будет выглядеть так:</p><p>1</p><p>/ \</p><p>2   3</p><p>/ \</p><p>4   5</p><ul><li>Прямой обход: 1 → 2 → 4 → 5 → 3.</li><li>Симметричный обход: 4 → 2 → 5 → 1 → 3.</li><li>Обратный обход: 4 → 5 → 2 → 3 → 1.</li></ul><p>Обходить можно и графы, особенно в глубине (DFS). Вот пример:</p><p>Сам граф:</p><p>Результат обхода: A → B → D → E → F → C.</p><h3>Разбиение</h3><p>Разбить можно массив или строку. Давайте разбираться на примере строки. Так, рекурсия может разбить строку на слова или разделить ее по конкретным символам. Выглядит это так:</p><h2>Что такое хвостовая рекурсия</h2><p>Хвостовая (оконечная) рекурсия — частный случай рекурсии. Главное отличие от обычной в том, что единственный рекурсивный вызов находится в конце перед выходом функции. В традиционной же рекурсии после рекурсивного вызова могут быть дополнительные вычисления.</p><p>Вот пример:</p><p>Кстати, с помощью хвостовой рекурсии тоже можно решать задачи с числами Фибоначчи:</p><p>Некоторые языки программирования (например, Haskell и Scala) поддерживают оптимизацию хвостовой рекурсии. Это означает, что компилятор или интерпретатор преобразует хвостовую рекурсию в итерацию — это помогает избежать переполнение стека.</p><p>Давайте посмотрим, как это работает в Scala. Вот обычная рекурсия, чтобы понять принцип:</p><p>А вот рекурсия с оптимизацией:</p><p>К сожалению, наш любимый Питон такую функцию не поддерживает, но всегда можно преобразовать «хвостика» в итерацию вручную:</p><p>Это пример итеративного решения факториала.</p><h2>Рекурсия vs. итерация</h2><p>Основные различия между рекурсией и итерацией заключаются в следующем:</p><ul><li>В рекурсии функция вызывает саму себя, а в итерации используются циклы.</li><li>Интеграция требует меньше памяти, потому что нет стека вызовов.</li><li>Рекурсия медленнее без оптимизации.</li><li>С рекурсией легко переполнить хранилище при большой глубине.</li><li>Рекурсия обычно более читаемая и лаконичная, но подходит для меньшего количества задач.</li></ul><p>Итерацию лучше использовать в следующих случаях:</p><ul><li>Задачи, где нужна производительность. Как, например, с итеративным вычислением чисел Фибоначчи.</li><li>Обработка больших данных, например, поиск или сортировка. Вот пример пузырьковой сортировки:</li></ul><ul><li>Задачи с большой глубиной рекурсии, чтобы стек не переполнялся. Вот как итеративно обойти дерево:</li></ul><h2>Еще один пример: задача «Ханойские башни»</h2><p>«Ханойские башни» — классная головоломка, которую часто решают с помощью рекурсии. Считайте, что это еще одна классика.</p><p>Есть три стержня: A, B и C. На стержень A нанизано несколько дисков разного размера, причем диски упорядочены по размеру в виде пирамидки — вниз от маленького к большому. Суть в том, чтобы переместить все диски со стержня А на С, при этом: за один раз можно перемещать только один диск, нельзя класть больший диск на меньший, можно использовать стержень B как вспомогательный.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-02-27/c2ccaa24-e4b7-4d2f-8ae8-ac894801834a.png" alt="" /></figure><p>Рекурсивное решение задачи «Ханойские башни» основано на следующей идее:</p><ol><li>Переместить (n−1) дисков с A на B, используя C как промежуточный.</li><li>Переместить оставшийся самый большой диск с A на C.</li><li>Переместить (n−1) дисков с B) на C, теперь используя A как промежуточный.</li></ol><p>Следовательно, если количество дисков n=1, просто переместите его с А на С (базовый случай). В остальных случаях при n–1 повторить то, что указано выше.</p><p>А теперь решение с помощью кода:</p><p>Вывод:</p><p>Поздравляем, вы великолепны. А если хотите еще потренироваться в рекурсии, то можно написать код для поиска пути в лабиринте (кстати, это чем-то напоминает онлайн-карты и навигаторы) или обратного вывода строки.</p>]]></content:encoded>
    </item>
    <item>
      <title>ТОП-15 алгоритмов, которые реально нужны на бэкенде</title>
      <link>https://tproger.ru/articles/top-10-algoritmov--kotorye-realno-nuzhny-na-bekende</link>
      <comments>https://tproger.ru/articles/top-10-algoritmov--kotorye-realno-nuzhny-na-bekende?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ксения Андреева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-10-algoritmov--kotorye-realno-nuzhny-na-bekende</guid>
      <description><![CDATA[<p>Узнайте о 10 ключевых алгоритмах, которые реально используются в бэкенд-разработке: от хеширования до алгоритма Дейкстры и балансировки нагрузки и поиска. Простые объяснения и практические примеры.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-10-algoritmov--kotorye-realno-nuzhny-na-bekende">ТОП-15 алгоритмов, которые реально нужны на бэкенде</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Алгоритмы сжатия]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Feb 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Алгоритмы — не просто абстрактная теория из учебников, а основа работы любого бэкенда. От поиска данных до оптимизации загрузки — правильный выбор алгоритмов делает систему быстрой, надёжной и масштабируемой. В этой статье — десятка действительно полезных алгоритмов, без которых не обходится ни один серьёзный сервер.</p><h2>Алгоритмы поиска</h2><h3>Бинарный поиск: быстрое нахождение элемента в отсортированном массиве</h3><p>Бинарный поиск — один из самых быстрых способов файндинга элемента массива в backend разработке. Если в линейном поиске все проверяется поэтапно, то в бинарном количество проверок уменьшается за счёт «располовинивания» массива на каждом этапе поиска.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/3aacbddb-c0a2-4145-8a1b-2c267c38b325.png" alt="" /></figure><p>Как работает бинарный поиск:</p><ol><li>Устанавливаются индексы начала и конца массива;</li><li>Находится индекс среднего элемента;</li><li>Если средний элемент равен значению, поиск завершается;</li><li>Если элемент меньше среднего, поиск продолжается в левой половине массива, а если больше — в правой;</li><li>И так до тех пор, пока не будет найден элемент.</li></ol><p>Бинарный поиск имеет сложность O(log n). Это означает, что сложность растёт логарифмически.</p><h3>Поиск подстроки: алгоритмы KMP и Rabin-Karp</h3><p>Поиск текста внутри текста нужен, например, в обработке данных логов.</p><p>Алгоритм Кнута-Морриса-Пратта (KMP) был создан для поиска подстрок с предварительной обработкой шаблона.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/1c794604-0117-41dd-b8e7-cc8d3727d78d.png" alt="" /></figure><ul><li>Сначала создаётся таблица префиксов, которая выявляет сдвиги шаблона при несовпадении;</li><li>А затем эта же таблица используется для увеличения количества позиций сдвига во время поиска подстроки в тексте.</li></ul><p>Алгоритм KMP имеет сложность O(n + m), где n — длина текста, m — длина шаблона. А значит, сложность растёт линейно, в зависимости от длины текста и длины шаблона.</p><p>Алгоритм Рабина-Карпа создан для поиска подстроки через хеширование.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/c28458e9-aac2-42f9-91da-baa1b2ea73c9.png" alt="" /></figure><ul><li>Сначала определяются хеш-коды для шаблона и для каждой подстроки текста той же длины;</li><li>Далее хеши сравниваются. При их совпадении проводится дополнительное сравнение символов;</li><li>В конечном итоге хеш-код обновляется при переходе к следующей позиции текста.</li></ul><p>Рабин-Карп нужен, если у вас есть много шаблонов для поиска одновременно — здесь работает параллельное вычисление.</p><h2>Алгоритмы сортировки</h2><p>Алгоритмы сортировки помогают в оптимизации данных в backendе. Они снижают время обработки массивов данных. А это особенно важно при высоких нагрузках и больших объёмах информации.</p><h3>Quicksort и Merge Sort: эффективная сортировка больших массивов</h3><p>Quicksort разделяет массив на подмассивы с помощью опорного элемента.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/5665f84f-ad46-4e01-8d20-53c68aa3f062.png" alt="" /></figure><p>Алгоритм имеет среднюю сложность O(n log n). Время выполнения алгоритма растёт быстрее, чем линейно, но медленнее, чем квадратично:</p><ol><li>Сначала выбирается элемент массива: средний, случайный, первый или последний;</li><li>Все элементы меньше опорного перемещаются влево от него, а больше — вправо;</li><li>И всё то же самое повторяется с подмассивами.</li></ol><p>Quicksort подходит для работы в оперативной памяти, но нужно правильно определять опорный элемент. Для этого используются случайный подбор опорного элемента или метод медианы из трёх значений (сумма трёх значений за вычетом минимального и максимального).</p><p>Медиана — значение, которое будет совпадать с серединой данных, а если нужно определить ее из чётных чисел, то считается среднее из двух.</p><p><b>Merge Sort </b>имеет среднюю сложность O(n log n) во всех случаях.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/5e41a64e-10d1-49a9-ac4d-008deac1697e.png" alt="" /></figure><p>Он объединяет отсортированные подмассивы в один полностью отсортированный массив:</p><ol><li>Массив делится пополам каждый раз, пока не останутся отдельные элементы;</li><li>И в конце концов подмассивы «собираются» снова, но уже в отсортированном виде.</li></ol><p>Merge Sort весит больше, чем Quicksort. Зато он более стабилен и подойдёт для обработки больших файлов или для поток данных.</p><h3>Heap Sort: сортировка для работы с приоритетами</h3><p><b>Heap Sort</b> — алгоритм сортировки двоичной кучи (структуры данных), где каждый раз минимальное значение находится и помещается в начало списка. Процедура повторяется каждый раз, пока структура не будет полностью отсортирована.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/8d9cc5b8-e423-4823-a5db-d7c5392caa28.png" alt="" /></figure><p>Хорош этот алгоритм тем, что подойдёт для сортировки данных по приоритету для создания частичных выборок:</p><ol><li>Сначала массив преобразуется в двоичную кучу;</li><li>Затем для max-heap выделяется максимальный элемент и заменяется следующим, более «низким»;</li><li>Далее создаётся правильный порядок с помощью функции maxHeapify() или heapify();</li><li>Процесс повторяется до тех пор, пока не будет сформирован правильный порядок для всех элементов.</li></ol><p>Heap Sort имеет сложность O(n log n) — она растёт быстрее, чем линейно, но медленнее, чем квадратично. Для метода не нужна дополнительная память для хранения промежуточных результатов.</p><h2>Работа с графами</h2><p>Мы когда-то упоминали в <a href="https://tproger.ru/articles/chto-takoe-grafy-i-kak-ih-primenjat-v-analitike">этой статье</a>, графы используются для аналитики данных в backend-разработке. С помощью них определяется связь элементов друг с другом. Графы состоят из вершин, рёбер и весов, связей между рёбрами и вершинами.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/f419e12f-07b7-4183-873c-c1223189abca.png" alt="" /></figure><h3>Алгоритм Дейкстры: нахождение кратчайшего пути</h3><p><b>Алгоритм Дейкстры</b> используется для нахождения самого короткого пути от одной вершины ко всем остальным. Этот алгоритм работает в системах навигации и приложениях, где нужно подобрать самый оптимальный маршрут между двумя элементами. А ещё алгоритм Дейкстры используется, например, для определения поведения NPS в играх или чтобы понять, как будет двигаться робот в определённой местности.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/1e8b563a-782d-4be5-80f4-2769b58e19a6.png" alt="" /></figure><ol><li>Сначала определяется главная вершина. Расстояние до неё, при этом, равно нулю, а до всех остальных вершин задаётся вручную (ну или определяется автоматически).</li><li>И далее алгоритм идёт от соседней (относительно начальной) вершины до следующей. И так, пока цель не будет достигнута.</li></ol><p>Алгоритм Дейкстры имеет сложность O(V²), то есть, растёт квадратично. Сложность может уменьшиться до O(E log V) при работе с очередями приоритетности.</p><h3>Алгоритм Флойда-Уоршелла: нахождение всех кратчайших путей</h3><p>Если смысл Дейкстры в том, чтобы искать наиболее короткий путь от начальной вершины к остальным, то смысл алгоритма Флойда-Уоршелла в том, чтобы находить самый короткий путь между всеми вершинами.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/b220f7fc-57a1-4a6f-8c56-6bad1142cd42.png" alt="" /></figure><ol><li>Сначала создаётся матрица расстояний, где каждая ячейка [i][j] содержит вес ребра (i,j) или бесконечность, если ребра нет;</li><li>Для каждого узла проверяется возможности оптимизации пути между двумя другими узлами;</li><li>Далее матрица расстояний обновляется и ранжируется по самым коротким путям.</li></ol><p><b>Алгоритм Флойда-Уоршелла</b> имеет сложность O(V³), то есть, растёт кубически, и подходит для анализа связей между вершинами.</p><h3>Алгоритмы хеширования</h3><p><b>Хеш-функция</b> — алгоритм, который принимает обычный текст и преобразовывает его в хешированный размером в 128 бит. Хеширование используется в backend разработке, например, при создании ключей шифрования исходя из пароля.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/d53e40d8-b81b-4b68-afc9-482e34aea450.png" alt="" /></figure><p>К плюсам хеширования можно отнести то, что один текст имеет строго один хешированный «вариант», а оригинальный текст не получится восстановить только с помощью хеша.</p><p><b>MD5 </b>(алгоритм дайджеста сообщений 5) — самая популярная хеш-функция. Она используется для проверки целостности данных.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/65004206-f236-474c-a508-534635ab9b35.png" alt="" /></figure><p>Раньше считалось, что два разных фрагмента не могут дать один и тот же MD5 хеш. Но система была взломана: <a href="https://www.mscs.dal.ca/~selinger/md5collision/">в 2005 году</a> китайские криптологи опубликовали статью с описанием алгоритма, который помогает найти 2 разные последовательности, но с одним MD5 хешем.</p><p><b>SHA</b> — сразу несколько версий алгоритма (SHA-1, SHA-256, SHA-512). Сейчас распространены SHA-256 и SHA-512 с выходом дайджеста сообщений в 256 и 512 бит соответственно.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/2ca23ec2-d9df-49d6-af17-9a14650f10a1.png" alt="" /></figure><p>SHA используется для создания цифровых подписей и сертификатов безопасности — всё благодаря устойчивости алгоритма к «коллизиям» (иными словами, взломам) и постоянным обновлениям.</p><p><b>CRC32</b> (циклический избыточный код)<b> </b>— ещё одна хеш-функция для проверки целостности данных. CRC нельзя использовать для защиты данных от атак, поскольку ее основная задача — быстро обнаружить изменения данных при передаче или хранении.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/dd0259dc-85f5-43cc-9a3d-9b8cc21d1466.png" alt="" /></figure><p>CRC32 подходит для работы с сетевыми протоколами и для базового обеспечения целостности данных.</p><h2>Работа с деревьями</h2><p>Работа с <a href="https://tproger.ru/translations/binary-search-tree-for-beginners">деревьями</a> — основа backend разработки. С помощью нее можно эффективно и правильно организовывать и хранить данные.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/d61be107-536a-4443-ba93-df3406e7eacf.png" alt="" /></figure><h3>Алгоритм обхода деревьев (DFS, BFS)</h3><p>Обход деревьев, если коротко, нужен для того, чтобы обработать каждый узел в своём порядке. Есть 2 главных способа обхода: поиск в глубину (Depth-First Search, DFS) и поиск в ширину (Breadth-First Search, BFS).</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/0b71e14e-cdef-4b83-b721-29e613213929.png" alt="" /></figure><p><b>Принцип поиска в глубину (DFS)</b> — сначала анализируются все «вторичные» (ну или дочерние) узлы одного поддерева, а потом следующее поддерево. DFS полезен для того, чтобы сначала проанализировать все узлы, а потом уже искать элементы с определённым условием.</p><p><b>Принцип поиска в ширину (BFS)</b> — здесь анализируются все узлы на текущем уровне дерева, а уже потом осуществляется переход к следующему уровню. BFS подходит для нахождения кратчайшего маршрута в неглубоких структурах.</p><h3>Балансировка деревьев (AVL, красно-чёрное дерево)</h3><p>Без балансировки вставка и поиск могут занимать ну очень много времени из-за огромной глубины дерева данных.</p><p><b>AVL-деревья</b> — двоичное дерево поиска с быстрым доступом к данным. При каждом добавлении или удалении элемента дерево автоматически балансируется. А это означает, что сложность операций всегда будет равна O(log n).</p><p><b>Красно-чёрные деревья </b>менее сбалансированы по сравнению с AVL, зато операции вставки и удаления проводятся быстрее (за счёт меньшего количества вращений дерева).</p><p>Глобально: разница между двумя этими подходами в том, что: путь от корня (основания) дерева AVL — не более ~1,44 lg(n+2), а путь от корная красно-чёрного дерева — не более ~2 lg(n+1). AVL-деревья быстрее ищут данные, но требуют больше времени на вставку и удаление. А красно-чёрные деревья более простые и стабильные в реализации из-за меньших требований к балансировке.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/83fbcc2d-94e4-4faa-b815-535ec3f58c14.png" alt="" /></figure><h2>Алгоритмы сжатия данных</h2><p>Алгоритмы сжатия данных нужны для обработки и передачи больших объёмов информации в backend разработке. А потому и нужна оптимизация.</p><h3>Huffman Coding: оптимизация хранения и передачи данных</h3><p><b>Алгоритм Хаффмана</b> (Huffman Coding) — один из видов алгоритмов префиксного кодирования. С помощью него можно уменьшить размер данных, при этом, «выигрывая» как в скорости, так и в объёме.</p><p>Символы, которые появляются чаще всего, кодируются более короткими последовательностями, а символы, встречающиеся реже, имеют более длинную последовательность.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/80109697-d66e-445e-be21-d2105067bd4f.png" alt="" /></figure><p>Код Хаффмана — основа форматов сжатия по типу JPEG и MP3.</p><h3>LZ77/LZ78: алгоритмы для компрессии больших объёмов данных</h3><p>Алгоритмы семейства Lempel-Ziv — база современных методов сжатия без потерь качества и производительности. С помощью них большие по объёму данные сжимаются за счёт поиска повторяющихся последовательностей внутри массива.</p><p><b>Принцип работы LZ77</b> — второе и последующее совпадение данных ссылается на самое первое совпадение.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/2136cb98-6fc3-41b1-bb43-c5c643259680.png" alt="" /></figure><p><b>Принцип работы LZ78</b> — создание динамического словаря «фраз» по мере обработки данных. В процессе добавляются новые комбинации символов («фразы») по мере их обнаружения.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/eece1565-5093-4af1-9c0b-3a0450799eda.jpg" alt="" /></figure><p>На этих алгоритмах строится форматы архивирования файлов по типу ZIP и GZIP.</p><h2>Жадные алгоритмы</h2><p>Жадные алгоритмы — класс алгоритмов, внутри которых данные принимаются локально. «Жадными» они названы потому, что требуется найти самый оптимальный способ решения с минимальными затратами в backend-разработке.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/5104f87d-5821-4740-9e67-91babfa35e56.png" alt="" /></figure><h3>Алгоритмы «наиболее подходящего выбора»: оптимизация решений</h3><p>Фишка жадных алгоритмов в том, что каждый шаг локально выбирается лучшим. При этом финальный результат не может быть самым оптимальным. Поэтому важно внимательно анализировать условия задачи.</p><p><b>Задача о рюкзаке</b> — здесь вам нужно выбрать максимальное количество предметов (рёбер) по большей стоимости (ценности) без превышения вместимости (веса) рюкзака (контейнера). В жадном подходе все предметы сортируются по стоимости за единицу веса и добавляются в рюкзак в порядке убывания.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/1487ddf3-b5e0-4801-8c1d-c201ecac1636.jpg" alt="" /></figure><p><b>Минимальное остовное дерево через алгоритм Прима.</b> Здесь поэтапно выбирается ребро с минимальным весом, которое соединяет уже включенные вершины с остальными.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/a97b0cd2-2501-438a-9fe4-a853a1fb8ee6.png" alt="" /></figure><p><b>Алгоритм Дейкстры</b> мы уже разбирали выше. Если коротко: он используется для поиска кратчайшего пути от одной вершины графа до всех остальных. Основывается на выборе наименьшей стоимости пути из всех доступных на каждом шаге.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/a4c2a039-9918-4f46-be07-9fba63f9cfd5.jpg" alt="" /></figure><h2>Динамическое программирование</h2><p>С помощью динамического программирования решаются задачи оптимизации в backend-разработке. Происходит разбивка одной большой задачи на более простые. При этом, используется информация об уже проведённых вычислениях, чтобы не было повторов.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/e6f71da7-916b-4065-8116-155021cb9319.png" alt="" /></figure><h3>Алгоритм поиска подстроки (Longest Common Subsequence): анализ строк</h3><p>Грубо говоря, этот алгоритм помогает найти определённый повторяющийся сценарий в тексте. Если строка содержит этот паттерн, то вы получаете ответ «да» или прямую ссылку, где этот паттерн впервые был представлен. Это в целом основной принцип криптографии, архивирования и компиляции.</p><p>Алгоритм имеет сложность O(n*m), где n и m — длины сравниваемых между собой строк. При этом, таблица с выводами заполняется последовательно, по мере нахождения паттернов.</p><h2>Алгоритмы для работы с потоками данных</h2><p>Для обработки данных в backend в режиме реального времени используются специальные алгоритмы: <b>Sliding Window и Bloom Filter</b> — с максимальной итоговой производительностью.</p><h3>Sliding Window: обработка данных в реальном времени</h3><p><b>Алгоритм скользящего окна</b> используется для обработки непрерывного потока данных. Данные здесь разбиваются на небольшие окна определённой длины. Даже при самых высоких нагрузках и минимальном времени, весь поток хранить не нужно — и всё это благодаря скользящему окну.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/bc15a23a-2f50-43cd-a77e-3a71079f06fb.png" alt="" /></figure><p>Со скользящим окном можно работать при мониторинге трафика или отслеживании активности пользователей. При этом, всю историю наблюдений загружать не нужно — анализируются данные только конкретного окна.</p><h3>Bloom Filter: проверка существования элемента в наборе</h3><p><b>Фильтр Блума</b> — структура данных, которая используется для того, чтобы проверить, принадлежит ли конкретный элемент конкретному массиву данных.</p><figure><img src="https://media.tproger.ru/user-uploads/106063/2025-02-03/85d63420-3fb5-4204-9524-6af32af967e7.jpg" alt="" /></figure><p>Фильтр Блума занимает гораздо меньше места в сравнении с обычными структурами данных. С помощью него можно быстро проверить существование элемента через использование нескольких хеш-функций. По такому же принципу работает спам-фильтр в почтовом клиенте.</p><p>Все перечисленные и описанные выше алгоритмы критически важны для реализации практически любых задач backend’а. Как правило, их не нужно реализовывать с нуля, но нужно понимать принцип работы каждого. Потому что именно от сложности зависит время, которое тратится на решение конкретной задачи.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как теория графов изменила коррекцию ошибок при передаче данных</title>
      <link>https://tproger.ru/news/kak-teoriya-grafov-izmenila-korrekciyu-owibok-pri-peredache-dannyh</link>
      <comments>https://tproger.ru/news/kak-teoriya-grafov-izmenila-korrekciyu-owibok-pri-peredache-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kak-teoriya-grafov-izmenila-korrekciyu-owibok-pri-peredache-dannyh</guid>
      <description><![CDATA[<p>Теория многомерных графов произвела революцию в области коррекции ошибок при передаче данных. В ноябре 2023 года ученые представили метод «локальной тестируемости», который значительно ускоряет проверку ошибок и повышает надежность передачи данных даже в условиях высокого уровня шума</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kak-teoriya-grafov-izmenila-korrekciyu-owibok-pri-peredache-dannyh">Как теория графов изменила коррекцию ошибок при передаче данных</a>»</p>]]></description>
      <category><![CDATA[Криптография]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Sep 2024 03:24:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>В середине XX века ученые столкнулись с задачей борьбы с ошибками, возникающими при передаче данных из-за шума.</p><p>Сейчас же появилась информация о том, что еще в ноябре 2023 года исследователи из Института Вейцмана и Еврейского университета предложили новое решение на основе многомерных графов.</p><p>Этот метод, называемый «локальной тестируемостью», позволяет быстро обнаруживать ошибки, проверяя лишь небольшие участки данных.</p><p>Основная идея заключается в том, что при искажении одного бита можно выявить ошибку по проверке нескольких точек, что значительно ускоряет процесс проверки.</p><h2>Использование многомерных графов</h2><p>Графы стали ключевым инструментом в новом подходе.</p><p>Исследователи разработали уникальную математическую структуру, которая соединяет биты данных с проверочными битами с помощью сложных многомерных связей.</p><p>В отличие от традиционных графов, их многомерные «братья» создают более плотные и сложные связи, позволяя обнаружить ошибки практически мгновенно.</p><h2>Значение открытия</h2><p>Открытие теоретически и практически подтверждает возможность создания кодов с локальной тестируемостью, которые одновременно обеспечивают высокую скорость передачи данных и устойчивость к шуму.</p><p>Этот метод может найти применение в телекоммуникациях, криптографии и других областях, где важна высокая надежность при передаче данных.</p>]]></content:encoded>
    </item>
    <item>
      <title>Обзор библиотек для работы с графами в Python: NetworkX и Graph-tool</title>
      <link>https://tproger.ru/articles/obzor-bibliotek-dlya-raboty-s-grafami-v-python--networkx-i-graph-tool</link>
      <comments>https://tproger.ru/articles/obzor-bibliotek-dlya-raboty-s-grafami-v-python--networkx-i-graph-tool?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/obzor-bibliotek-dlya-raboty-s-grafami-v-python--networkx-i-graph-tool</guid>
      <description><![CDATA[<p>Библиотеки для работы с графами в Python. Показываем, как работать с NetworkX и Graph-tool. Рассматриваем возможные варианты и пошаговую инструкцию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/obzor-bibliotek-dlya-raboty-s-grafami-v-python--networkx-i-graph-tool">Обзор библиотек для работы с графами в Python: NetworkX и Graph-tool</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 28 Aug 2024 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>В математике и программировании графы — это структурированная группа данных, которые представляют собой связанные элементы. Благодаря гибкости этих элементов и их способности сохранять данные в удобной для использования форме, они широко применяются в программировании и сфере технологий. В настоящее время одна из самых популярных отраслей, в которых используются графы — машинное обучение.</p><p>Для работы с графами созданы библиотеки Python, наиболее востребованные из них — это NetworkX и Graph-tool. В нашем обзоре мы расскажем об этих продуктах, а также выясним практические аспекты работы с графами в программировании.</p><h2>Что такое графы и как они используются в программировании</h2><p>Графы — это связанные между собой элементы, называемые узлами или вершинами. Это узлы содержат определенную информацию и соединяются с помощью ребер, что делает каждый граф определенной структурой данных.</p><p>На практике любые массивы информации можно разложить на простые графы. Даже картинки на экране — это сетка связанных друг с другом пикселей, а текст — последовательность букв и слов. Несмотря на относительно простую структуру графов, некоторые задачи решить без них невозможно.</p><p>Наглядный пример: бизнесмену нужно посетить несколько городов в ходе деловой поездки. Известны расстояния между населенными пунктами, затраты на проезд на различных видах транспорта. Так, пользователю необходимо построить оптимальный маршрут — потратить минимум денег либо проехать минимальное расстояние, то есть провести как можно меньше времени в пути.</p><p>Такая задача выглядит простой, но представьте, если узлов (городов) несколько десятков, а стоимость проезда на одном том же виде транспорта зависит от размера багажа, времени суток и других факторов.</p><p>Подобные задачи ежедневно приходится решать логистическим компаниям, и без графов разобраться с ними крайне непросто. Как ни пытайся представить эти данные, в итоге получится структурированный граф с ребрами, имеющими обозначенную ценность (в нашем случае в виде расстояния и/или стоимости проезда). При этом могут быть и дополнительные условия — например, посетить каждый город можно только один раз. С помощью графов решаются задачи, в которых количество узлов и связей между ними может быть огромным.</p><p>Сами по себе графы — один из наиболее древних способов структурирования информации. С помощью кружочков и линий проще всего представить связь между объектами. При этом на основании существующих связей пользователь может прогнозировать вероятные взаимодействия узлов друг с другом. Например, если объект А знаком с объектами В и С, есть высокая вероятность, что В и С тоже знакомы или познакомятся в будущем.</p><p>Собственно теория графов была сформулирована еще в XVIII веке и изучалась в рамках задач дискретной математики. Сама теория не относится к самым сложным разделам математической науки, поскольку обладает наглядностью, может быть представлена схематические и имеет прикладное применение. Помимо математики, графы используются в социологии, различных отраслях химии, биологии и других науках. С развитием компьютерной техники практическое применение теории графов вышло на новую ступень.</p><h2>Графы в программировании</h2><p>Основа графа, то есть набор связанных на разных уровнях узлов, оказывается крайне полезной для решения реальных задач как в программировании в целом, так и в конкретных направлениях — аналитике, машинном обучении, операциях с данными.</p><p>Работу с графами специалисты рассматривают на трех основных уровнях:</p><ul><li><b>Узлы.</b> На этом уровне каждому узлу в графе присваиваются метки. Вариантов применения теории в этой ситуации множество. Например, из общественных наук известно, что человек зависит от его окружения. Таким образом, личность можно изучить, проанализировав ее контакты. Аналогичным образом можно классифицировать любую сущность, выяснив связи с другими вершинами.</li><li><b>Ребра.</b> Здесь решаются такие задачи, как прогнозирование ребер, то есть наличие связи между двумя узлами. При этом ребра могут быть нескольких типов — такие структуры называются мультиграфами.</li><li><b>Графы</b>. Это классификация, генерация и другие операции с графами. Такое направление особенно актуально для научных исследований в химии, биологии, фармакологии, где в виде графов рассматриваются молекулы.</li></ul><p>Базы знаний также можно рассматривать с точки зрения графов. Например, существует ресурс Wikidata, который постоянно обновляется и в настоящий момент содержит более 100 млн узлов. Здесь присутствует более 400 разновидностей ребер, то есть связей между узлами данных. Информация структурирована и может быть использована для обработки машинами.</p><p>Сведения в базе можно визуализировать, выявляя связи между между узлами одного порядка — историческими событиями, географическими объектами и другими фактами.</p><p>Графовая аналитика — обширный раздел математики и программирования, в котором исследуются зависимости между конкретными узлами. Именно аналитическая работа помогает навигаторам составлять оптимальный маршрут на местности, а транспортным компаниям — определять наиболее выгодное расположение логистических центров и складов.</p><p>На графах работают рекомендательные алгоритмы в маркетинге — мы видим рекламу и предложения в гаджетах и на страницах в интернете именно благодаря проделанной программами аналитической работе с узлами и ребрами.</p><p>Графовые аналитики определяют площади покрытия вышек сотовой связи, распределяя мощности таким  образом, чтобы каждый пользователь оставался в зоне доступности сигнала.</p><p>В финансовом секторе аналитика графов используется для определения степени благонадежности клиента, претендующего на кредит, а также для выявления мошенников.</p><p>Иными словами, теория графов используется практически во всех направлениях прикладного программирования, а также в фундаментальных научных исследованиях. Самые очевидные варианты применения — оптимизация информационных сетей, разработка поисковых алгоритмов, упорядочивание без данных и структуры сайтов.</p><p>На базе языка программирования Python созданы библиотеки для работы с графами. Рассмотрим наиболее востребованные из них, изучим их преимущества и ограничения.</p><h2>NetworkX: введение и основные возможности</h2><p>Как только пользователь начинает проделывать какие-либо манипуляции с графами, он обязательно сталкивается с необходимостью использования этой библиотеки, поскольку она наиболее удобна и была создана специально для изучения и применения графов в программировании и научной работе.</p><p><a href="https://networkx.org/documentation/stable/index.html">NetworkX</a> предоставляет следующие возможности:</p><ul><li>Работа со всеми типами графов, например, простыми или ориентированными.</li><li>Операции с данными, представляющими вершины графов. Это могут быть изображения, тексты, цифровые таблицы, временные ряды и другие виды узлов.</li><li>Вычисление характеристики графов — размерности, длины ребер, свойств вершин и других показателей.</li><li>Визуализация сетей информации в виде двухмерных и трехмерных диаграмм и графиков.</li><li>Преобразование графов в более удобные форматы для их хранения, передачи либо загрузки.</li></ul><p>В библиотеке NetworkX есть множество готовых алгоритмов и инструментов для работы с графами. Они позволяют выполнять типовые манипуляции с сетями — находят кратчайший путь, производят кластеризацию и поиск данных.</p><p>Для визуализации используют совместимую библиотеку Matplotlib, а также стороннюю программу для создания графиков Graphviz, которая позволяет работать со сложными сетевыми структурами.</p><p>Основные преимущества NetworkX в Python:</p><ul><li><b>Высокая производительность.</b> Библиотека предоставляет возможность без проблем манипулировать крупными графами с числом вершин до 10 млн и ребер до 100 млн. Это позволяет работать с массивами данных — например, выгрузкой из соцсетей с многочисленной аудиторией.</li><li><b>Удобство в работе.</b> Продуктом пользуются как профессиональные разработчики, так и любители. Встроенные модули визуализации отвечают за наглядность результатов, при этом коррекция возможна в реальном времени.</li><li><b>Эффективность.</b> Поскольку библиотека написана на низкоуровневой структуре, аппаратные и программные ресурсы оборудования расходуются в оптимальном режиме. У пользователя есть дополнительные возможности по масштабированию, он менее зависим от технических ограничений.</li><li><b>Открытый исходный код.</b> Разработчик может настраивать библиотеку NetworkX и расширять ее функционал в соответствии с конкретными задачами. Кроме того, пакет легко интегрируется с другим ПО.</li><li><b>Поддержка.</b> У NetworkX есть подробная документация, в которой хорошо описаны все функции и ограничения библиотеки. В обновляемых репозиториях собраны готовые решения для программистов, значительно упрощающие работу.</li><li><b>Обширное комьюнити.</b> Поскольку библиотека находится в свободном доступе, вокруг продукта сформировалось многочисленное сообщество пользователей — если возникнут сложности, у них всегда можно попросить помощи.</li></ul><p>Значимым ограничением эксперты считают лимитированное количество узлов и ребер графов: для решения некоторых задач даже такого количества недостаточно. Кроме того, опытные программисты отмечают, что NetworkX работает медленнее, чем другие библиотеки. Это обстоятельство имеет значение для тех проектов, в которых важна скорость вычислений.</p><h2>Graph-tool: введение и основные возможности</h2><p><a href="https://git.skewed.de/count0/graph-tool">Библиотека Graph-tool</a> предназначена для операций с графами и статистического анализа сетей. В отличие от большинства аналогичных модулей Python, часть алгоритмов и структур пакета реализована на C++ с обширным использованием шаблонного метапрограммирования. Эта особенность делает библиотеку крайне производительной, что по использованию памяти и скорости вычислений приближает ее к показателям чистых библиотек на C++.</p><p>Функционал Graph-tool довольно разнообразен:</p><ul><li>быстрая работа с вершинами, ребрами и собственно графами;</li><li>фильтрация вершин и ребер в онлайн-режиме;</li><li>простой ввод и вывод графов в форматах GraphML, GML и dot-файлов;</li><li>обширная статистика — гистограммы степеней и свойств, средние расстояния и другие показатели;</li><li>использование стандартных структурных алгоритмов;</li><li>аналитика, поиск модулей на основе статистических данных.</li></ul><p>Несмотря на то, что библиотека Graph-tool создана около 15 лет назад, она до сих пор востребована в научных разработках и программировании. Популярность пакета обусловлена его преимуществами:</p><ul><li><b>Высокая производительность</b> благодаря реализации основных алгоритмов на C++. По этому показателю Graph-tool на порядок превосходит другие библиотеки.</li><li><b>Мощная визуализация.</b> С этой библиотекой легко создавать графики, используя разные алгоритмы и форматы вывода, в том числе непосредственно на экран. У Graph-tool собственные методы компоновки и интерактивные процедуры рисования.</li><li><b>Полная документация. </b>Каждая функция библиотеки описана в открытой документации. Здесь же приведено множество примеров использования Graph-tool на практике.</li><li><b>Открытый исходный код.</b> Программисты могут модифицировать модуль в зависимости от своих целей и задач.</li></ul><p>Сообщество Graph-tool не так велико, как у NetworkX, поскольку первым пользуются преимущественно профессиональные разработчики.</p><h2>Сравнение NetworkX и Graph-tool</h2><p>Сравним две популярные библиотеки по основным критериям:</p><ul><li><b>Производительность.</b> По этому показателю Graph-tool опережает NetworkX, особенно если задача связана с большими графами. Преимущество Graph-tool обусловлено реализацией на C++ и поддержкой OpenMP для параллельного запуска нескольких алгоритмов.</li><li><b>Простота применения. </b>Освоить NetworkX гораздо проще, поэтому библиотека подходит для начинающих программистов. Graph-tool — продукт для более опытных разработчиков.</li><li><b>Функциональность.</b> Оба пакета обладают внушительным функционалом, однако Graph-tool ориентирован на более сложные вычислительные задачи.</li><li><b>Визуализация.</b> NetworkX предлагает простые и понятные инструменты визуализации, при этом у Graph-tool — более требовательные и продвинутые решения.</li><li><b>Документация и сообщество.</b> У NetworkX более обширная база пользователей и более подробная документация. Это объясняется востребованностью библиотеки среди любителей.</li></ul><p>Как видите, по ряду параметров Graph-tool превосходит NetworkX, однако это не значит, что она лучше. Все зависит от целей применения — в разных ситуациях пригодятся разные инструменты.</p><h2>Когда использовать NetworkX, а когда Graph-tool</h2><p>Применение NetworkX оправдано при решении более простых задач, связанных с графами. Кроме того, использовать эту библиотеку стоит разработчикам, которые только начинают осваивать пакеты на Python, при этом скорость вычислений графов не так важна.</p><p>Graph-tool — более профессиональный инструмент с крутыми возможностями, которых просто нет в большинстве аналогичных пакетов. Библиотека интегрирована с обширным хранилищем сетевых данных Netzschleuder, что позволяет напрямую загружать информацию с этого ресурса.</p><p>Graph-tool будет предпочтительным решением для работы с крупномасштабными сетями и графами в фундаментальных научных исследованиях. Если нужно обрабатывать огромные массивы данных, вычисления будут более быстрыми.</p><p>В свою очередь NetworkX хорошо подходит для обучения — с этой библиотекой легко освоить саму теорию графов с точки зрения математики. Пакет позволяет работать с данными как на уровне алгебраических понятий, так и посредством геометрической визуализации.</p><p>Для новичков это довольно эффективный метод обучения. Кроме того, с NetworkX удобно изучать смежные дисциплины — например, теорию вероятности, комбинаторику. Библиотека востребована и в социологических исследованиях — инструмент используется для аналитики сообществ и поиска взаимосвязей в них.</p>]]></content:encoded>
    </item>
    <item>
      <title>Графовые базы данных: на примере творчества Beatles</title>
      <link>https://tproger.ru/articles/grafovye-bazy-dannyh</link>
      <comments>https://tproger.ru/articles/grafovye-bazy-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Ржевская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/grafovye-bazy-dannyh</guid>
      <description><![CDATA[<p>Графовые базы данных — удобный инструмент, когда проект требует хранить данные с высокой степенью связности и часто их изменять. Разбираемся, в чем плюсы такой системы, и представляем творчество «Битлов» в виде графа</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/grafovye-bazy-dannyh">Графовые базы данных: на примере творчества Beatles</a>»</p>]]></description>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 10 Aug 2024 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Представляем творчество Beatles в виде графа вместе с тестировщиками Noveo!</i></p><h2>Что такое графовые базы данных и зачем они нужны</h2><p>Проблема хранения данных со сложными связями между объектами остро стоит во множестве проектов. Реляционные базы данных оказываются неподходящим решением, поскольку не обеспечивают оптимальный поиск и взаимодействие с данными.</p><p>В этом случае на помощь приходят графовые базы данных. Они основаны на графовой модели, где граф состоит из <b>вершин (узлов)</b> и соединяющих их <b>ребер.</b></p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/acb55f87-e913-44fd-ac40-1dfdd894939a.jpg" alt="" /></figure><p>В графовой базе узлы — это сущности, из которых состоит база, а ребра — это типы отношений между сущностями. У узлов и ребер могут быть <b>свойства</b>, дающие дополнительную информацию о сущностях и отношениях между ними. Свойство — своего рода аналог ключа, который используется в реляционной базе данных.</p><p>Графовую базу данных можно изобразить как социальную сеть, в которой люди, относящиеся к различным группам, связаны друг с другом. Человека можно представить в виде узла c маркером «Person». У таких узлов есть свойства «Name», «Gender», «Location» и «Email». Типом отношений в такой базе выступает статус дружбы между людьми — «:FRIENDS_WITH», у которого также есть свойство «YearsOfFriendship» (продолжительность дружбы). Человек (узел «Person») связан со своим местом нахождения (узел «Location») через отношение «:LIVES_IN».</p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/3b5ea319-e9e5-4ab6-bea8-63706a97ba35.jpg" alt="" /></figure><p>Преимущество подобной системы в том, что можно легко модифицировать список свойств того или иного узла: это делает систему более гибкой по сравнению с реляционной, где в таблицу пришлось бы добавлять или удалять столбец, соответствующий тому или иному атрибуту.</p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/03049441-b496-47af-b1dd-b7466ea91906.jpg" alt="" /></figure><p>Для того чтобы определиться, подходит ли графовая база именно под задачи вашего текущего проекта, полезно будет ответить на следующие вопросы:</p><ul><li><b>Являются ли данные в системе высоко связанными?</b> Графовые базы удобны в тех случаях, когда данные имеют высокую степень связности и требуют значительного анализа внутренних отношений.</li></ul><ul><li><b>Является ли извлечение данных более приоритетным по сравнению с их хранением? </b>Графовые базы оптимизированы для извлечения данных. Если вам часто нужно это действие, графовые базы для вас предпочтительны.</li></ul><ul><li><b>Насколько часто меняется модель данных? </b>Если модель данных неустойчива и требует частых изменений, удобно использовать графовые базы – они ориентированы на сами данные, что делает их достаточно гибкими.</li></ul><p>Еще одним важным термином, связанным с графовыми базами данных, является <b>RDF (Resource Description Framework, среда описания ресурса)</b> — модель представления данных в виде, пригодном для машинной обработки.</p><p>Ресурсом в RDF может быть любая сущность — как информационная (веб-сайт или изображение), так и неинформационная (человек, город и т.д.). Утверждение, высказываемое о ресурсе, является триплетом «Субъект — Предикат — Объект». Множество таких триплетов образуют ориентированный граф, в котором вершинами (узлами) являются субъекты и объекты, а ребрами (отношениями) — предикаты.</p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/84a2b972-382f-4753-a1d6-173192e4547e.jpg" alt="" /></figure><p>Для работы с RDF-данными существуют специальные языки. Один из самых распространенных — SPARQL (Simple Protocol and RDF Query Language).</p><p>Основные запросы для данного языка:</p><ul><li><b>SELECT</b> (извлечение необработанных значений и их представление в виде таблицы),</li></ul><ul><li><b>CONSTRUCT</b> (извлечение информации в формате RDF и преобразование результатов к определенной форме),</li></ul><ul><li><b>ASK</b> (формирование запроса типа Истина/Ложь),</li></ul><ul><li><b>DESCRIBE</b> (получение описания RDF-ресурса).</li></ul><p>Существует несколько ключевых терминов, относящихся к типам узлов и ребер в <b>RDF</b>-графе:</p><ul><li><b>IRI (Internationalized Resource Identifier) —</b> строка, однозначно идентифицирующая тот или иной узел и ребро. Использование IRI позволяет избежать повторения имен и возможных коллизий на этой почве.</li></ul><ul><li><b>Blank node (bnode, Пустой узел)</b> — этот узел используется, когда нет необходимости прямой ссылки на него. Он может быть достигнут через направленное ребро от других узлов.</li></ul><ul><li><b>Literals (Литералы)</b> — определенные значения, используемые для представления данных разных типов (строки, числа и даты). В отличии от IRIs и Blank Nodes, в триплете литералы могут быть только объектами. Примером литерала может служить обозначение даты: “YYYY-MM-DD”^^xsd:date, или указание языка строки: “some string”@en. В некоторых случаях литерал может опускаться. Например, для записи целочисленного значения полная запись с литералом выглядит следующим образом: 100^^xsd:integer. Без явного обозначения литерала будет записано лишь само число — 100.</li></ul><h2>Творчество The Beatles в виде графа</h2><p>На рисунке изображен фрагмент графа, относящегося к творчеству группы <b>The Beatles:</b></p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/64b1e428-2f7d-4421-866b-32cb4e5ed9f6.jpg" alt="" /></figure><p>Схематическое представление является наглядным и визуально понятным, но, если мы имеем дело с большим объемом данных и выполняем над ними некоторые действия (обмен, загрузка), оно может оказаться непригодным, поэтому существует несколько вариантов синтаксиса представления RDF-графа в текстовом формате. Описанный фрагмент в так называемом Turtle формате будет иметь вид списка, в котором на отдельной строке перечислены все триплеты, отделенные друг от друга символом «.».</p><p>PREFIX :</p><p>PREFIX rdf:</p><p>PREFIX xsd:</p><p>:The_Beatles rdf:type :Band .</p><p>:The_Beatles :name “The Beatles” .</p><p>:The_Beatles :member :John_Lennon .</p><p>:The_Beatles :member :Paul_McCartney .</p><p>:The_Beatles :member :Ringo_Starr .</p><p>:The_Beatles :member :George_Harrison .</p><p>:John_Lennon rdf:type :SoloArtist .</p><p>:Paul_McCartney rdf:type :SoloArtist .</p><p>:Ringo_Starr rdf:type :SoloArtist .</p><p>:George_Harrison rdf:type :SoloArtist .</p><p>:Please_Please_Me rdf:type :Album .</p><p>:Please_Please_Me :name “Please Please Me” .</p><p>:Please_Please_Me :date “1963-03-22″^^xsd:date .</p><p>:Please_Please_Me :artist :The_Beatles .</p><p>:Please_Please_Me :track :Love_Me_Do .</p><p>:Love_Me_Do rdf:type :Song .</p><p>:Love_Me_Do :name “Love Me Do” .</p><p>:Love_Me_Do :length 125 .</p><p>:Love_Me_Do :writer :John_Lennon .</p><p>:Love_Me_Do :writer :Paul_McCartney .</p><p>Список PREFIX в начале записи определяет общую часть IRIs для сущностей в данном графе. Указав ее один раз, мы избавляемся от необходимости каждый раз добавлять эту запись. Например, полная запись IRI, соответствующая сущности «группа “The Beatles”» выглядела бы следующим образом: &lt;http://stardog.com/tutorial/The_Beatles&gt;, однако замена общей части &lt;http://stardog.com/tutorial/&gt;  на символ «:» делает обозначение данной сущности значительно более компактным и удобным для восприятия — «:The_Beatles».</p><p>Графовые базы данных являются удобным инструментом для тех случаев, когда данные имеют высокую степень связности, а модель данных неустойчива и требует частых изменений. А с помощью удобного языка запросов SPARQL можно с легкостью извлекать необходимые данные.</p>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритм Дейкстры: как работает и где используется</title>
      <link>https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya</link>
      <comments>https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дарья Закаулова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya</guid>
      <description><![CDATA[<p>Алгоритм Дейкстры: поиск кратчайших путей в графе. Разбираем сложность O(n²+m), реализацию на C++, ограничения и применение в навигации и компьютерных сетях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya">Алгоритм Дейкстры: как работает и где используется</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 06 Jun 2024 10:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Зачем нужен этот алгоритм</h2><p><b>Алгоритм Дейкстры</b> — это алгоритм на графах для нахождения кратчайших путей от заданной вершины до всех остальных вершин во взвешенном графе с неотрицательными весами рёбер, предложенный нидерландским математиком Эдсгером Дейкстрой в 1956 году. Алгоритм Дейкстры используют для решения «задачи о кратчайших путях с единственным источником». Она заключается в поиске кратчайших путей от заданной вершины до всех остальных во взвешенном графе с неотрицательными весами.</p><p>Алгоритм Дейкстры — классический алгоритм нахождения кратчайших путей от одной вершины до всех остальных во взвешенном графе с неотрицательными весами рёбер.</p><p>Сложность простейшей реализации — <b>O(n² + m)</b>, с очередью приоритетов (двоичной кучей) — <b>O((n + m) log n)</b>, что делает алгоритм эффективным на разреженных графах.</p><p>Алгоритм не работает с отрицательными весами рёбер. Для таких задач используют алгоритм Беллмана-Форда (сложность O(nm)) или алгоритм Джонсона.</p><p>Применяется в навигации (Google Maps, GPS), маршрутизации в компьютерных сетях (OSPF), робототехнике, системах бронирования и игровых движках.</p><p>Для закрепления материала рекомендуем порешать задачи на acmp.ru — ссылки на практические задачи приведены в конце статьи.</p><p>Далее будем использовать следующие обозначения, описывающие характеристики графа:</p><ul><li><b>n — </b>количество вершин в графе;</li><li><b>m —</b> количество ребер в графе;</li><li><b>s —</b> стартовая вершина.</li></ul><p>Алгоритм Дейкстры выполняется за n итераций. На каждой итерации выбирается вершина <b>v</b> с минимальным значением <b>d[v]</b> среди непомеченных вершин. Эта вершина <b>v</b> затем отмечается как помеченная.</p><p>Далее на текущей итерации происходит этап релаксации. В этом этапе просматриваются все ребра <b>(v, to)</b>, исходящие из вершины <b>v</b>, и проверяется, можно ли улучшить значение<b> d[to]</b>.</p><p>То есть, если длина рассматриваемого ребра равна <b>l</b>, тогда <b>d[to] = min(d[to], d[v] + l)</b>. При успешной релаксации, то есть когда удалось улучшить расстояние до вершины <b>to</b>, в массиве <b>p</b> указывается, что предшественником на кратчайшем пути к вершине <b>to</b> является вершина <b>v</b>, то есть <b>p[to] = v</b>.</p><p>На этом итерация заканчивается.</p><p>По завершении <b>n</b> итераций все вершины графа оказываются помеченными, и алгоритм заканчивает выполнение.</p><p>Важно заметить, что если из начальной вершины <b>s</b> невозможно построить путь до некоторых вершин графа, их значения <b>d[v]</b> останутся бесконечными. Алгоритм можно завершить досрочно, как только будет выбрана вершина с бесконечным значением расстояния.</p><p>Рассмотрим работу алгоритма на примере. Будем искать кратчайшие пути от вершины <b>4</b>.</p><p>Изначально массивы <b>u</b> (посещений), <b>d</b> (расстояния) и <b>p</b> (предков) для графа из примера имеют следующие значения:</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/2bbde186-cac1-4280-9f92-3c033151316a.png" alt="" /><figcaption>Изначальные значения</figcaption></figure><p>На первой итерации мы выбираем вершину <b>v</b> с наименьшим значением <b>d[v]</b>. Очевидно, что на первом шаге будет выбрана стартовая вершина — <b>4</b>.</p><p>Помечаем её посещённой <b>u[4] = true</b>.</p><p>Дальше проходим по всем соседям вершины <b>4</b> и пытаемся улучшить для них значения в массиве <b>d</b>. Для всех вершин, расстояние до которых удалось улучшить, в список предков записываем вершину <b>4</b>. На первой итерации удалось улучшить расстояния до вершин <b>1, 5, 6</b>. В результате значения массивов <b>u, d, p </b>изменились следующим образом:</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/5a04596c-2471-4a1c-a123-7634520f5c95.png" alt="" /><figcaption>После первой итерации</figcaption></figure><p>На следующем шаге выбираем вершину <b>6</b>. Улучшаем расстояния до вершин <b>3</b> и <b>7</b>. 
<br /></p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/fa317dcf-256f-4bd4-ab15-a173695cd48a.png" alt="" /><figcaption>После второй итерации</figcaption></figure><p>Следующая непосещённая вершина с минимальным весом — <b>1</b>.</p><p>Расстояние от вершины <b>4</b> до вершины <b>1</b> равняется <b>3</b>. Пытаемся улучшить расстояние до всех её соседей. Так, например, можно улучшить расстояние до вершины <b>5</b>. Ранее оно было равно <b>8</b>, а после релаксации это значение уменьшается:</p><p><b>d[5] = min(d[5], d[1] + l) = min(8, 3 + 2) = 5.</b></p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/5d785bba-7bd8-4f26-8e62-470b7fa1f20e.png" alt="" /><figcaption>После третьей итерации</figcaption></figure><p>И аналогичным образом мы проходим все оставшиеся итерации.</p><p>Выбираем непосещённую вершину с минимальным значением <b>d[v]</b>. На этой итерации будет выбрана вершина <b>7</b>. Ни для одного её соседа длину кратчайшего пути улучшить не удалось.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/756f155b-4470-4f7f-b630-95c28bf34c5f.png" alt="" /><figcaption>После четвёртой итерации</figcaption></figure><p>На следующей итерации будет посещена вершина <b>2</b>. От неё удалось улучшить путь до вершин <b>0</b> и <b>3</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/40e8c044-601f-4f9c-93a3-c8db6981f782.png" alt="" /><figcaption>После пятой итерации</figcaption></figure><p>Далее посетив вершину <b>5</b> улучшаем путь до вершины <b>8</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/722ecf97-67fc-47e5-b8d5-7d3f6b5c137a.png" alt="" /><figcaption>После шестой итерации</figcaption></figure><p>На последующих итерациях помечаются посещёнными вершины <b>8</b>, <b>0</b> и <b>3</b>. От них нельзя улучшить путь ни до одного из их соседей.</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/55bbebf8-80d5-4e60-8d50-086a6468188f.png" alt="" /><figcaption>После седьмой итерации</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/78b86f35-abde-47a9-adb4-18ff7fef1e74.png" alt="" /><figcaption>После восьмой итерации</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/b60d9e9d-0454-496f-af98-92c550bf4f5e.png" alt="" /><figcaption>После девятой итерации</figcaption></figure><p>После окончания работы алгоритма значения массивов <b>u, d, p</b>:</p><figure><img src="https://media.tproger.ru/user-uploads/100452/2024-06-05/ad1f1bef-84ea-433c-951f-b14f5d5cbd28.png" alt="" /><figcaption>После десятой итерации</figcaption></figure><h2>Реализация на C++</h2><p>Оценим скорость работы алгоритма. Он состоит из <b>n</b> итераций, внутри каждой из которых осуществляется поиск вершины с наименьшим значением <b>d[v]</b> (при простейшей реализации n итераций). Также за время работы алгоритма <b>m</b> раз производится попытка релаксации.</p><p>Таким образом асимптотика алгоритма равняется <b>O(n^2+m)</b>.</p><p>С учётом оценки скорости работы алгоритма очевидно, что на его производительность влияет плотность графа. Так, например, для разреженных графов (с относительно небольшим числом рёбер по сравнению с числом вершин) алгоритм Дейкстры в стандартной реализации будет не очень эффективен. Но это можно исправить, ускорив операцию поиска минимального элемента использованием двоичных куч. Тогда время работы алгоритма можно сократить до <b>O(n log n + m)</b>.</p><h2>Где используется</h2><p>Этот алгоритм универсален, поэтому его можно использовать в разных сферах.</p><p>Например, <b>в навигационных системах и картографии</b> алгоритм Дейкстры может помочь проложить маршрут для пешеходов или автомобилей, избегая пробок и выбирая оптимальные дороги.</p><p><b>В робототехнике</b> этот алгоритм применяется для планирования движения роботов, чтобы они могли перемещаться в пространстве используя кратчайшие пути и обходя препятствия.</p><p><b>В системах бронирования</b> для поиска наиболее быстрых и дешевых билетов с учетом возможных пересадок.</p><p><b>В компьютерных сетях</b> алгоритм Дейкстры используется для определения оптимального маршрута передачи данных между узлами сети, минимизируя задержки и повышая эффективность передачи. Если вы работаете с базами данных, также рекомендуем прочитать: <a href="https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij">SQL — полный путеводитель от первых запросов до оконных функций</a>.</p><h2>Ограничения</h2><p>Основным ограничением алгоритма является <b>невозможность работы с отрицательными весами рёбер</b>, так как в этом случае возможны циклы с отрицательной суммой весов, что приведет к бесконечным попыткам уменьшения длины пути.</p><p>Из-за своей большой временной сложности алгоритм Дейкстры в стандартной реализации <b>может быть не очень эффективен для больших графов</b>, поэтому на практике часто используют разные эмпирические улучшения, с учетом специфики задачи. Также стоит отметить, что для больших графов также требуется выделение значительных ресурсов памяти.</p><p>Алгоритм Дейкстры не приспособлен для работы с динамически изменяющимися графами. То есть если во время работы алгоритма изменятся значения весов, то в итоге вы скорее всего получите неверные результаты.</p><h2>Какие еще есть алгоритмы для поиска кратчайшего пути</h2><p><b>Алгоритм Беллмана-Форда</b> вычисляет кратчайшие пути от одной вершины ко всем остальным, но в отличие от алгоритма Дейкстры, способен работать с графами, имеющими рёбра с отрицательными весами. Его временная сложность составляет <b>O(nm)</b>. Для графов с большим числом рёбер этот алгоритм может работать медленнее, чем Дейкстра. Другие алгоритмы и их применение — в нашем разделе <a href="https://tproger.ru/tag/algorithms">Алгоритмы</a>.</p><p><b>Алгоритм Джонсона</b> позволяет найти кратчайшие пути между всеми парами вершин. Он комбинирует алгоритмы Дейкстры и Беллмана-Форда и имеет временную сложность <b>O(n^2 log n + nm)</b>. Он может быть более эффективным для графов с малым количеством ребер.</p><p><b>Алгоритм А*</b> — это эвристический метод поиска кратчайшего пути, который может работать быстрее, чем алгоритм Дейкстры, при условии использования хорошей эвристической функции. А* применяется в задачах маршрутизации и навигации, особенно в играх и робототехнике.</p><p><b>Модификации алгоритма Дейкстры для разреженных графов</b>. Для графов с малым числом ребер относительно количества вершин можно использовать специальные оптимизации:</p><ul><li><b>Алгоритм Дейкстры с очередью с двойным приоритетом. </b>Применение специализированных структур данных, таких как очереди с двойным приоритетом, может ускорить выполнение алгоритма на разреженных графах.</li><li><b>Алгоритм Дейкстры с помощью дек (deque). </b>Это улучшение алгоритма Дейкстры для разреженных графов, использующее дек для более эффективного управления очередью вершин.</li></ul><p><b>Алгоритм Флойда-Уоршелла </b>предназначен для нахождения кратчайших путей между всеми парами вершин. Его временная сложность составляет <b>O(n^3)</b>, что делает его менее эффективным для очень больших графов, но он может быть выгодным для плотных графов с небольшим числом вершин.</p><h2>Практика</h2><p>Для закрепления темы вы можете порешать задачи на алгоритм Дейкстры на acmp.ru:</p><ul><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=674">132. Алгоритм Дейкстры</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1037">1381. Алгоритм Дейкстры-2</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1038">1383. Дейкстра за O(M log N)</a><br /></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=675">133. Заправки</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=676">134. Автобусы</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1039">1382. Транспортировка</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=677">469. Химическая тревога</a></li><li><a href="https://acmp.ru/asp/do/index.asp?main=task&amp;id_course=2&amp;id_section=32&amp;id_topic=54&amp;id_problem=1040">1384. Защищенное соединение</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Применение структур данных и алгоритмов на практике на примере Skype, Uber и Skyscanner</title>
      <link>https://tproger.ru/translations/applying-data-structures-and-algorithms</link>
      <comments>https://tproger.ru/translations/applying-data-structures-and-algorithms?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Притула]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/applying-data-structures-and-algorithms</guid>
      <description><![CDATA[<p>Разработчик с опытом работы в Skyscanner, Uber и Skype рассказывает, где он нашёл практическое применение структурам данных и алгоритмам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/applying-data-structures-and-algorithms">Применение структур данных и алгоритмов на практике на примере Skype, Uber и Skyscanner</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2020 12:04:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Гергели Орош</p><h2>Деревья и поиск по дереву — Skype, Uber и UI фреймворки</h2><p>Когда мы делали Skype под Xbox One, мы работали на голой Xbox OS, в которой недоставало ключевых библиотек. Это было одно из первых полномасштабных приложений на платформе. Нам нужно было сделать навигацию для тачпада и голосовых команд.</p><p>Мы слепили обычный навигационный фреймворк поверх WinJS. Для этого нужен был DOM-подобный граф (Document Object Model), чтобы отслеживать активные элементы. Для их поиска мы применяли <a href="https://tproger.ru/digest/search-algorithms/">алгоритмы поиска</a> по дереву. Это классический случай BFS или DFS (breadth-first search или depth-first search).</p><p>Если вы занимаетесь веб-разработкой, то уже работаете с древовидной структурой — объектной моделью документа. Все его узлы могут иметь дочерние элементы, и браузер рендерит их после обхода дерева. Для поиска конкретного элемента можно использовать встроенные <a href="https://tproger.ru/translations/dom-javascript/">DOM-методы</a>, такие как getElementById, или реализовать BFS/DFS поиск для обхода узлов.</p><p>Во многих фреймворках, которые рендерят UI элементы, применяются древовидные структуры данных. В React поддерживается виртуальный DOM и используется <a href="https://reactjs.org/docs/reconciliation.html">согласование</a> — алгоритм сравнения — для увеличения производительности путём повторного рендера только тех элементов, которые были изменены. Райан Бас визуализирует этот процесс в своей <a href="https://medium.com/@ryanbas21/react-reconciliation-7075e3f07437">статье</a> о согласовании в React.</p><p>Мобильная архитектура Uber —<a href="https://github.com/uber/RIBs"> RIBs</a> (Router, Interactor, Builder) — также использует деревья, как и большинство UI фреймворков, где элементы рендерятся по иерархии. В RIBs дерево нужно для <a href="https://github.com/uber/RIBs/wiki#state-management">управления состояниями</a>, присоединяя и отсоединяя ветви в зависимости от того, нужны они сейчас или нет.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/ribs-state-management.gif" alt="" /></figure><h2>Взвешенные графы и кратчайший путь — Skyscanner</h2><p>Skyscanner находит авиабилеты по наиболее выгодным ценам. Для этого он сканирует рейсы по всему миру и сводит их вместе. Хоть задача и состоит больше в краулинге, чем в кэшировании — поскольку авиалинии сами просчитывают варианты пересадок, — составление сложного маршрута из нескольких городов становится задачей нахождения кратчайшего пути.</p><p>Реализация такой функциональности потребовала достаточно много времени. Самые дешёвые варианты путешествия вычисляются с применением алгоритмов типа Dijkstra или A*. Путь перелёта здесь представлен ориентированным графом, где вес каждого ребра — это стоимость билета. Для решения такой задачи мы доработали <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">поисковый алгоритм A*</a> (читается «А-стар»). Если вам интересна тема полётов и кратчайших путей — советую <a href="https://medium.com/free-code-camp/exploring-the-applications-and-limits-of-breadth-first-search-to-the-shortest-paths-in-a-weighted-1e7b28b3307">статью</a> от Сашина Мальхотры.</p><h2>Сортировка — Skype</h2><p><a href="https://tproger.ru/translations/sorting-for-beginners/">Сортировка</a> — семейство алгоритмов, которое основательно использовать или реализовывать мне приходилось довольно редко. В 2013 году, однако, мне пришлось немного поупражняться в этом.</p><p>В то время при входе в аккаунт Skype контакты подгружались частями, и полная загрузка требовала времени. Один из инженеров подумал, что более производительным решением будет выстроить список контактов, использовав алгоритм сортировки вставкой. Мы постоянно спорили по поводу вида алгоритма. В итоге качественные тесты и бенчмарки занимали бóльшую часть работы. Лично я не видел в этом смысла, но проект уже был в той стадии разработки, когда время на подобные заморочки имелось.</p><p>Определённо существуют прикладные ситуации, где правильно подобранный алгоритм может сыграть роль. Сортировка вставками может быть полезна, когда в потоке — огромные куски данных и нужно их визуализировать в реальном времени. Сортировка слиянием подходит для случая «разделяй и властвуй», если большие куски данных хранятся на разных узлах. Я сам до сих пор не работал с такими, поэтому считаю, что в ежедневном использовании сортировочные алгоритмы — нечастый гость.</p><h2>Хеш-таблицы и хеширование — кругом</h2><p>Наиболее часто применяемая мной структура данных после массивов. Это очень полезный инструмент: от выявления дубликатов и кэширования до использования в <a href="https://blog.pragmaticengineer.com/distributed-architecture-concepts-i-have-learned-while-building-payments-systems/#sharding-and-quorum">распределённых системах</a> при шардинге. Почти во всех языках есть эта структура, и её легко реализовать при необходимости.</p><h2>Стеки и очереди — иногда</h2><p>Структура данных стек будет хорошо знакома тем, кто занимался дебагом языка со стактрейсом. Именно это сблизило нас больше всего. Также это распространенный выбор при обходе дерева в глубину.</p><p>Очередь в моём коде — редкий гость. Такую структуру применяют для поиска в ширину, где она складывается сама собой. Как-то видел планировщик задач для кода, который хорошо использовал <a href="https://en.wikipedia.org/wiki/Priority_queue">очереди с приоритетом</a>. В первую очередь он выполнял самые короткие задачи с помощью алгоритм <a href="https://docs.python.org/3/library/heapq.html">Python для очередей с кучами</a>.</p><h2>Криптография — Uber</h2><p>Чувствительная информация, вводимая пользователем с мобильного устройства или веб-клиента, должна быть зашифрована перед отправлением в сеть и расшифрована только на определённом сервисе. Для этого нужен крипто-подход как на стороне клиента, так и в бэкенде.</p><p>Криптография — интересная штука. Тебе не нужно выдумывать новый алгоритм шифрования — это может стать большой ошибкой. Наоборот, стоит брать существующий, хорошо задокументированный стандарт и использовать встроенные во фреймворк примитивы. Обычно прибегают к <a href="https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf">AES</a>. Он считается безопасным для <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard#Security">шифрования чувствительной информации</a>, и рабочих атак на момент выпуска статьи нет. Поэтому AES192 или AES256 — хорошие варианты в большинстве случаев.</p><p>Когда я присоединился к Uber, мобильная и веб-криптография уже были реализованы. И чтобы разобраться в них, мне пришлось подтянуть знания по AES, HMAC, RSA и другим вещам.</p><p>Вы редко будете заниматься реализацией крипто-примитивов — если только не создаёте с нуля core фреймворк. Но вы можете столкнуться с ситуацией, где придётся как минимум понимать, почему был выбран тот или иной подход.</p><h2>Деревья решений — Uber</h2><p>В одном из проектов нам пришлось реализовать непростую бизнес-логику в мобильном приложении. Основываясь на почти десятке достаточно сложных правил, нужно было отображать одно из нескольких представлений.</p><p>Инженер, работающий над этим, сначала попробовал закидать проблему if-else выражениями. В результате всё стало еще запутаннее. Тогда мы перешли на дерево решений, поскольку оно было простым в реализации и легко изменяемым при необходимости. Нам оставалось просто реализовать рёбра так, чтобы они следовали правилам.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/decision_tree-1940x1104.png" alt="" /></figure><p>Система для разработки мобильных билдов Uber — SubmitQueue — также применяет деревья решений, формируемые в реальном времени. Отделу Developer Experience пришлось решать сложную проблему: ежедневно происходят сотни слияний мобильных билдов. Каждому необходимо было как минимум 30 минут на компиляцию, UI-тесты, юнит-тесты и интеграцию. Параллелизация — такое себе решение, так как два билда могли иметь пересекающиеся изменения, из-за чего происходил конфликт в слиянии. На практике это означало, что инженеры тратили лишние 2-3 часа, переделывая и начиная слияние заново в надежде, что на этот раз получится.</p><p>В Developer Experience нашли креативный подход: они стали предсказывать конфликты слияния и помещали в очередь билды, используя спекулятивные графы. Они очень похожи на бинарное дерево решений.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/submit-queue-decision-tree.png" alt="" /></figure><p>У Адриана Кольера также есть хороший <a href="https://blog.acolyer.org/2019/04/18/keeping-master-green-at-scale/">визуальный анализ</a> подхода. Результатом стало ускорение работы над билдами и улучшение жизни сотен мобильных разработчиков.</p><h2>Применение структур данных со звёздочкой: шестиугольные сетки — Uber</h2><p>Одна из самых сложных и интересных проблем в Uber — оптимизация стоимости поездки и распределение водителей (партнёров). Цены могут варьироваться, а водители всё время перемещаются. H3 — сеточная система, которую построили разработчики для одновременного анализа данных и визуализации в городах на крошечном масштабе. Её структура — шестиугольная сетка с иерархическими индексами.</p><figure><img src="https://media.tproger.ru/uploads/2020/08/uber-hexagons.png" alt="" /></figure><p>Она имеет специфические функции для индексирования, обхода, иерархической сетки, регионов и ненаправленных рёбер, о которых рассказывается в <a href="https://h3geo.org/docs/api/indexing">API-референсе</a>. Детально окунуться в тему можно, просмотрев <a href="https://eng.uber.com/h3/">статью</a> об H3 библиотеке, <a href="https://github.com/uber/h3">исходники</a> или <a href="https://www.youtube.com/watch?time_continue=768&amp;v=ay2uwtRO3QE&amp;feature=emb_title">презентацию</a>, рассказывающую, как и зачем этот инструмент был создан.</p><p>Что мне понравилось из опыта создания и применения собственных структур данных — они могут помочь в определённых нишах. Ведь не так часто попадаются ситуации, где гексагональные сетки с иерархической индексацией имели бы смысл за пределами картографии с различными уровнями данных внутри каждой клетки.</p><p>Если вы уже знакомы с другими структурами, понять эту будет намного проще.</p><h2>Что же по собеседованиям?</h2><p>Вам нужно знать, что такое алгоритм,  уметь придумывать и применять самые простые из них. Также стоит знать о применении базовых структур данных. Но продвинутые алгоритмы типа Dijkstra и A* не должны забивать вам голову. Всё, что за пределами сортировки, я сам изучал на ходу. Тоже самое с экзотическими структурами, как Красно-Чёрное дерево или AVL-дерево.</p><p>Реальность такова, что компании перебарщивают с задачами по алгоритмам. Я понимаю почему: тебе дают 45 минут или меньше, а вопросы легко взаимозаменяемые. Поэтому, если анкеты и утекут в интернет, то ничего страшного не произойдёт. Также они легко масштабируемы при рекрутинге: можно иметь 100+ вопросов, и любой интервьюер сможет их оценить. Особенно в Кремниевой Долине всё чаще можно услышать вопросы, нацеленные на динамическое программирование или экзотические структуры данных. Это поможет нанять сильных инженеров, но при этом оттолкнёт множество людей, хорошо справляющихся с задачами, где продвинутые алгоритмы вообще не нужны.</p><h2>Полезные ресурсы</h2><ul><li>На GeeksforGeeks есть хороший <a href="https://www.geeksforgeeks.org/overview-of-data-structures-set-1-linear-data-structures/?ref=lbp">обзор</a> по затронутым в этой статье структурам. Поиграйтесь с ними на своем языке программирования. Также советую <a href="https://www.hackerrank.com/domains/data-structures">коллекцию</a> структур данных от HackerRank для практики в кодинге.</li><li>Grokking Algorithms, написанная Адитей Бхаргавой, — по-моему лучший гайд по алгоритмам как для новичков, так и для опытных инженеров. Очень доступный и визуальный путеводитель, затрагивающий всё, что нужно знать на эту тему. Я убежден, что вам не понадобится знать больше, чем написано в этой книге.</li><li><a href="https://www.amazon.com/gp/product/1848000693/ref=as_li_qf_asin_il_tl?ie=UTF8&amp;tag=gregdoesit-20&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=1848000693&amp;linkId=f2b71eb63361e28c617672a4ae87e97e">The Algorithm Design Manual</a> и <a href="https://www.amazon.com/gp/product/032157351X/ref=as_li_qf_asin_il_tl?ie=UTF8&amp;tag=gregdoesit-20&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=032157351X&amp;linkId=626cdc6e69e57d907cf344635bade01c">Algorithms: Fourth Edition</a> — обе эти книги мне помогли в свое время освежить знания, полученные на лекциях по алгоритмам в университете. Я бросил их на полпути, так как показались мне слишком сухими и не касались моей повседневной работы.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Алгоритмы поиска пути в графе</title>
      <link>https://tproger.ru/articles/pathfindings</link>
      <comments>https://tproger.ru/articles/pathfindings?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pathfindings</guid>
      <description><![CDATA[<p>Понятие графа для новичков и алгоритмы поиска пути, включая поиск в ширину: вершины, рёбра и наглядная визуализация через сервис PathFinding.js.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pathfindings">Алгоритмы поиска пути в графе</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 27 Jul 2016 17:38:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для новичков Граф — это (упрощенно) множество точек, называемых вершинами, соединенных какими-то линиями, называемыми рёбрами (необязательно все вершины соединены). Можно представлять себе как города, соединенные дорогами.</p><p>Любое клетчатое поле можно представить в виде графа. Вершинами будут являться клетки, а ребрами — смежные стороны клеток.</p><p>Наглядное представление о работе перечисленных далее алгоритмов можно получить благодаря визуализатору <a href="http://qiao.github.io/PathFinding.js/visual/">PathFinding.js</a>.</p><h2>Поиск в ширину (BFS, Breadth-First Search)</h2><p><a href="http://e-maxx.ru/algo/bfs">Алгоритм</a> был разработан независимо Муром и Ли для разных приложений (поиск пути в лабиринте и разводка проводников соответственно) в 1959 и 1961 годах. Этот алгоритм можно сравнить с поджиганием соседних вершин графа: сначала мы зажигаем одну вершину (ту, из которой начинаем путь), а затем огонь за один элементарный промежуток времени перекидывается на все соседние с ней не горящие вершины. В последствие то же происходит со всеми подожженными вершинами. Таким образом, огонь распространяется “в ширину”. В результате его работы будет найден кратчайший путь до нужной клетки.</p><h2>Алгоритм Дейкстры (Dijkstra)</h2><p>Этот <a href="http://e-maxx.ru/algo/dijkstra">алгоритм</a> назван по имени создателя и был разработан в 1959 году. В процессе выполнения алгоритм проверит каждую из вершин графа, и найдет кратчайший путь до исходной вершины. Стандартная реализация работает на взвешенном графе — графе, у которого каждый путь имеет вес, т.е. “стоимость”, которую надо будет “заплатить”, чтобы перейти по этому ребру. При этом в стандартной реализации веса неотрицательны. На клетчатом поле вес каждого ребра графа принимается одинаковым (например, единицей).</p><h2>А* (А “со звездочкой”)</h2><p>Впервые описан в 1968 году Питером Хартом, Нильсом Нильсоном и Бертрамом Рафаэлем. Данный <a href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_A*">алгоритм</a> является расширением алгоритма Дейкстры, ускорение работы достигается за счет эвристики — при рассмотрении каждой отдельной вершины переход делается в ту соседнюю вершину, предположительный путь из которой до искомой вершины самый короткий. При этом существует множество различных методов подсчета длины предполагаемого пути из вершины. Результатом работы также будет кратчайший путь. О реализации алгоритма читайте в <a href="https://tproger.ru/links/generic-astar-for-games/">здесь</a>.</p><h2>Поиск по первому наилучшему совпадению (Best-First Search)</h2><p>Усовершенствованная <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D0%BE_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%BC%D1%83_%D0%BD%D0%B0%D0%B8%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BC%D1%83_%D1%81%D0%BE%D0%B2%D0%BF%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D1%8E">версия</a> алгоритма поиска в ширину, отличающаяся от оригинала тем, что в первую очередь развертываются узлы, путь из которых до конечной вершины предположительно короче. Т.е. за счет эвристики делает для BFS то же, что A* делает для алгоритма Дейкстры.</p><h2>IDA* (A* с итеративным углублением)</h2><p>Расшифровывается как Iterative Deeping A*. Является измененной <a href="https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0">версией</a> A*, использующей меньше памяти за счет меньшего количества развертываемых узлов. Работает быстрее A* в случае удачного выбора эвристики. Результат работы — кратчайший путь.</p><h2>Jump Point Search</h2><p>Самый молодой из перечисленных алгоритмов был представлен в 2011 году. Представляет собой усовершенствованный A*. <a href="https://habrahabr.ru/post/162915/">JPS</a> ускоряет поиск пути, “перепрыгивая” многие места, которые должны быть просмотрены. В отличие от подобных алгоритмов JPS не требует предварительной обработки и дополнительных затрат памяти.</p><p>Материалы по более интересным алгоритмам мы обозревали в <a href="https://tproger.ru/digest/advanced-computer-science">подборке</a> материалов по продвинутым алгоритмам и структурам данных.</p>]]></content:encoded>
    </item>
  </channel>
</rss>