Структура данных, используемая в примере файловой системы, который вы показываете, скорее всего, KD tree . Я не совсем уверен, насколько хорошо проблема, которую вы хотите решить, сопоставляется с примером файловой системы, но именно так я бы сам решил проблему с файловой системой:
Вы начинаете с прямоугольника, представляющего корень жесткого диска.
Вы берете все файлы и каталоги в каталоге и указываете их размер.
- Для файлов размер - это размер файла
- Для каталогов размер - это полный размер всех файлов, которые он содержит (включая все его подпапки, их подпапки и т. Д.).
Теперь вы пытаетесь разрезать этот список на два списка одинакового размера, насколько это возможно. Теперь вы разрезаете входной прямоугольник на два прямоугольника с такими же пропорциями размера, что и два списка, в которые вы разрезаете входные файлы. Вы должны сделать разрез по оси, которая короче размера входных прямоугольников, чтобы убедиться, что вы всегда имеете как можно более квадратичные прямоугольники. Теперь вы запускаете алгоритм рекурсивно для двух списков с соответствующим им прямоугольником.
Базовые случаи будут:
- В списке только один файл. Затем вы заполняете прямоугольник цветом типа файла.
- В списке есть один каталог. Для этого случая вы запускаете алгоритм рекурсивно для содержимого в каталоге внутри прямоугольника.
Выбор способа разбиения списков на две части одинакового размера, возможно, не является тривиальным (это рюкзак ?). Достойным эвристическим подходом, вероятно, будет сортировка списка по убыванию, удаление элементов из списка и помещение его в наименьший из двух полученных списков.
РЕДАКТИРОВАТЬ: проблема расщепления называется раздел и представляет собой особый случай рюкзака. Это покрыто этим потоком здесь, на SO.