Istnieje wiele różnych rozwiązań pozwalających znaleźć medianę z danych przesyłanych strumieniowo, krótko o nich opowiem na samym końcu odpowiedzi.
Pytanie dotyczy szczegółów konkretnego rozwiązania (maks. Sterty / min sterty), a sposób działania rozwiązania opartego na sterty wyjaśniono poniżej:
Dla pierwszych dwóch elementów dodaj mniejszy jeden do maxHeap po lewej stronie, a większy do minHeap po prawej stronie. Następnie przetwarzaj strumień danych jeden po drugim,
Step 1: Add next item to one of the heaps
if next item is smaller than maxHeap root add it to maxHeap,
else add it to minHeap
Step 2: Balance the heaps (after this step heaps will be either balanced or
one of them will contain 1 more item)
if number of elements in one of the heaps is greater than the other by
more than 1, remove the root element from the one containing more elements and
add to the other one
Następnie w dowolnym momencie możesz obliczyć medianę w następujący sposób:
If the heaps contain equal amount of elements;
median = (root of maxHeap + root of minHeap)/2
Else
median = root of the heap with more elements
Teraz omówię ogólnie problem, jak obiecano na początku odpowiedzi. Znalezienie uruchomionej mediany ze strumienia danych jest trudnym problemem, a skuteczne znalezienie dokładnego rozwiązania z ograniczeniami pamięci prawdopodobnie nie jest możliwe w ogólnym przypadku. Z drugiej strony, jeśli dane mają pewne cechy, które możemy wykorzystać, możemy opracować wydajne specjalistyczne rozwiązania. Na przykład, jeśli wiemy, że dane są typem integralnym, możemy zastosować sortowanie według liczenia, co może zapewnić stały algorytm stałej pamięci czasu. Rozwiązanie oparte na stertach jest rozwiązaniem bardziej ogólnym, ponieważ można go również stosować do innych typów danych (podwójnych). I na koniec, jeśli dokładna mediana nie jest wymagana i wystarczy przybliżenie, możesz po prostu spróbować oszacować funkcję gęstości prawdopodobieństwa dla danych i oszacować medianę za pomocą tego.