나는 알고리즘을 반복 할 때마다 i 번째 요소가 값이되는 벡터 x를 만들어 이것을 'inside-out'으로 바꾸었다. 그 결과
f1 <- function(L) {
x <- seq_len(L)
count <- integer(L)
while (any(i <- x > 1)) {
count[i] <- count[i] + 1L
x <- ifelse(round(x/2) == x/2, x/2, 3 * x + 1) * i
}
count
}
이것은 (a) 추적 (IDX 통해) 재생에 여전히 그 값 (B)의 불필요한 동작을 방지 등을 최적화 할 수
비교적 알기이다 ifelse는 모든 값에 대한 모든 인수를 평가 x, x/2는 두 번 평가됩니다. F0으로
f2 <- function(L) {
idx <- x <- seq_len(L)
count <- integer(L)
while (length(x)) {
ix <- x > 1
x <- x[ix]
idx <- idx[ix]
count[idx] <- count[idx] + 1L
i <- as.logical(x %% 2)
x[i] <- 3 * x[i] + 1
i <- !i
x[i] <- x[i]/2
}
count
}
는 비틀기 3 홀수 값을 업데이트
> L <- 10000
> system.time(ans0 <- f0(L))
user system elapsed
7.785 0.000 7.812
> system.time(ans1 <- f1(L))
user system elapsed
1.738 0.000 1.741
> identical(ans0, ans1)
[1] TRUE
> system.time(ans2 <- f2(L))
user system elapsed
0.301 0.000 0.301
> identical(ans1, ans2)
[1] TRUE
원문 함수 I 가지고 * X [I] + 1 후 수행 두 무조건
x[i] <- 3 * x[i] + 1
count[idx[i]] <- count[idx[i]] + 1L
x <- x/2
count[idx] <- count[idx] + 1
으로 나누기 F3로이 (F2 오늘 아침에 느린 이유는 확실하지!) 나는
> system.time(ans2 <- f2(L))
user system elapsed
0.36 0.00 0.36
> system.time(ans3 <- f3(L))
user system elapsed
0.201 0.003 0.206
> identical(ans2, ans3)
[1] TRUE
,369를 얻을 수와
2 단계 나누기 단계에서 더 큰 단계를 수행 할 수있는 것처럼 보입니다. 예를 들어, 8은 2^3이므로 3 단계 (계산에 3을 더함)를 완료하고 20을 완료 할 수 있습니다. 2^2 * 5 그래서 우리는 두 단계를 취하여 다음 반복을 5 단계로 진행할 수 있습니다. 구현?
저는 R에서 당황스러운 병렬 처리의 예를 들어 이것을 훔칠 것입니다! 감사! –