INTEGER ELEMENTS:
Jeśli typ swoimi elementami są liczbami całkowitymi, to najlepszym sposobem jest mieć wiadro na każdy numer leży w żadnej z podzakresów, gdzie każdy czerpak jest stosowany do liczenia numer jego powiązanej liczby całkowitej znaleziony w elementach wejściowych (na przykład bucket[100]
przechowuje liczbę 100
s w sekwencji wejściowej). Zasadniczo można to osiągnąć w następujących krokach:
- tworzenie wiader dla każdej liczby leży w dowolnym z zakresów.
- iteracyjne przechodzenie przez wszystkie elementy, dla każdego numeru
n
, jeśli mamy bucket[n]
, następnie bucket[n]++
.
- Oblicz mediany na podstawie zagregowanych wartości przechowywanych w twoich zasobnikach.
Podejmij to w inny sposób, załóżmy, że masz podzakres [0, 10]
, a chcesz obliczyć medianę. Podejście typu "bucket" w zasadzie oblicza, ile jest 0
s w wejściach i ile jest 1
s w danych wejściowych i tak dalej. Załóżmy, że istnieją n
numery leży w zakresie [0, 10]
, to mediana jest n/2
th największym elementem, który może być zidentyfikowany poprzez znalezienie i
takie, że bucket[0] + bucket[1] ... + bucket[i]
większa lub równa n/2
ale bucket[0] + ... + bucket[i - 1]
jest mniejsza niż n/2
.
Zaletą jest to, że nawet twoje elementy wejściowe są przechowywane na wielu komputerach (tj. W rozproszonym przypadku), każda maszyna może utrzymywać własne segmenty i tylko zagregowane wartości są wymagane do przejścia przez intranet.
Można również użyć hierarchicznych segmentów, które obejmują wiele przebiegów. W każdym przebiegu liczba bucket[i]
zlicza liczbę elementów wejściowych w określonym zakresie (na przykład [i * 2^K, (i+1) * 2^K]
), a następnie zawęzić obszar problemu, identyfikując, który zasobnik będzie pożywki po każdym kroku, a następnie zmniejszyć K
przezw w następnym kroku i powtarzaj, aż będziesz w stanie prawidłowo zidentyfikować medium.
zmiennoprzecinkowych ELEMENTY
Cała elementy pasują do pamięci:
Jeśli całe elementy można dopasować do pamięci, najpierw sortowania element N, a następnie znalezienie mediany dla każdego podzakresu jest najlepszą opcją. The linear time heap solution również działa dobrze w tym przypadku, jeśli liczba podzakresów jest mniejsza niż logN
.
Całość elementy nie może się zmieścić w pamięci i przechowuje się w jednej maszynie:
Ogólnie, external sort zwykle wymaga trzech dyskowych skany. Dlatego jeśli liczba twoich podkategorii jest większa lub równa 3, najlepszym wyborem będzie najpierw posortowanie elementów N, a następnie znalezienie median dla każdego z zakresów podrzędnych przez załadowanie tylko niezbędnych elementów z dysku. W przeciwnym razie po prostu wykonanie skanowania dla każdego podzakresu i pobranie tych elementów w podzakresie jest lepsze.
całą elementów są przechowywane w wielu maszynach: Ponieważ znalezienie medianę jest operatorem holistyczne, co oznacza, że nie może uzyskać ostateczną medianę całego wejściowych na podstawie median kilku częściach wejścia, jest to trudny problem, że nie można opisać tego rozwiązania w kilku zdaniach, ale są badania (zob. this jako przykład) skupiono się na tym problemie.
Jeśli lista jest posortowana, to po prostu uzyskaj numer elementu 50, 112, 700 itd.? – Blorgbeard
Użyj algorytmu wyboru (http://en.wikipedia.org/wiki/Selection_algorithm) ... jest kilka do wyboru. – andand
Lista nie jest posortowana. A najbardziej interesuje mnie unikanie duplikowania pracy w poszukiwaniu median w nakładających się podzakresach. – dabei