Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Распределить n штук в M корзин
 
 автор: Eugene77   (16.10.2008 в 16:25)   письмо автору
 
 

Точнее надо последовательность из n элементов разнести по m массивам.
Массивы называются, например $ar1, $ar2, ... arm.
Их последовательность задана, менять местами нельзя
Элементы тоже упорядочены и последовательность их расположения тоже менять нельзя.
Например, если элементы 1,2,3,4, а массивы $ar1, $ar2, $ar3, то можно так:

<?
$ar1
=array(1);
$ar2=array(2);
$ar3=array(3,4);
// Или так:
$ar1=array(1);
$ar2=array(2,3);
$ar3=array(4);
// Или так:
$ar1=array(1,2);
$ar2=array(2);
$ar3=array(4);

Больше никак нельзя
Надо написать функцию для произвольных n и m (m <= n)(разумеется)
Кажется, что простая задачка, но никак не могу сообразить!

Вот так - уже неправильно:
<?
$ar1
=array(1);
$ar2=array(3,2);
$ar3=array(4);

  Ответить  
 
 автор: sim5   (16.10.2008 в 16:30)   письмо автору
 
   для: Eugene77   (16.10.2008 в 16:25)
 

Ну если судить по первым двум, то третий напрашивается как:
$ar1=array(1,2);
$ar2=array(3);
$ar3=array(4);

Или?

  Ответить  
 
 автор: Eugene77   (16.10.2008 в 19:42)   письмо автору
 
   для: sim5   (16.10.2008 в 16:30)
 

>Ну если судить по первым двум, то третий напрашивается как:
>$ar1=array(1,2);
>$ar2=array(3);
>$ar3=array(4);
>
>Или?
Да!
Спасибо за поправку!

  Ответить  
 
 автор: Trianon   (16.10.2008 в 16:36)   письмо автору
 
   для: Eugene77   (16.10.2008 в 16:25)
 

Нужно получить все возможные варианты распределения, или первый подходящий?

  Ответить  
 
 автор: Eugene77   (16.10.2008 в 19:36)   письмо автору
 
   для: Trianon   (16.10.2008 в 16:36)
 

Обязательно все варианты

  Ответить  
 
 автор: Trianon   (16.10.2008 в 20:00)   письмо автору
 
   для: Eugene77   (16.10.2008 в 19:36)
 

рекурсией глубиной m решается в лоб. Вроде бы.

  Ответить  
 
 автор: Eugene77   (16.10.2008 в 20:44)   письмо автору
 
   для: Trianon   (16.10.2008 в 20:00)
 

Вроде бы рекурсией надо решать, но что-то не могу алгоритм чётко представить.
Может быть вы решите её для меня?

  Ответить  
 
 автор: Trianon   (16.10.2008 в 22:04)   письмо автору
 
   для: Eugene77   (16.10.2008 в 20:44)
 

<?php

function out($v)
{
  for(
$a 1$i 0$i count($v); $i++)
  {
    for(
$j 0;$j $v[$i]; $j++)
      echo 
' '.($a++);
  echo 
', ';
  }
  echo
"<br />\r\n";
}
function 
gen(&$v$m$n)
{
    if(
$m == 1)
    {
        
$v[0] = $n;
        
out($v);
    }
    else
    for(
$k $n-($m-1); $k >=1; --$k)
    {
       
$v[$m-1] = $k;
       
gen(&$v$m-1$n-$k);
    }
}
$m 4;
$n 8;
$v = array();
gen(&$v$m$n);

?>


donations как грицца pending

  Ответить  
 
 автор: Eugene77   (17.10.2008 в 20:51)   письмо автору
 
   для: Trianon   (16.10.2008 в 22:04)
 

