데이터에 따라 다릅니다. 최악의 시나리오는 균일하게 분포 된 숫자라는 것입니다.
이 경우 다음 예와 같이 O (N) 시간의 중앙값을 찾을 수 있습니다.
숫자가 2,7,5,10,1,6,4,4,6,10,4,7,1,8,4,9,9,3,4,3이라고 가정합니다 (범위는 1-10). .
우리는 3 개의 버킷을 만듭니다 : 1-3, 4-7, 8-10. 상단과 하단의 크기는 동일합니다.
우리는 양동이에 숫자를 채우고, 각각 얼마나 많은 숫자를 세는지, 최대 및 최소
- 낮음 (5) : 2,1,1,3,3, 최소 1, 최대 3
- 중간 (10) : 7,5,6,4,4,6,4,7,4,4, 최소 4, 최대 7
- 높음 (5) : 10, 10, 8, 9, 9, 최소 8, 최대 10
평균은 중간 양동이에 빠지고 나머지는 무시합니다
3 개의 버킷 (4, 5-6, 7)을 만듭니다. 낮음은 5로 시작하고 최대 3은 3으로, 최소 8은 5로 시작합니다.
각 숫자에 대해 우리는 최대 및 최소 버킷 수, 최대 및 최소 수를 계산하고 중간 버킷을 유지합니다.
- 오래된 낮은 (5)
- 낮음 (5) : 4, 4, 4, 4, 4, 최대 4
- 중간 (3) : 5,6,6
- 높음 (2) : 7, 7, 7 분
- 올드 하이 (5)
이제 중앙값을 직접 계산할 수 있습니다.
old low low middle high old high
x x x x x 4 4 4 4 4 4 5 6 6 7 7 x x x x x
중앙값은 4.5입니다.
분포에 대해 조금 알고 있다고 가정하면 속도를 최적화하기 위해 범위를 정의하는 방법을 미세 조정할 수 있습니다. 어쨌든 1 + 1/3 + 1/9 ... = 1.5이기 때문에 성능은 O (N)과 함께 가야합니다.
에지 사례로 인해 최소값과 최대 값이 필요합니다 (예 : 중간 값이 이전 최대 값과 다음 요소 사이의 평균 인 경우).
이러한 모든 작업을 병렬화 할 수 있으며 각 컴퓨터에 1/100의 데이터를 제공하고 각 노드에서 3 개의 버킷을 계산 한 다음 유지하는 버킷을 배포 할 수 있습니다. 각 번호가 평균 1.5 번 전달되므로 네트워크를 효율적으로 다시 사용할 수 있습니다 (O (N)). 노드간에 최소 숫자 만 전달하면 (예 : 노드 1에 100 개의 숫자가 있고 노드 2에 150 개의 숫자가있는 경우 노드 2가 노드 1에 25 개의 숫자를 줄 수 있음) 이길 수도 있습니다.
분포에 대해 더 많이 알지 못한다면 실제로 요소를 적어도 한 번 계산해야하기 때문에 여기서 O (N)보다 더 잘 할 수 있을지 의심됩니다.