Все статьи и конспекты
Жадные алгоритмыКоды ХаффманаСжатие данныхАлгоритмы
1 мин чтение

Жадные алгоритмы, Выбор процессов и Оптимальные коды Хаффмана

Принцип жадного выбора и оптимальная подструктура. Задача о выборе непересекающихся отрезков (Activity Selection). Построение оптимального префиксного дерева Хаффмана через очередь с приоритетами за O(K log K).

Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.

Принцип жадного выбора

Жадный алгоритм на каждом шаге принимает локально оптимальное решение в надежде получить глобально оптимальный результат.

Жадный подход корректен, если задача обладает двумя свойствами:

  • Свойство жадного выбора (Greedy Choice Property): Глобальный оптимум может быть достигнут посредством совершения локально оптимального выбора;

  • Оптимальная подструктура (Optimal Substructure): Оптимальное решение задачи содержит внутри себя оптимальные решения её подзадач.

  • Алгоритм сжатия Хаффмана (Huffman Coding)

    Коды Хаффмана строят оптимальный префиксный код переменной длины (символы с высокой частотой получают короткие битовые последовательности).

    cpp
    struct Node {
        char ch;
        int freq;
        Node *left, *right;
    };
    
    struct Compare {
        bool operator()(Node* a, Node* b) { return a->freq > b->freq; }
    };
    
    Node* buildHuffmanTree(const map<char, int>& freqs) {
        priority_queue<Node*, vector<Node*>, Compare> pq;
        for (auto [ch, f] : freqs) pq.push(new Node{ch, f, nullptr, nullptr});
    
        while (pq.size() > 1) {
            Node* left = pq.top(); pq.pop();
            Node* right = pq.top(); pq.pop();
            Node* parent = new Node{'\0', left->freq + right->freq, left, right};
            pq.push(parent);
        }
        return pq.top();
    }

    Что дальше?

    Закрепите материал задачей: Повторить число.

    Изучено — к практике →

    Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».