Красиво!
И в принципе понятно.
Хотя не совсем ясно зачем нужно применять &
Разъясните?
И я немного другое имел в виду...
Я подразумевал, что у меня есть уже изначально n элементов, например, в массиве лежат.
<?
$nnn 
= array{'"яблоко", "груша", "помидор", "слива"};
Они и сортируются по корзинам.
Конечно, теперь-то я смогу и переделать под изначально заданный массив, но если это сделает рука автора, то, кажется, это лучше получится, чем у меня.
Хоть увижу профессиональный код...

А положить в корзину - это вызов функции:

<?
function put_basket(array $elements){
// print_r($elements);
echo implode("   "$elements).",  ";
}

  Ответить  
 
 автор: Trianon   (17.10.2008 в 21:18)   письмо автору
 
   для: Eugene77   (17.10.2008 в 20:51)
 

>Хотя не совсем ясно зачем нужно применять &
>Разъясните?

Иначе на каждом уровне придется создавать новый массив.
Минимизировать объем локальных переменных рекурсивной функции естественно - для меня.

>Конечно, теперь-то я смогу и переделать под изначально заданный массив,
>но если это сделает рука автора, то, кажется, это лучше получится, чем у меня.

Я переживу, если Вы это сами сделаете.
Точнее, наоборот, я даже не стану переживать.
Рассовать проиндексированные элементы массива Вы всяко в состоянии.

  Ответить  
 
 автор: Eugene77   (18.10.2008 в 07:04)   письмо автору
 
   для: Trianon   (17.10.2008 в 21:18)
 

>>Хотя не совсем ясно зачем нужно применять &
>>Разъясните?
>
>Иначе на каждом уровне придется создавать новый массив.
>Минимизировать объем локальных переменных рекурсивной функции естественно - для меня.

Интересные уроки вы даёте!
Я бы, наверно, если бы меня посетила идея минимизации объёма переменных рекурсивной функции, использовал бы глобальный массив, объявляя это в функции:
<?
function recurcive(){
global 
$v;
............
}
$v = array();

Такой подход чем-то хуже?

  Ответить  
 
 автор: Trianon   (18.10.2008 в 11:17)   письмо автору
 
   для: Eugene77   (18.10.2008 в 07:04)
 

Применение глобальных и статических переменных для хранения локальных (по своей алгоритмической природе) данных, приводит к тому, что код перестает быть реентерабельным.
Поясню данный случай. Применить эту функцию для распределения N1 вагонов по M1 составам поездов, и N2 товаров по M2 вагонам при глобальном $v Вы бы уже не смогли.
Не то что это требовалось. Но опять же, для меня - естественно не порождать нереентерабельный код везде где этого можно избежать малой кровью.

  Ответить  
 
 автор: Eugene77   (18.10.2008 в 20:37)   письмо автору
 
   для: Trianon   (18.10.2008 в 11:17)
 

Хорошо, что вы это сказали!
Настоящие уроки мастера!

  Ответить  
 
 автор: Eugene77   (18.10.2008 в 21:20)   письмо автору
 
   для: Trianon   (18.10.2008 в 11:17)
 

Кстати, вы коснулись темы, над которой я ломал голову, даже не зная как она называется.
Дело в том, что эта функция вызывается, в свою очередь, рекурсивно.
И с глобальными данными не очень удобно.
Собственно,мне нужно подправить совсем чуть-чуть:
<?php 

function out($v) { 
  global 
$baskets$goods;
  for(
$a 1$i 0$i count($v); $i++)  { 
    echo 
"In ".$baskets[$i].' ';
    for(
$j 0;$j $v[$i]; $j++) 
      echo 
' '.$goods[($a++)]; 
  echo 
', '
  } 
  echo
"<br />\r\n"

function 
gen(&$v$m$n) { 
    if(
$m == 1) { 
        
$v[0] = $n
        
out($v); 
    } 
    else 
    for(
$k $n-($m-1); $k >=1; --$k)   { 
       
$v[$m-1] = $k
       
gen(&$v$m-1$n-$k); 
    } 

$m sizeof($baskets=array("basket1""basket2""basket3""basket4" )); 
$n sizeof($goods=array("g1""g2""g3""g4""g5""g6""g7""g8" )); 
$v = array(); 
gen(&$v$m$n); 

?>

Функция перераспределяет элементы между массивами по вашему алгоритму.
Только я не могу сообразить, как продолжить в вашем же духе работу с этими массивами.
(Никогда не пользовался &)
Или так нормально?
Мне важно узнать, как бы вы написали: Хочу научиться хорошему стилю.

Возможно здесь что-то оптимизировать по скорости и по объёму оперативной памяти, захватываемой при вызове с большими n и m?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования