class MinHeapTest(unittest.TestCase): def setUp(self): vals = list(range(1, 1000)) random.shuffle(vals) self.H = MinHeap() '''insert random values into structure''' for i in vals: self.H.insertNode(i, i) def test_extractMin(self): '''test extract min''' expectedmin = 1 for _ in range(self.H.count): #empty the heap to completion v, k = self.H.extractMin() self.assertEqual(v, expectedmin) expectedmin += 1
class Median(object): def __init__(self, filename): self.H1 = MaxHeap([]) self.H2 = MinHeap([]) self.median = [] self.input_stream = [] self.load(filename) self.feed() def load(self, filename): file = open(filename, "r") data = file.readlines() for line in data: self.input_stream.append(int(line)) def print(self): print(self.median) def solve(self): total = 0 for i in range(len(self.median)): total += self.median[i] print(total % 10000) def feed(self): while (len(self.input_stream) > 0): num = self.input_stream.pop(0) h1_max = self.H1.findMax() if h1_max is None: h1_max = 0 h2_min = self.H2.findMin() if h2_min is None: h2_min = math.inf if num > h1_max and num < h2_min: if self.H1.length() >= self.H2.length(): self.H2.insert(num) else: self.H1.insert(num) else: if num < h1_max: self.H1.insert(num) elif num > h2_min: self.H2.insert(num) if self.H1.length() == self.H2.length(): self.median.append(self.H1.findMax()) elif self.H1.length() - self.H2.length() == 1: self.median.append(self.H1.findMax()) elif self.H2.length() - self.H1.length() == 1: self.median.append(self.H2.findMin()) elif self.H1.length() - self.H2.length() > 1: temp = self.H1.extractMax() self.H2.insert(temp) self.median.append(self.H1.findMax()) elif self.H2.length() - self.H1.length() > 1: temp = self.H2.extractMin() self.H1.insert(temp) self.median.append(self.H1.findMax()) else: print("????")