Псевдо-код для хранения штабелей

голоса
2

Предположим, у меня есть несколько последовательно пронумерованных элементов, которые являются 1-N единиц в ширину, которые должны быть отображены в строках. Каждая строка м единиц в ширину. Мне нужны некоторые псевдо-код, который будет выводить строки, для меня, так что хранилась м ширины предела. Это не задача о рюкзаке, так как элементы должны оставаться в последовательном порядке номеров - пустые пробелы в конце строк отлично.

Я чеканка свой хвост над этим, отчасти потому, что мне это нужно как в PHP и JQuery / JavaScript, поэтому запрос на псевдокоде ....

Задан 03/08/2009 в 16:43
источник пользователем
На других языках...                            


4 ответов

голоса
3

while (!items.isEmpty()) {
  rowRemain = m;
  rowContents = [];
  while (!items.isEmpty() && rowRemain > items[0].width) {
    i = items.shift();
    rowRemain -= i.width
    rowContents.push(i);
  }
  rows.push(rowContents);
}

Хронометраж будет Θ (число элементов)

Ответил 03/08/2009 в 16:47
источник пользователем

голоса
0

Modulus является вашим другом. Я хотел бы сделать что-то вроде:

$items = array(/* Your list of stuff */);
$count = 0;
$maxUnitsPerRow = 4; // Your "m" above

while ($item = $items[$count]) {
 if ($count % $maxUnitsPerRow == 0) {
    $row = new row();
 }
$row->addItemToRow($item);
$count++;
}
Ответил 03/08/2009 в 16:47
источник пользователем

голоса
0

Для чего это стоит, я думаю, что у меня есть то, что я искал, для PHP - но не уверен, если есть более простой способ ...

<?php
// working with just a simple array of widths...
$items     = array(1,1,1,2,1,1,2,1);
$row_width = 0;
$max_width = 2;

echo "Begin\n"; // begin first row
foreach($items as $item=>$item_width) {
  // can we add item_width to row without going over?
  $row_width += $item_width;
  if($row_width < $max_width) {
    echo "$item_width ";
  } else if($row_width == $max_width) {
    echo "$item_width";
    echo "\nEnd\nBegin\n"; // end last row, begin new row
    $row_width = 0;
  } else if($row_width == 2* $max_width) {
    echo "\nEnd\nBegin\n"; // end last row, begin new row
    echo "$item_width";
    echo "\nEnd\n"; // end new row
    $row_width = 0;
    if($item < count($items)) echo "Begin\n"; // new row
  } else if($row_width > $max_width) {
    echo "\nEnd\nBegin\n"; // end last row, begin new row
    echo "$item_width";
    $row_width = $item_width;
  }
}
echo "\nEnd\n"; // end last row

?>
Ответил 03/08/2009 в 17:06
источник пользователем

голоса
0

Вот альтернативный код PHP ...

function arrayMaxWidthString($items, $maxWidth) {
    $out = array();
    if (empty($items)) {
        return $out;
    }

    $row = $maxWidth;
    $i = 0;

    $item = array_shift($items);
    $row -= strlen($item);
    $out[0] = $item;

    foreach ($items as $item) {
        $l = strlen($item);
        $tmp = ($l + 1);
        if ($row >= $tmp) {
            $row -= $tmp;
            $out[$i] = (($row !== $maxWidth) ? $out[$i] . ' ' : '') . $item;
        } elseif ($row === $maxWidth) {
            $out[$i] = $item;
            ++$i;
        } else {
            ++$i;
            $row = $maxWidth - $l;
            $out[$i] = $item;
        }
    }
    return $out;
}
Ответил 03/08/2009 в 17:46
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more