Задать вопрос
@MximuS
Full stack веб разработчик

Разбиение последовательности на несколько отрезков, схожей длины

Добрый вечер.
Проблема следующая:
php скрипт берёт из БД 15 произвольных картинок, а после этого необходимо их разделить на 3 части по 5 штук в каждой, чтобы сумма высот картинок как можно меньше отличалась. Высоты известны и берутся из БД со всеми остальными данными.
Может кто-то поделиться реализацией похожего(на любом язые), либо хотя бы сказать в сторону какого алгоритма смотреть?
  • Вопрос задан
  • 2556 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
Sekira
@Sekira
$q = mysql_query("запрос");
$images = array();
while($data = mysql_fetch_array($q))
{
	$images[$data['id']] = $data['height'];
}


$variants = array();

for($i=0; $i<10; $i++)
{
	$shuffle = shuffle($images);

	$a1 = array_sum(array_slice($shuffle, 0, 5));
	$a2 = array_sum(array_slice($shuffle, 5, 5));
	$a3 = array_sum(array_slice($shuffle, -5));

	$variants[max($a1, $a2, $a3)-min($a1, $a2, $a3)] = $shuffle;
}


ksort($variants);

$best_array = array_shift($variants);

$a1 = array_slice($best_array, 0, 5); // тут будет массив для 1 столбца
$a2 = array_slice($best_array, 5, 5); // тут будет массив для 2 столбца
$a3 = array_slice($best_array, -5); // тут будет массив для 3 столбца


Меняя 10 в цикле for можно менять точность разброса высот, тем больше число, тем точнее, но больше времени потребуется.
Вариант экспериментальный, ну а вдруг подойдет. Отпишитесь пожалуйста, как попробуете данный вариант, очень интересно, что из этого выйдет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
TERMIK
@TERMIK
Это, я думаю могло бы помочь.
Ответ написан
Комментировать
$query = mysql_query("select * from images where id order by height desc limit 15");
$images = mysql_fetch_array($query);
$count = 14;
$img1 = array(); // массив 1
$img2 = array(); // массив 2
$img3 = array(); // массив 3
for ($i=0; $<5; $i++)
{
$img1[] = $images[$i];
$img1[] = $images[$count-$i-1];
$img2[] = $images[$i+1];
$img2[] = $images[$count-$i-1];
$img3[] = $images[$i+2];
$img3[] = $images[$count-$i-1];
}



может так?
Ответ написан
Sekira
@Sekira
Если у картинок небольшой разброс в высоте, то проще всего так:
Отсортировать 15 картинок по высоте и в 1 столбец взять 1, 6, 7, 12 и 13 картинки, во 2 столбец 2, 5, 8, 11 и 14, а в 3 столбец — 3, 4, 9,10 и 15
При этом рядом находящиеся картинки в столбцах будут примерно равны и постепенно увеличиваться к низу.
Ответ написан
Комментировать
Silentium
@Silentium
$q = mysql_query("select * from images where id order by height desc limit 15");
$images = array(array(),array(),array());
$lengths = array(0,0,0);
while($data = mysql_fetch_array($q)) {
$n = array_search($lengths,min($lengths));
$lengths[$n] += $data['height'];
$images[$n][] = $data['id'];
}
foreach ($images as &$line) {
shuffle($line);
}

Получится, правда, не обязательно по 5, но поставить ограничение не составит труда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы