Учитывая вектор (vec
) и размер окна 5,
winsz <- 5L
vec <- c(9, 3, 10, 5, 6, 2, 4, 8, 7, 1)
Существует ли более быстрый способ расчета минимального значения прокатки без замены?
Минимальное значение прокаткибез замены: Используя vec
в качестве примера и размер окна 5.
На первом проходе, мин извлекается из первых 5 элементов (9, 3, 10, 5, 6).В первом проходе Min равен 3.
Во втором проходе min извлекается из 4 элементов, оставшихся от первого прохода (9, 10, 5, 6), и нового оконного элемента (2).Во втором проходе Min = 2.
В третьем проходе min извлекается из элементов, оставшихся от предыдущего прохода (9, 10, 5, 6) и нового оконного элемента (4).Минимум 4 в третьем проходе.Так и так далее.
Результат из примера:
[1] 3 2 4 5 6 1 7 8 9 10
Пожалуйста, пока исключите реализацию Rcpp
.
Текущая реализация и времякод:
#rolling min without replacement
set.seed(0L)
N <- 10e5
winsz <- 5L
vec <- sample(N)
mtd0 <- compiler::cmpfun(function(x) {
subx <- x[seq_len(winsz)]
n <- 1L
drawn <- rep(NA_integer_, length(x))
while (n <= length(x)-winsz) {
idx <- which.min(subx)
drawn[n] <- subx[idx]
subx[idx] <- x[n+winsz]
n <- n + 1
}
drawn[tail(seq_along(drawn), winsz)] <- sort(subx)
drawn
})
library(microbenchmark)
microbenchmark(mtd0(vec), times=3L)
около 8 секунд для размера окна 5 и вектора длины 1e6.