<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>14. Жадные алгоритмы: сжатие, кэширование, остовные деревья :: Краткий курс по основам программирования</title>
    <link>https://apmath-spbu.github.io/basics/greedy/index.html</link>
    <description>Жадные алгоритмы — один из фундаментальных методов алгоритмического проектирования. В отличие от динамического программирования, они не рассматривают все возможные комбинации, а принимают решения локально, шаг за шагом.&#xA;В этом разделе мы изучим:&#xA;Алгоритм Хаффмана и оптимальное кэширование — два классических примера жадных алгоритмов с доказательством оптимальности через обменный аргумент Минимальное остовное дерево — алгоритмы Прима и Краскала, лемма о разрезе, структура данных DSU Определение Жадный алгоритм (greedy algorithm) — алгоритм, который на каждом шаге принимает локально оптимальное решение, не возвращаясь к уже сделанному выбору. Жадность корректна, когда локальные оптимумы ведут к глобальному оптимуму.</description>
    <generator>Hugo</generator>
    <language>ru-ru</language>
    <lastBuildDate>Sun, 19 Apr 2026 09:30:00 +0300</lastBuildDate>
    <atom:link href="https://apmath-spbu.github.io/basics/greedy/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>14.1. Алгоритм Хаффмана и оптимальное кэширование</title>
      <link>https://apmath-spbu.github.io/basics/greedy/huffman_caching/index.html</link>
      <pubDate>Sun, 19 Apr 2026 09:30:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/basics/greedy/huffman_caching/index.html</guid>
      <description>Алгоритм Хаффмана Алгоритм Хаффмана (Huffman, 1952) — один из самых известных алгоритмов сжатия текста. Пусть дан текст, состоящий из символов алфавита $\Sigma$, который мы хотим закодировать как можно более короткой последовательностью бит.&#xA;Префиксные коды Самый простой способ — кодировать каждый символ уникальной последовательностью из $k$ бит (будем называть такую последовательность кодовым словом (codeword)), где $2^{k} \geqslant|\Sigma|$ (чтобы такое кодирование вообще было возможно). Такой способ не всегда эффективен: например, пусть $\Sigma=\{a, b, c, d\}$, текст имеет длину 10000, но большая часть символов текста равна $a$ (скажем, $a$ встречается в тексте 7000 раз, а остальные символы по 1000 раз). Тогда вышеописанный способ кодирования потребует $20000$ бит. Если же кодовое слово символа $a$ будет равно $0$, символа $b$ — $10$, $c$ — $110$, $d$ — $111$, то суммарно потребуется лишь $7000 \cdot 1+1000 \cdot 2+1000 \cdot 3+1000 \cdot 3=15000$ бит.</description>
    </item>
    <item>
      <title>14.2. Минимальное остовное дерево</title>
      <link>https://apmath-spbu.github.io/basics/greedy/minimum_spanning_tree/index.html</link>
      <pubDate>Sun, 19 Apr 2026 09:30:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/basics/greedy/minimum_spanning_tree/index.html</guid>
      <description>Определение Остовное дерево (spanning tree), или остов, связного неориентированного графа $G=(V,E)$ — это связный остовный подграф без циклов (то есть дерево на всех вершинах $V$). Вес $w(T)$ остова $T$ взвешенного графа — это сумма весов его рёбер. Минимальное остовное дерево (minimum spanning tree, MST) — остов минимального суммарного веса.&#xA;Пусть дан связный неориентированный граф с неотрицательными весами рёбер. Мы хотим выбрать подмножество рёбер минимального суммарного веса, с помощью которого можно добраться из любой вершины в любую. Если в подмножестве рёбер есть цикл, из него всегда можно выкинуть одно ребро, не увеличив суммарный вес и не нарушив связности. Значит, мы ищем именно минимальное остовное дерево.</description>
    </item>
  </channel>
</rss>