【问题标题】:PHP algorithm big arrays issue with memoryPHP算法大数组内存问题
【发布时间】:2015-12-27 09:55:08
【问题描述】:

我正在研究 PHP 中的一些算法,处理二进制值或包含 0 和 1 的字符串。我正在计算 n 数的列表,从 n=1 的起始列表 0f {0,1} 开始; 无论如何,数组 a[] 和 b[] 在 n > 20 后变大,达到内存问题。所以我的问题是如何优化该算法以使用更少的内存?我应该将二进制字符串以不同格式存储在内存中,字符串格式除外,还是我需要重构算法本身?有什么想法吗?

while ($n < 1 || $n > 65)
 fscanf(STDIN, "%d\n", $n);

$listn = array("0","1");
$doublearray[] = $listn;

for ($i=1; $i<$n;$i++) {
  foreach ($listn as $member) {
    $a[] = "0" . $member;
  }

  $reflectedlistn = array_reverse($listn);

  foreach ($reflectedlistn as $member) {
    $b[] = "1" . $member;
  }

  $listn = array_merge($a, $b);
  $doublearray[] = $listn;
  $a = array();
  $b = array();

}

$arr = array_slice($doublearray[$n-1], -$n);
echo "\n";
foreach ($arr as $item) {
    echo $item . "\n";
}

【问题讨论】:

  • 您展示了算法,但没有展示您尝试解决的任务。虽然有明显的改进领域(使用纯数字而不是 0 和 1 填充的数组,必要时将它们转换为二进制文件),但不清楚您在这里真正想要做什么。
  • 我只是对如何以更优化的方式存储二进制文件而不是字符串感兴趣
  • 使用bindec,您可以将任何0和1的字符串转换为纯数字。不过请注意平台限制。

标签: php arrays algorithm memory-leaks out-of-memory


【解决方案1】:

您可以通过存储数字来优化您的算法。

while ($n < 1 || $n > 65)
 fscanf(STDIN, "%d\n", $n);

$listn = array(0, 1); // use numbers
$doublearray[] = $listn;

for ($i = 1; $i < $n; $i++) {
    foreach ($listn as $member) {
        $a[] = 0 + $member; //actually do nothing
    }

    $reflectedlistn = array_reverse($listn);

    foreach ($reflectedlistn as $member) {
        $b[] = (1 << $i) + $member; // add 1 to the begining
    }

    $listn = array_merge($a, $b);
    $doublearray[] = $listn;
    $a = array();
    $b = array();
}
$arr = array_slice($doublearray[$n - 1], -$n);
echo "\n";
foreach ($arr as $item) {
    echo decbin($item) . "\n"; // convert dec into bin string representation
}

它节省了将近 15% 的内存。

然后删除无用的数组$a。

$listn = array(0, 1); // use numbers
$doublearray[] = $listn;

for ($i = 1; $i < $n; $i++) {
    $reflectedlistn = array_reverse($listn);

    foreach ($reflectedlistn as $member) {
        $b[] = (1 << $i) + $member; // add 1 to the begining
    }

    $listn = array_merge($listn, $b);
    $doublearray[] = $listn;
    $a = array();
    $b = array();
}
$arr = array_slice($doublearray[$n - 1], -$n);
echo "\n";
foreach ($arr as $item) {
    echo decbin($item) . "\n"; // convert dec into bin string representation
}

更多 20% 的内存。

但这无济于事,因为该算法会创建包含 2^n 个元素的数组。并且数组在 PHP 中非常庞大。

那么,有什么优化的地方吗?还是更好地创造一个新的?请描述您想要实现什么以获得更好的解决方案。

【讨论】:

    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2012-08-23
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多