-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlazyGreedy.py
58 lines (48 loc) · 1.58 KB
/
lazyGreedy.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
import heapq
def _heappush_max(heap, item):
heap.append(item)
heapq._siftdown_max(heap, 0, len(heap)-1)
def _heappop_max(heap):
"""Maxheap version of a heappop."""
lastelt = heap.pop() # raises appropriate IndexError if heap is empty
if heap:
returnitem = heap[0]
heap[0] = lastelt
heapq._siftup_max(heap, 0)
return returnitem
return lastelt
def lazy_greedy_heap(F, V, B):
curVal = 0
sset = []
vals = []
order = []
heapq._heapify_max(order)
# [_heappush_max(order, (F.inc(sset, index), index)) for index in V]
cnt = 0
for index in V:
_heappush_max(order, (F.inc(sset, index), index))
cnt += 1
n_iter = 0
while order and len(sset) < B:
n_iter += 1
if F.curVal == len(F.D):
# all points covered
break
el = _heappop_max(order)
improv = F.inc(sset, el[1])
# check for uniques elements
if improv > 0:
if not order:
curVal = F.add(sset, el[1], improv) # NOTE: added "improv"
sset.append(el[1])
vals.append(curVal)
else:
top = _heappop_max(order)
if improv >= top[0]:
curVal = F.add(sset, el[1], improv) # NOTE: added "improv"
sset.append(el[1])
vals.append(curVal)
else:
_heappush_max(order, (improv, el[1]))
_heappush_max(order, top)
return sset, vals