因此,對於我的密碼學庫,我有一個我經常使用的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)
。另一個例子是array(1, 0, 0), 256, 10
這將使array(1, 6, 7, 7, 7, 2, 1, 6)
(該數組的每個元素是一個單一的「數字」在$dstBase
。
我現在所面臨的問題,如果是我給它的數據的2KB,它需要差不多10 。
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;
}
我現在面臨的問題是:秒跑所以我已經開始着手優化它到目前爲止,我通過更換這個遞歸循環整體結構有它下降到約4秒如何進一步優化它(如果甚至可能的話)我認爲問題是大輸入所需的迭代的剪切次數(對於2000個元素的數組,從256到10,總共需要4,815,076次迭代)。
有什麼想法?
這是我的觀點。不是我該如何優化'$ x%$ y',但是如何改變算法以減少必要的迭代... – ircmaxell