Skip to content

Instantly share code, notes, and snippets.

@audy
Created May 30, 2019 23:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save audy/1895e6ca5665e0f2b738bb7bff32ef79 to your computer and use it in GitHub Desktop.
Save audy/1895e6ca5665e0f2b738bb7bff32ef79 to your computer and use it in GitHub Desktop.
from collections import defaultdict
import statistics
import random
class InfiniteMedian:
"""
Works well if the number of possible values is low.
Otherwise, nicht sehr gut
"""
def __init__(self):
self.histogram = defaultdict(lambda: 0)
def add_number(self, number):
self.histogram[number] += 1
return self
def add_numbers(self, numbers):
for number in numbers:
self.histogram[number] += 1
return self
def get_median(self):
total = sum(self.histogram.values())
midpoint = total / 2
numbers = sorted(self.histogram.keys())
for n, number in enumerate(numbers):
frequency = self.histogram[number]
midpoint -= frequency
if midpoint < 0:
# midpoint is in current number. median is current number
return number
if midpoint == 0:
return (number + numbers[n + 1]) / 2
while True:
numbers = [random.randint(0, 100) for i in range(0, 11)]
im = InfiniteMedian().add_numbers(numbers)
im_median = im.get_median()
stats_median = statistics.median(numbers)
assert im_median == stats_median, {"im": im_median, "stats": stats_median, "numbers": numbers}
print("okay")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment