我正在研究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";
}
答案 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中的数组非常大。
那么,有没有优点呢?或者更好地创造新的?请描述您想要获得更好的解决方案。