Для примера из официального heapq:
>>> heap = []
>>> data = [(1, 'J'), (4, 'N'), (3, 'H'), (2, 'O')]
>>> for item in data:
... heappush(heap, item)
...
>>> while heap:
... print(heappop(heap)[1])
J
O
H
N
Я хочу дополнительно реализовать эффективный selected_pu sh такой, чтобы
- селективный_pu sh ((1, «M»)) эквивалентно heappu sh, поскольку «M» отсутствует в куче
- селективный_pu sh ((3.5, «N»)) эквивалентно куче [2] = (3.5 , 'N'); heapify (heap), так как 3.5 <4 </li>
- селективный_pu sh ((4.5, 'N')) ничего не делает, так как 4.5> 4
Следующая реализация объясняет цель, но медленно :
def selective_push(heap,s):
NotFound=True
for i in range(len(heap)): #linear search
if heap[i][1]==s[1]:
if s[0]<heap[i][0]:
heap[i]=s #replacement
heapify(heap)
NotFound=False
break
if NotFound:
heappush(heap,s)
Я думаю, что это медленно из-за линейного поиска, который разрушает сложность log (n) heapq.push
. Коэффициент замещения низкий, но линейный поиск всегда выполняется.