PHP算法大数组与内存问题

时间:2015-09-29 19:16:54

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

我正在研究PHP中的一些算法,处理二进制值或包含0和1的字符串。我正在计算n个数字的列表,从起始列表0f {0,1}开始,n = 1; 无论如何,对于n>,数组a []和b []变大了。 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";
}

1 个答案:

答案 0 :(得分: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中的数组非常大。

那么,有没有优点呢?或者更好地创造新的?请描述您想要获得更好的解决方案。