Я работаю над файлом pretty simple problem на HackerRank в течение нескольких дней, но я застрял в проблемах с тайм-аутом, и я не могу больше оптимизировать свой код.«Поиск сетки» на HackerRank с языком R
Проблема заключается в следующем: Учитывая двумерный массив цифр (размеры R * C), попробуйте найти возникновение данного двумерного шаблона цифр (размеры r * c).
Здесь вы воспроизводимый пример переменных:
pattern <- c("11111", "11111", "11110")
text <- c("111111111111111",
"111111111111111",
"111111011111111",
"111111111111111",
"111111111111111")
R <- 5
C <- 15
r <- 3
c <- 5
Это своего рода регулярного выражения проблемы, но в 2D, и это то, что я не мог найти где-нибудь в качестве функции готовых к употреблению в R. Есть несколько угловых случаев, с которыми мне удалось справиться, пытаясь избежать опции грубой силы (вышеприведенная версия является одним из тех случаев, когда обычное «регулярное выражение» с трудом удается найти шаблон) ,
Ниже приведен мой код: он отлично подходит для 13 из 15 случаев, но он не работает по причине таймаута, когда он идет против некоторых тестов с (например, R * C = 500 * 500 и r * c = 236 * 208.
RW <- c()
pattern2 <- paste0(pattern, collapse = "")
RW <- c(rep(NA,(C-c+1)*(R-r+1)))
for (v in 1:(C-c+1))
{
for (y in 1:(R-r+1))
{
RW[(C-c+1)*(y-1)+v] <- paste0(substr(text[y:(y+r-1)],v,c+v-1),collapse="")
}
}
per <- ifelse(pattern %in% RW, result <- "YES",result <- "NO")
cat(result, "\n")
Пожалуйста, обратите внимание, что есть до 5 случаев для каждого теста, и это является причиной, почему мой код не: в то время как она могла бы работать ломать тест на 5 частей, он проходит порог времени, когда случаи вместе с большими R C и r c размеры.
Есть ли у кого-нибудь идеи о том, как улучшить производительность кода?
Отступа вашего 'for' петеля одно улучшения. – nrussell
Удален отступ, потому что SO явно не любит код с более чем 4-мя пробелами в отступе. Теперь у вас есть что-нибудь о производительности моего кода? :) – MaZe
С первого взгляда ваш результат по одному элементу за один раз является классическим «убийцей производительности» в R: 'RW [length (RW) +1] <- [...]'. Вы должны инициализировать 'RW' до правильной длины перед рукой. Не связанный с производительностью, присвоение переменной 'ifelse' просто не является хорошим шагом. – nrussell