私の暗号化ライブラリでは、私が頻繁に使用するbase converterがあります。これは世界で最も効率的なものではありませんが、すべての入力範囲で非常にうまく機能します。基本変換ループの最適化
作業の大部分は、コールバックループによって行われる:
$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)
となります。私はそれをデータの2キロバイトを養う場合は、別の例では、配列の各要素が$dstBase
でシングル「数字」である(array(1, 6, 7, 7, 7, 2, 1, 6)
を与えることになるarray(1, 0, 0), 256, 10
だろう。
私が今直面してる問題は、ある、それはほとんど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までは合計で4,815,076回の反復を必要とする)に対して掛かる剪断回数であると考えています。
どのような考えですか?
これは私の要点でした。 '$ x%$ y'をどのように最適化するのではなく、アルゴリズムを変更して反復を減らす必要があります... – ircmaxell