对于我的加密库,我有一个进制转换器,我经常使用它。虽然不是世界上最有效的工具,但对于所有输入范围都能很好地工作。
主要的工作由回调循环完成:
$callback = function($source, $src, $dst) {
$div = array();
$remainder = 0;
foreach ($source as $n) {
$e = floor(($n + $remainder * $src) / $dst);
$remainder = ($n + $remainder * $src) % $dst;
if ($div || $e) {
$div[] = $e;
}
}
return array(
$div,
$remainder
);
};
while ($source) {
list ($source, $remainder) = $callback($source, $srcBase, $dstBase);
$result[] = $remainder;
}
基本上,它会接受在
$srcBase
中的数字数组并将其转换为在$dstBase
中的数字数组。例如输入为array(1, 1), 2, 10
,将得到array(3)
作为结果。另一个例子是array(1, 0, 0), 256, 10
会得到array(1, 6, 7, 7, 7, 2, 1, 6)
(数组的每个元素都是$dstBase
中的单个“数字”)。我现在面临的问题是,如果我输入2kb的数据,它需要近10秒才能运行。因此,我开始优化它。到目前为止,我已经通过用递归循环来替换整个结构,将其降低到大约4秒左右:
while ($source) {
$div = array();
$remainder = 0;
foreach ($source as $n) {
$dividend = $n + $remainder * $srcBase;
$res = (int) ($dividend / $dstBase);
$remainder = $dividend % $dstBase;
if ($div || $res) {
$div[] = $res;
}
}
$result[] = $remainder;
$source = $div;
}
我面临的问题是如何进一步优化它(如果可能的话)。我认为问题在于大量迭代操作,例如对于一个2000元素的数组,从基数256转换到基数10,总共需要4815076次迭代。
您有什么想法吗?
$x % $y
,而是如何改变算法以减少所需的迭代次数... - ircmaxell