Расчет оптимального количества столбцов для макета таблицы - только с учетом ширины таблицы и списка прямоугольников - PullRequest
5 голосов
/ 02 марта 2011

У меня есть список прямоугольников с разными размерами.

rects = [100x20, 30x10, 10x10, 70x20, 40x30, 50x10]

Я пытаюсь визуализировать таблицу из этих прямоугольников.Если бы у меня было фиксированное количество столбцов, я просто мог бы рассчитать количество строк и размер каждой строки и столбца следующим образом:

numCols = 4;

for (i = 0; i < rects.size - 1, i++):
    rect = rects[i];
    col = i % numCols;
    row = floor(i / numCols);

    columns[col] = max(columns[col], rect.width);
    rows[row] = max(rows[row], rect.height);
end for;

Теперь я хочу, чтобы моя таблица была настроена на максимальную строкуширина.Количество столбцов зависит от вычисления оптимальной ширины строки во время выполнения.

С приведенным выше списком и максимальной строкой с установленным значением 140 я ожидаю, что моя таблица будет:

rects = [100x20, 30x10, 70x10, 10x20, 40x30, 10x10]

100x20, 30x10
70x10, 10x20
40x30, 10x10

cols = [100, 30]
rows = [20, 20, 30]

MyПервой идеей подхода к этой ситуации является кэширование максимальной ширины столбца для каждого возможного количества столбцов.Последняя запись с суммой <= максимальная ширина строки затем выигрывает. </p>

max[1] = [100]
max[2] = [100, 30] - wins
max[3] = [100, 40, 70] - 210 > 140
max[4] = [100, 30, 70, 10]
max[5] = [100, 30, 70, 10, 40]
max[6] = [100, 30, 70, 10, 40, 10]

К сожалению, мне нужно создать запись в max для каждого возможного номера столбца.Список может стать довольно большим.Кто-нибудь знает алгоритм для решения этой проблемы оптимизации?

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Я вижу только оптимизации вашего решения:

Предположения:
MaxAllowedWidth - максимально допустимая сумма ширины всех столбцов

  1. При поиске возможных решений (вашей последней таблицы) прекратите попытки добавлять новые столбцы, когда общая ширина столбцов превысит MaxAllowedWidth. В вашем примере вы должны остановиться на третьем шаге и не пытаться использовать 4, 5, 6 столбцов, потому что 3 столбца уже займут больше места, чем вам разрешено. Обратите внимание, что на этом этапе мы учитываем только первый ряд элементов.

  2. Пройдите по номеру возможных столбцов, полученных на предыдущем шаге, в обратном порядке. Первое применимое решение будет оптимальным, поскольку оно будет иметь минимально возможное количество строк.

  3. На шаге 2 вы должны убедиться, что это количество столбцов действительно вписывается в ваш MaxAllowedWidth. В вашем примере вы начнете с общей ширины = 130 (100 + 30). Затем, просматривая столбцы, вы должны проверить, следует ли увеличить этот конкретный столбец. Если столбец должен быть увеличен, проверьте, займет ли увеличенный столбец больше места, чем вы оставили. Если это так, попробуйте решение с меньшим количеством столбцов. Эта проверка позволит вам выйти раньше и пропустить бесполезные итерации / операции.

Описание вопроса не так ясно, я не получил то, что вы хотите, пока я не прочитал комментарии. max row width не имеет смысла для меня, total columns width звучит лучше, ИМО.

0 голосов
/ 18 апреля 2011

Чтобы завершить этот вопрос, вот итоговый макет таблицы в действии. Вы можете установить максимальную ширину, количество столбцов рассчитывается на основе алгоритма, обсуждаемого в этой теме:

http://sibirjak.com/osflash/projects/as3commons-ui/layouts/showcase/#a6-dyntable

Edit:

Чтобы изменить количество ящиков, откройте окно ящиков на панели задач в нижней части примера окна флеш-памяти.

...