[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите..можно сказать работа горит :(
Krevedko
Весь день мучаюсь.
Задачка чисто математическая.
Значит есть 8 папок с файлами. Пусть будет так например (количество может меняться)
$q[1] = 78;
$q[2] = 115;
$q[3] = 27;
$q[4] = 58;
$q[5] = 100;
$q[6] = 45;
$q[7] =32;
$q[8] = 61;

К примеру мне нужно показать юзеру 250 файлов, но при это распределить их равномерно по папкам.
Я придумал такой алгоритм.


1) 250 / 8 = 31.25
27 < 31.25 т.е. $q[3] =27 остальные пока больше

2) 250 - 27 = 223
223 / 7(оставшиеся папки) = 31.85

Все остальные больше, следовательно все по 32.
Проверяем. 32х7 = 224 + 27 = 251...ну почти. тут с округлением что-то надо прикинуть.

Второй алгоритм - перебирать массив прибавляя по единичке и сравнивая, чтобы не выйти за пределы количества файлов в папке.
Но что-то я ни тот, ни другой алгоритмы не могу реализовать :/
Может кто набросает ? Буду премного благодарен.




Спустя 6 минут, 48 секунд (6.12.2009 - 22:10) ApuktaChehov написал(а):
Или я чего то не понял или ты перемудрил:

Если 250 файлов разделить на 8 папок, получится по 31.25 файла в папке.

Округляем в меньшую сторону получается 31 файл в каждой папке.
Проверяем 31*8=248. Остается 2 файла.
Их можно закинуть в любую папку.

Спустя 28 минут, 10 секунд (6.12.2009 - 22:38) Krevedko написал(а):
не...а как быть с папкой $q[3] = 27;
? там всего 27 файлов. а если я захочу не 250 выводить, а 350 например ? таких папок будет больше

Спустя 54 минуты, 25 секунд (6.12.2009 - 23:33) dr_Lev написал(а):
$ToShow = 250; // Всего нужно показать файлов

$q = array(78,115,27,58,100,45,32,61); // Заполняем массив
$Q = array(); // Массив с результатом

asort($q); // Сортируем по возрастанию ассоциативно

$files = floor($ToShow / count($q)); // Среднее кол-во файлов в папке.

$iterations = 0; // Количество итераций
$already = 0; // Сколько файлов уже выведено
foreach ($q as $index => $value){
$iterations++; // Увеличение итерации сразу
if ($value < $files){ // Если в папке меньше файлов, чем нужно
$already+= $value; // Добавление к кол-ву уже выведенных
$files = floor(($ToShow - $already)/(count($q) - ($iterations))); // заново находим среднее для оставшихся папок
$Q[$index] = $value; // "Выводим файлы"
}else{
$already+= $files; // Добавление к кол-ву уже выведенных
$Q[$index] = $files; // "Выводим файлы"
}
if ($iterations >= count($q)){ // Если достигли последнего элемента
$Q[$index]+= $ToShow - $already; // "выводим" оставшиеся файлы
}
}

Вот результат

Начальный $q
array(8) {
[0]=>
int(78)
[1]=>
int(115)
[2]=>
int(27)
[3]=>
int(58)
[4]=>
int(100)
[5]=>
int(45)
[6]=>
int(32)
[7]=>
int(61)
}
Сортированный $q
array(8) {
[2]=>
int(27)
[6]=>
int(32)
[5]=>
int(45)
[3]=>
int(58)
[7]=>
int(61)
[0]=>
int(78)
[4]=>
int(100)
[1]=>
int(115)
}
Полученный $Q
array(8) {
[2]=>
int(27)
[6]=>
float(31)
[5]=>
float(31)
[3]=>
float(31)
[7]=>
float(31)
[0]=>
float(31)
[4]=>
float(31)
[1]=>
float(37)
}

Спустя 9 минут, 39 секунд (6.12.2009 - 23:42) Krevedko написал(а):
[2]=> int(27)
[6]=> float(31)
[5]=> float(31)
[3]=> float(31)
[7]=> float(31)
[0]=> float(31)
[4]=> float(31)
[1]=> float(37)


гм. а почему не

27 31 32 32 32 32 32 32 ?
неравномерно как-то получается

Спустя 39 секунд (6.12.2009 - 23:43) Krevedko написал(а):
думаю с округленимем надо что-то подумать. в любом случае огромное спасибо за код.

Спустя 12 минут, 28 секунд (6.12.2009 - 23:55) Krevedko написал(а):
все. отбой. пойдет и такое smile.gif
спасибо тебе мил человек. будешь у нас-с меня пиво smile.gif

Спустя 58 минут, 38 секунд (7.12.2009 - 00:54) dr_Lev написал(а):
Незачто, всегда рад помочь )

Спустя 5 дней, 1 час, 26 минут, 43 секунды (12.12.2009 - 02:21) Krevedko написал(а):
эхх..вопрос снова актуален ))
внедрил сейчас в свою программу. при больших числах результат "плавает"..считает неверно ..идет сдвиг sad.gif
так что нудна помощь...завтра конечно еще сам повтыкаю...

Спустя 38 минут, 5 секунд (12.12.2009 - 02:59) Krevedko написал(а):
$q[1] = 78;
$q[2] = 115;
$q[3] = 27;
$q[4] = 58;
$q[5] = 100;
$q[6] = 121;
$q[7] =32;
$q[8] = 61;

для всех 592 считает вот так:

[1] => 74 [2] => 74 [3] => 27 [4] => 58 [5] => 89 [6] => 89 [7] => 32 [8] => 149

Спустя 2 часа, 12 минут, 51 секунда (12.12.2009 - 05:12) waldicom написал(а):
Вот, посмотри, может такая сгодится.... Только с округлениями поиграйся, а то я уже спать иду, утро скоро smile.gif

$workerArray = $q;
sort($workerArray);
var_dump($workerArray); echo '<br />';
$countFolders = count($workerArray);
$amount = 250;
$already = 0;
for($i = 0; $i < $countFolders; $i++ ){
$currAvg = ($amount - $already) / ($countFolders - $i);
if($workerArray[$i] < $currAvg){ // если текущий элемент меньше, чем среднее,
$result[$i] = $workerArray[$i]; // то берем все файлы из этой папки
}else{
$result[$i] = $currAvg;
}
$already += $result[$i];
}
var_dump($result); echo '<br />';
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.