/
median.py
72 lines (59 loc) · 1.97 KB
/
median.py
1
2
3
4
5
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import heap
# Create 2 heaps, one min one, the other max one. Split the incoming
# numbers equally into these heaps and pick either the min or max one
# as the median:
class median:
def __init__(self,file):
self.minHeap = heap.heap(10005)
self.minHeap.setCmpF(lambda n1, n2: n2 < n1)
self.maxHeap = heap.heap(10000)
self.fd = open(file, "rU")
self.medians = []
def placeNo(self,no):
# if self.minHeap.top() == float('inf') :
# self.minHeap.insert(no)
# print 'fxcx' , self.minHeap.top(), self.maxHeap.top(), no
# return
# if self.maxHeap.top() == float('inf') :
# self.maxHeap.insert(no)
# print 'fxcx' , self.minHeap.top(), self.maxHeap.top(), no
# return
#
if no < self.minHeap.top():
self.minHeap.insert(no)
if no > self.maxHeap.top():
self.maxHeap.insert(no)
if no < self.maxHeap.top() and no >self.minHeap.top():
self.minHeap.insert(no)
def rebalance(self):
if len(self.minHeap) - len(self.maxHeap) > 1:
self.maxHeap.insert(self.minHeap.extractMin())
if len(self.maxHeap) - len(self.minHeap) > 1:
self.minHeap.insert(self.maxHeap.extractMin())
#print self.maxHeap.len(), self.minHeap.len()
#assert len(self.maxHeap) == len(self.minHeap)
def calcMedian(self):
for line in self.fd:
no = int(line)
self.placeNo(no)
self.rebalance()
if self.maxHeap.top() == float('inf'):
self.medians.append(self.minHeap.top())
print 'ffffff', self.minHeap.top(), self.maxHeap.top()
continue
if self.minHeap.top() == float('inf'):
self.medians.append(self.maxHeap.top())
print 'sssssc', self.minHeap.top(), self.maxHeap.top()
continue
#print 'calc', self.minHeap.top(), self.maxHeap.top()
if len(self.maxHeap) > len(self.minHeap):
self.medians.append(self.maxHeap.top())
else:
self.medians.append(self.minHeap.top())
return self.medians
if __name__ == '__main__':
#med = median('Median.txt')
med = median('_Median.txt')
#med = median('med1.txt')
tot=0
print sum(med.calcMedian()) % 10000