2017-12-05 1 views
0

입력 1 : 긴 정수 목록이있는 .csv 파일. 예 :정수가있는 매우 큰 CSV 파일을 효율적으로 반복 할 수 있습니까?

1 
10 
23 
2450 
12 
560 
320 
705 
... 

입력 2 : 정수의 목록과 함께 .csv 파일, 각 정수 옆에 빈 위치

5 - 
12 - 
15 - 
13 - 
350 - 

출력 : 입력이 입력 1에서 정수의 수를 찾기 2 정수가 .csv 파일보다 크거나 같고 숫자를 .csv 파일에 추가합니다.

이 문제는 DNA 시퀀싱과 관련이 있으며 입력 1에는 백만 건의 데이터 항목이 있습니다. 이 문제에 접근하는 효율적인 방법은 무엇입니까?

내 생각은 입력 1의 모든 항목을 하나의 큰 배열로 읽고 정렬하는 것이지만 비효율적이며 많은 메모리가 필요합니다. 모든 지침은 크게 감사하겠습니다.

편집 :

출력 (입력 2와 동일한 파일)

INT,

5 1 
12 3 
15 3 
13 3 
350 5 
+0

입력 2가 훨씬 작은 경우 입력 2의 정수를 메모리에 저장하고 정렬 한 다음 입력 1의 각 int에 대해 입력 2에서 다음으로 큰 정수를 취하여 1에 더하십시오. 결국, 입력 2의 각 정수'x'에 대해, 당신은 숫자의 개수를 가지고 있습니다. 그것은 프리비 오와'x' 사이에 있습니다. 더 작은 수를 모두 갖기 위해서는'x'를 쓰십시오. 모든 이전 수를 합계하십시오. 이 요구 사항은 입력 2의 메모리와 입력 1에 대한 선형 시간만을 나타냅니다. 이해하는 바와 같이 훨씬 길어집니다. – fairtrax

+1

"csv"파일에 쉼표가 표시되지 않습니다. 텍스트 파일이 아닌가? –

+1

나는 당신이하려는 것을 이해하지 못합니다. 제발 출력 예제를 보여 줄 수 있습니까? –

답변

0

가 값으로 정렬 된 맵에 제 파일 수를 넣어 계산 0 :

TreeMap<Integer, Integer> counts = new TreeMap<>(); 
for (Integer i : fromFile2) { 
    counts.put(i, 0); 
} 

그런 다음 각 번호에 대해 첫 번째 파일에서 광고는 그 숫자까지의 수를 증가 : 당신은 그냥 한 번에 하나를 읽을 수 있습니다 :이 두 번째 루프는 메모리에 전체 파일을 읽을 필요가 없습니다 것을

for (Integer i : fromFile1) { 
    counts.headMap(i).replaceAll((k, v) -> v + 1); 
} 

참고.

또한 headMap(i)은 정확히 i보다 작은 키가있는 항목을 반환합니다. i < Integer.MAX_VALUE을 가정하면 그 값에 1을 간단히 더할 수 있습니다.

+0

조금 더 향상시킬 수도 있습니다.입력 1에서 읽은 각 값에 대해 최소한 입력 2의 * 첫 번째 요소에 대한 기록 된 카운트 만 증가시켜야합니다. 각 항목의 출력시, 해당 항목 및 더 적은 모든 항목의 개수를 더하십시오. 이것은 입력 2의 크기가 상수로 제한되지 않는 한 점근 적 복잡성을 개선합니다.이 경우 상수는 여전히 계수를 감소시킵니다. –

관련 문제