TGViewer
Python Portal Python Portal @pythonportal · 50.2K subscribers
Post #5776 6.18K
Динамическое программирование — одна из моих любимых тем в компьютерных науках.

А потом приходит осознание, что почти вся инфраструктура систем под капотом опирается на ту же самую идею.

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

И этот уровень абстракции встречается буквально везде.

Например, в базах данных оптимизаторы запросов по стоимости — это по сути огромные движки динамического программирования.

SQL-запрос с большим количеством JOIN между таблицами создаёт колоссальное комбинаторное пространство вариантов выполнения.
Оптимизатору нужно выбрать порядок JOIN, пути доступа, индексы, hash join / merge join / nested loop, predicate pushdown, partition pruning, стратегию параллелизма.

Наивный перебор растёт факториально.

Поэтому оптимизаторы используют динамическое программирование для вычисления:
«какой самый дешёвый способ выполнить подмножество S отношений?»

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

Что-то вроде:

DP[S] = минимальная стоимость плана для JOIN отношений из подмножества S

Дальше переходы выглядят так:
комбинируем оптимальные левый/правый под-планы + оцениваем cardinality + считаем стоимость IO / CPU / сети.

Вся магия в том, что система перестаёт повторно вычислять эквивалентные состояния, но при этом всё ещё приближается к глобальному оптимуму.

И это далеко не только про базы данных.

Динамическое программирование тихо лежит в основе:
алгоритмов кратчайших путей, декодирования Витерби, выравнивания последовательностей в биоинформатике, оптимизаций компилятора, edit distance, эвристик TCP congestion control, политик кэширования, планировщиков ресурсов, tiling для GPU-ядра, register allocation, вероятностного вывода, value iteration в reinforcement learning.

Даже современное мышление в распределённых системах часто напоминает динамическое программирование:
минимизация задержек и стоимости через ограниченные переходы состояний.

Больше всего мне нравится, как DP меняет само мышление.

Ты перестаёшь брутфорсить задачу и начинаешь задавать другие вопросы:

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

Тот самый дофаминовый момент, когда решение оптимизируется с O(nlogn) до O(n) или с O(n²) до O(n), — именно ради этого хочется писать алгоритмы каждый день.

И этот майндсет полезен далеко за пределами алгоритмических собеседований.

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

👉 @PythonPortal
  • ❤ 11
  • 👍 6
  • 🤯 4
More from @pythonportal
  1. Oct 6, 2026Начни изучать программирование GPU с одной полностью анимированной лекции на YouTube. Это…
  2. Oct 5, 2026«Основы компьютерного зрения» — бесплатная онлайн-книга издательства MIT Press, которая да…
  3. Oct 5, 2026DeepSeek выложила в открытый доступ библиотеку, которая ускоряет вычисления на GPU, лежащи…
  4. Oct 4, 2026Modern Robotics: Mechanics, Planning, and Control. Сохраните на потом. Это полноценный уче…
  5. Oct 4, 2026«Изучение математики. Почему память, практика и техника важнее таланта» Чтобы освоить мате…
  6. Oct 3, 2026«Как обучить нейросеть» — краткий конспект лекций курса MIT по глубокому обучению за 2024…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →