Skip to content

Commit a80b174

Browse files
Merge pull request #32 from SannaPersson/master
Added test median maintenance
2 parents 8a8cc5e + 413c603 commit a80b174

File tree

3 files changed

+90
-40
lines changed

3 files changed

+90
-40
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Import packages
2+
import sys
3+
import unittest
4+
# For importing from different folders
5+
# OBS: This is supposed to be done with automated testing, hence relative to folder we want to import from
6+
sys.path.append('Algorithms/other')
7+
8+
# If run from local:
9+
#sys.path.append('../../Algorithms/other')
10+
11+
from median_maintenance import Maintain_Median
12+
13+
14+
class MyTestCase(unittest.TestCase):
15+
def setUp(self):
16+
self.data1 = [1, 3, 8, 5, 10]
17+
self.correct1 = 5
18+
19+
self.data2 = []
20+
self.correct2 = []
21+
22+
self.data3 = [10]
23+
self.correct3 = 10
24+
25+
self.data4 = [1, 2, 3, 4]
26+
self.correct4 = 2.5
27+
28+
self.data5 = [1, 10, 2, 9, 11, 4, 6, 5, 3, 8, 7]
29+
self.correct5 = 6
30+
31+
32+
def test_basic(self):
33+
maintain_median = Maintain_Median()
34+
median = maintain_median.main(self.data1)
35+
self.assertEqual(median, self.correct1)
36+
37+
def test_empty(self):
38+
maintain_median = Maintain_Median()
39+
median = maintain_median.main(self.data2)
40+
self.assertEqual(median, self.correct2)
41+
42+
def test_single(self):
43+
maintain_median = Maintain_Median()
44+
median = maintain_median.main(self.data3)
45+
self.assertEqual(median, self.correct3)
46+
47+
def test_even(self):
48+
maintain_median = Maintain_Median()
49+
median = maintain_median.main(self.data4)
50+
self.assertEqual(median, self.correct4)
51+
52+
def test_longer_example(self):
53+
maintain_median = Maintain_Median()
54+
median = maintain_median.main(self.data5)
55+
self.assertEqual(median, self.correct5)
56+
57+
58+
59+
if __name__ == '__main__':
60+
unittest.main()
Binary file not shown.

Algorithms/other/median_maintenance.py

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,45 @@
1414

1515
import heapq
1616

17-
maxheap = None
18-
minheap = None
17+
class Maintain_Median(object):
18+
def __init__(self):
19+
self.maxheap = []
20+
self.minheap = []
1921

20-
def initialize():
21-
global maxheap, minheap
22-
23-
maxheap = []
24-
minheap = []
25-
26-
27-
def medmain_insert(x):
28-
global maxheap, minheap
29-
30-
if (len(maxheap)==0):
31-
heapq.heappush(maxheap, -x)
32-
else:
33-
m = -maxheap[0]
34-
if x > m:
35-
heapq.heappush(minheap,x)
36-
37-
if len(minheap) > len(maxheap):
38-
y = heapq.heappop(minheap)
39-
heapq.heappush(maxheap, -y)
22+
def medmain_insert(self, x):
23+
if (len(self.maxheap) == 0):
24+
heapq.heappush(self.maxheap, -x)
4025

4126
else:
42-
heapq.heappush(maxheap, -x)
43-
44-
if len(maxheap) - len(minheap) > 1:
45-
y = -heapq.heappop(maxheap)
46-
heapq.heappush(minheap, y)
47-
48-
return -maxheap[0]
49-
50-
51-
def test():
52-
data = [1,3,8,5,10]
27+
m = -self.maxheap[0]
28+
if x > m:
29+
heapq.heappush(self.minheap, x)
5330

54-
initialize()
31+
if len(self.minheap) > len(self.maxheap):
32+
y = heapq.heappop(self.minheap)
33+
heapq.heappush(self.maxheap, -y)
5534

56-
for x in data:
57-
median = medmain_insert(x)
35+
else:
36+
heapq.heappush(self.maxheap, -x)
5837

59-
print(median)
38+
if len(self.maxheap) - len(self.minheap) > 1:
39+
y = -heapq.heappop(self.maxheap)
40+
heapq.heappush(self.minheap, y)
6041

61-
heap_low = None
62-
heap_high = None
42+
return (-self.maxheap[0] + self.minheap[0])/2 if len(self.maxheap) == len(self.minheap) else -self.maxheap[0]
6343

64-
test()
6544

45+
def main(self, data):
46+
if len(data) < 1:
47+
return data
6648

49+
for x in data:
50+
median = self.medmain_insert(x)
6751

52+
return median
6853

54+
if __name__ == '__main__':
55+
data = [1, 3, 8, 5, 10]
56+
maintain_median = Maintain_Median()
57+
median = maintain_median.main(data)
58+
print(median)

0 commit comments

Comments
 (0)