2012-04-15 1 views
1

google codeJam 자격 확인 문제 중 하나는 두 개의 지정된 정수 사이에 '재활용 쌍'이 몇 개 있는지를 찾는 것이 었습니다.중첩 루프보다 빠른 알고리즘?

이것은 내 해결책 이었지만 큰 데이터 입력 집합에 대해서는 충분히 빠르지 않았습니다. @a = 10, @b = 200000과 같이 주어지면 속도가 느려집니다.

나는 내 솔루션이 O (2^n) 일 것이라고 생각한다. (아직 큰 O 분석에는 확실한 이해가 없다.) 끔찍하다. 더 빠른 알고리즘을 사용하여 두 개의 루프를 반복하는 표준 방법이 있는지 궁금합니다.

def getPairs 
    (@[email protected]).each do |n| 
     ([email protected]).each do |m| 
     if (containsSame(n,m)) && (isMatch(@a, n, m, @b)) 
      @recycledPairs += 1 
     end 
     end 
    end 
    end 

편집 : Google CodeJam site에서 :

당신은 n에 뒤쪽에서 어떤 자리를 이동하여 m를 얻을 수 있을지는 별개의 양의 정수 (N, m)의 한 쌍의 재활용한다고 가정 해 봅시다 그들의 순서를 바꾸지 않고 전면. 예를 들어, (12345, 34512)는 12345의 끝에서부터 앞쪽으로 345를 이동하여 34512를 얻을 수 있으므로 재활용 된 쌍입니다. 재활용 된 쌍이 되려면 n과 m의 숫자가 같아야합니다. n도 m도 선행 0을 가질 수 없습니다.

+4

"재활용 쌍"이란 무엇입니까? – Ryan

+3

루프 및 중첩 루프는 알고리즘이 아닌 구현 아티팩트입니다. – JRL

+1

Google codeJam 사이트에서 : 순서를 변경하지 않고 n의 뒤쪽에서 정면으로 일부 자리를 이동하여 m을 얻을 수 있다면 뚜렷한 양의 정수 (n, m) 쌍을 재활용한다고 가정 해 봅시다. 예를 들어, (12345, 34512)는 12345의 끝에서부터 앞쪽으로 345를 이동하여 34512를 얻을 수 있으므로 재활용 된 쌍입니다. 재활용 된 쌍이 되려면 n과 m의 숫자가 같아야합니다. n도 m도 선행 0을 가질 수 없습니다. – AFraser

답변

1

설명은 "재활용 된 쌍이 되려면 n과 m의 숫자가 같아야합니다."라고 말합니다.

내부 루프는이를 고려하지 않습니다. @a = 2와 @b = 20,000이면 내부 루프의 전체 청크를자를 수 있습니다. n이 두 자리이면 m의 두 자릿수 값만 테스트하면됩니다. 내부 루프의 상한을주의 깊게 살펴보십시오.

+0

실제 문제는 또한 A와 B도 같은 자리수를 가져야한다고 말합니다. 따라서 도움이되지 않습니다. – svick

1

다음 문장에서 : max b는 2 * 10^6 이하입니다. 모든 코드 잼 문제와 마찬가지로 다중 테스트가 있습니다.

1 단계 : Precalc. 각 시험 : 각 번호 = 1..maxb, 모두 예컨대

10 - 1 
321 - 132, 213 

2 단계 그것 (각 7 개 이하)을 엄격하게 작은 것이 숫자에서 순환 저장 N 들어. A에서 B까지의 각 숫자를 살펴보고 A와 B 사이에있는 "순환"수를 계산하십시오.

시간 복잡도 : 1 단계는 각 숫자의 (자릿수) 즉, O (ln n) . 당신은 그것을 b 번해야만합니다. 전체적으로 O (b * ln b). 2 단계에서도 동일하게 적용됩니다. 이것은 큰 테스트 케이스에서 1 초도 채 걸리지 않습니다.