분할/해시 매핑+해시 _ 맵 통계+힙/고속/병합 정렬
1, 대량 로그 데이터, 어느 날 바이두를 가장 많이 방문한 IP 를 추출합니다.
1.) 분할/해시 매핑: 큰 파일을 작은 파일 (모듈 매핑) 로 변환합니다.
2)hash_map 통계: 큰 파일이 작은 파일로 변환되면 일반적인 hash_map(ip, value) 을 사용하여 O(n) 복잡도에 대한 빈도 통계를 만들 수 있습니다.
3) 힙/quicksequence: 파일당 가장 많은 수의 IP 를 가져온 다음 해당 파일을 요약하여 최대 IP 수를 얻습니다.
첫 번째는 이 날 바이두를 방문한 일지에서 IP 를 꺼내서 큰 파일을 하나씩 쓰는 것이다. IP 는 32 비트이며 최대 2 개의 32 IPS 가 있습니다. % 1000 과 같은 해시 매핑 방법을 사용하여 전체 큰 파일을 1000 개의 작은 파일에 매핑한 다음 각 작은 파일에서 가장 자주 발생하는 IP 를 찾을 수도 있습니다 (hash_map 을 사용하여/kloc-에 대해 사용 가능) 그런 다음 1000 개의 가장 큰 IP 에서 가장 자주 발생하는 IP 를 찾으십시오. 이것이 바로 당신이 원하는 것입니다.
2. 인기 질의를 찾아 300 만개의 질의 문자열 중 가장 인기 있는 10 개의 질의를 집계합니다.
1. 해시 매핑: 각 단어 x 에 대해 해시 (x)% 5000 을 가져와 5000 개의 작은 파일 (x0, x 1, ... x4999 로 기록) 에 저장합니다
따라서 각 파일은 약 200K 입니다. 일부 파일이 1M 보다 크면 분해된 작은 파일의 크기가 1M 보다 작을 때까지 유사한 방식으로 계속 나눌 수 있습니다.
2.hash_map 통계: 각 작은 파일에 대해 trie tree /hash_map 을 사용하여 각 파일에 나타나는 단어와 해당 빈도를 계산합니다.
3. 힙/병합 정렬: 가장 자주 발생하는 100 단어 (100 노드의 최소 힙을 사용할 수 있음) 를 꺼낸 다음 100 단어와 해당 발생 빈도를 파일에 저장합니다 마지막으로 5,000 개의 파일을 병합하는 프로세스입니다 (정렬 병합과 유사)
5. 총 10 개의 파일이 있으며, 각 파일은 1G 이고, 각 파일의 각 행에는 사용자의 쿼리가 저장되며, 각 파일의 쿼리는 중복될 수 있습니다. 조회 빈도에 따라 정렬해야 합니다.
해시 맵/모듈->; HashMap 통계->; 단일 파일 힙 정렬-> 다중 파일 병합
6. 각각 50 억 개의 URL 을 포함하고 파일당 64 바이트를 차지하는 A, B 두 개의 파일을 제공합니다. 메모리 제한은 4G 로 제한되므로 A, B 파일의 URL 을 찾을 수 있습니다. * * *?
1. 분할/해시 매핑: 파일 a 를 통과하고 각 URL 을 찾은 다음 결과 값에 따라 1000 개의 작은 파일에 URL 을 저장합니다. 이렇게 하면 각 작은 파일은 약 300M m 입니다. 파일 b 를 순회하고 URL 을 1000 개의 작은 파일에 a 와 같은 방식으로 저장합니다 (로 기록). 이 처리 후 가능한 모든 동일한 URL 이 해당하는 작은 파일 (
O(N)+N' * O(logK), (n 은 10000 이고 n' 이 hashmap 키인 요소는 10000, k 입니다
최소 힙에는 100 개의 요소가 포함되어 있습니다. 복잡성은 O( 100w*lg 100) 입니다.
13 과 2 억 5 천만 개의 정수에서 중복되지 않는 정수 수를 찾아 메모리 공간이 2 억 5 천만 개의 정수를 수용할 수 없습니다.
/writer #/notebooks/45731388/notes/70253940/preview
이 문제는 순서대로 이 5 억 개의 숫자를 본다. 읽은 수 num 의 경우 해당 바이너리에서 가장 높은 비트가 1 이면 f 1 에 쓰고 그렇지 않으면 F0 에 씁니다. 이 단계를 통해 5 억 개의 숫자를 두 부분으로 나눌 수 있습니다. f 1 의 숫자는 모두 F0 의 숫자보다 큽니다.
나눗셈 후 중앙값이 F0 인지 f 1 인지 쉽게 알 수 있습니다. F0 에 1 억이 있다고 가정하면 중앙값은 반드시 f 1 에 있어야 하며, f 1 중 작은 것부터 큰 것까지 1 억수와 그 뒤의 숫자의 평균입니다.
F 1 의 경우 다음 가장 높은 이진수를 사용하여 파일을 계속 둘로 나눌 수 있습니다. 이렇게 하면 구분된 파일을 메모리에 로드한 다음 데이터를 메모리에 로드한 후 직접 정렬할 수 있습니다. 또는 빠른 정렬 또는 힙 정렬 (작은 상단 힙) 을 사용하여 K 번째 최대 수를 찾아 중앙값을 찾을 수 있습니다.
/s/rdz4pftcex1ahom4kai3oq
/s/vxgtj9miw fc1yd 3v 44 kvnw