HackerRank의 pretty simple problem에서 며칠 동안 일해 왔지만 시간 초과 문제가있어 더 이상 코드를 최적화 할 수 없습니다.R 코드가있는 HackerRank의 The Grid Search
문제는 다음과 같습니다. 숫자의 2D 배열 (R * C 치수)이 주어지면 주어진 2D 패턴 (차원 * * c)의 발생을 찾으십시오. 여기
당신은 변수의 재현 예를 들면 다음과 같습니다
pattern <- c("11111", "11111", "11110")
text <- c("111111111111111",
"111111111111111",
"111111011111111",
"111111111111111",
"111111111111111")
R <- 5
C <- 15
r <- 3
c <- 5
그것은 정규식 문제의 일종이지만, 2D, 그리고 이것이 내가 즉시 사용 가능한 기능으로 어디서나 찾을 수있는 일입니다 in R. 내가 대처할 수 있었던 몇 가지 모서리 사례가 있습니다. 위의 버전은 일반적인 경우 '정규식'이 비참하게 패턴을 찾지 못하는 경우 중 하나입니다. .
아래 코드는 15 개 중 13 개가 완벽하게 작동하지만 일부 테스트 (예 : 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 치수와 함께 결합됩니다.
아무도 코드 성능을 향상시키는 방법에 대한 아이디어가 있습니까?
: 이것은 당신이 (당신이 준 테스트 케이스를 해결, 나는 믿는다) 같은 것을 할 수 있다는 것을 의미합니다. – nrussell
SO가 들여 쓰기 공간이 4 개 이상인 코드를 좋아하지 않으므로 들여 쓰기를 제거했습니다. 자, 내 코드의 성능에 대해 알고 싶습니까? :) – MaZe
한 번에 한 요소 씩 결과를 늘리는 것이 R :'RW [length (RW) +1] <- [...]'의 고전적인 "성능 킬러"입니다. 'RW'를 올바른 길이로 초기화해야합니다. 성능과는 무관하게, 변수'ifelse '의 이름을 짓는 것은 좋은 방법이 아닙니다. – nrussell