내 암호화 라이브러리의 경우 자주 사용하는 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)
이됩니다. I가 데이터 2KB의 공급을 다른 예 array(1, 6, 7, 7, 7, 2, 1, 6)
줄 것이라고 array(1, 0, 0), 256, 10
것 (상기 어레이의 각각의 요소는 $dstBase
단일 "디지트"이다.
지금 대향있어 문제이며, 이는 거의 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