Всем привет. Имеется список разделов - х, в большинстве разделов имеются подразделы - y но есть разделы и без подразделов. Список формируется из базы данных и выводится циклом PHP. x y заранее не известны. Необходимо сформировать таблицу допустим из 3-х столбцов. Условия: 1 столбцы должны быть максимально равно высокими, 2 список подразделов в разделе не должен прерываться на другой столбец. Как пример, на сайте http://avcomfort.ru подменю "Аудио". Подскажите алгоритм по которому PHP должен разделить список на столбцы.
Тупо делишь общую сумму на три. Для 1 и 2 сумм находишь слева и справа ближайшие границы. Берёшь одну из четырёх. Остаток делишь пополам, берёшь ближайшую из 2 границ. Таким манером прогоняешь все 4 границы. Из 4 вариантов выбираешь тот, где отклонение мин-макс минимально.
Пример.
Значения массива высот: (4 7 3 4 5 2 8 7) Сумма=40. Треть суммы=13.3, две трети = 26.6.
Вариант 1 - первая группа имеет максимальную сумму, но не более 13.3, т.е. (4 7), сумма 11, остаток 29. Половина остатка 14.5. Вариант 1-1 - вторая группа имеет максимальную сумму, но не более 14.5, т.е. (3 4 5 2), сумма 14, в остатке группа (8 7), сумма 15. Вариант 1-2 - вторая группа имеет минимальную сумму, но не менее 14.5, т.е. (3 4 5 2 8), сумма 22, в остатке группа (7), сумма 7. Вариант 2 - первая группа имеет минимальную сумму, но не менее 13.3, т.е. (4 7 3), сумма 14, остаток 26. Половина остатка 13. Вариант 2-1 - вторая группа имеет максимальную сумму, но не более 13, т.е. (4 5 2), сумма 11, в остатке группа (8 7), сумма 15. Вариант 2-2 - вторая группа имеет минимальную сумму, но не менее 13, т.е. (4 5 2 8), сумма 19, в остатке группа (7), сумма 7.
Итого варианты:
(4 7)-(3 4 5 2)-(8 7) = 11-14-15, разброс 4 (4 7)-(3 4 5 2 8)-(7) = 11-22-7, разброс 15 (4 7 3)-(4 5 2)-(8 7) = 14-11-15, разброс 4 (4 7 3)-(4 5 2 8)-(7) = 14-19-7, разброс 12
Выбирай любой из вариантов 1-1 и 2-1.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей