Skip to content

Жадные алгоритмы. Задача о резервных копиях.

Определение

Задача о резервных копиях: имеется система, состоящая из N хранилищ, различной ёмкости. В i-ом хранилище можно разместить Ai блоков информации. Хранение блока считается надежным, если в хранилище есть 2 его копии. Требуется определить наибольшее кол-во надежных блоков, которое можно разместить во всех хранилищах   Для объяснения решение этой задачи, рассматривают эквивалентную задачу про камушки:

Есть N кучек камней, каждым ходом можно забрать по одинаковому кол-ву камней из двух кучек. Найти такой порядок ходов, при котором в игре останется минимальное кол-во камней(либо во всех по 0, либо только в 1, и то минимум).

Стратегия

  • Выбираем наибольшую и наименьшую по кол-ву камней кучи и берём из них по 1 камню.
  • Продолжаем выполнять действие пока есть хотя бы 2 кучи, в которых есть камни.

Таким образом, кол-во ходов и будет ответом к задаче, потому что показывает максимальное кол-во пар, которое можно разместить в хранилище.

python
def max_reliable_blocks(storages):  
    # Сортировка хранилищ по убыванию ёмкости  
    storages.sort(key=lambda x: x['capacity'], reverse=True)  
	  
    total_blocks = 0  
    for storage in storages:  
        capacity = storage['capacity']  
        blocks_needed = min(capacity // 2, 1)  # Рассчитываем, сколько блоков можно разместить  
        total_blocks += blocks_needed * 2  # Добавляем блоки, умноженные на 2 (для двух копий)  
        capacity -= blocks_needed * 2  # Уменьшаем ёмкость хранилища  
	  
        if capacity <= 0:  
            break  # Если ёмкости осталось мало, прерываем цикл  
	  
    return total_blocks

Вся СУТЬ задачи в том, что минимальное возможное действие - оставить файл размером 1 в двух хранилищах. Ограничение в том, что места обязательно должны быть разные. Если у нас три хранилища с размерами 3 4 5 и мы оставим по 3 копии в (1) и (2) хранилище, то получим 0 1 5. Затем остаётся единственный вариант - оставить 1 копию в (2) и (3) хранилище с результатом 0 0 4. У нас ещё целых четыре места, но копии нельзя разместить в одном хранилище. В сумме мы разместили всего 4 копии, хотя с наилучшей стратегией можно разместить аж 6 копий