6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/qme/map/cv_aggregator.rb', line 6
def self.median(frequencies)
set_size = frequencies.values.reduce(0, :+)
offset = set_size.even? ? 1 : 0
left_position, right_position = [(set_size / 2), (set_size / 2) + offset]
current_position = -1 + offset
median_left = nil
median_right = nil
frequencies.keys.sort.each do |value|
current_position += (frequencies[value])
if current_position >= left_position && median_left == nil
median_left = value
return median_left if set_size.odd?
end
if current_position >= right_position
median_right = value
break
end
end
median_left ||= 0
median_right ||= 0
(median_left + median_right)/2
end
|