Это звучит как вариант проблемы упаковки бина , но там, где у вас уже есть низкое распределение, которое вы хотите улучшить. Поэтому я предлагаю рассмотреть варианты подходов, которые являются успешными для решения проблемы упаковки бина.
Прежде всего, вы, вероятно, захотите параметризовать свою проблему, определив, что вы считаете «достаточно полным» (где блок достаточно полон, чтобы вы не хотели его касаться), и что «слишком пусто» (где блок имеет так много пустого пространства, что к нему нужно добавить больше записей). Затем вы можете классифицировать все блоки как достаточно полные, слишком пустые или частично полные (те, которые не являются ни полными, ни слишком пустыми). Затем вы переопределяете проблему так, как устранить все слишком пустые блоки, создав как можно больше заполненных блоков при минимальном количестве частично заполненных блоков.
Вы также захотите решить, что важнее: собрать записи в наименьшее количество возможных блоков или упаковать их соответствующим образом, но с наименьшим количеством прочитанных и записанных блоков.
Мой подход состоял бы в том, чтобы сделать начальный проход по всем блокам, чтобы классифицировать их все в один из трех классов, определенных выше. Для каждого блока вы также хотите отслеживать доступное в нем свободное пространство, а для слишком пустых блоков вам нужен список всех записей и их размеров. Затем, начиная с самых больших записей в слишком пустых блоках, переместите их в частично заполненные блоки. Если вы хотите минимизировать чтение и запись, переместите их в любой из блоков, которые у вас есть в памяти. Если вы хотите минимизировать потерянное пространство, найдите блок с наименьшим количеством пустого пространства, в котором все еще будет храниться запись, считывая блок при необходимости. Если ни один блок не будет содержать запись, создайте новый блок. Если блок в памяти достигает «достаточно полного» порога, запишите его. Повторяйте, пока все записи в частично заполненных блоках не будут размещены.
Я пропустил более нескольких деталей, но это должно дать вам некоторое представление. Обратите внимание, что проблема упаковки бункера составляет NP-hard , что означает, что для практических применений вы захотите решить, что для вас наиболее важно, поэтому вы можете выбрать подход, который даст вам примерно лучшее решение в разумные сроки.