Определите предмет как имеющий:
- уникальный идентификатор
- значение
- время создания
- время удаления
У меня есть два входных потока - один, который сообщает мне, когда элемент создается, другой, который сообщает мне, когда элемент удаляется. Назовите предмет, который был создан, но не уничтожен, как «живой».
Я могу отслеживать максимальную стоимость всех живых предметов, используя кучу:
whenCreated(item):
i = heap.size
heap-up(item, heap.size)
heap.size = heap.size + 1
max-value = heap[0]
whenDeleted(item):
ktem = heap[heap.size - 1]
heap.size = heap.size - 1
heap-up(ktem, index[item.id])
heap-down(ktem, index[ktem.id])
max-value = heap[0]
heap-up(item, i):
while (i > 0):
j = floor( (i-1) / 2 )
jtem = heap[j]
if (jtem.value > item.value):
break while
index[jtem.id] = i
heap[i] = heap[i]
i = j
index[item.id] = i
heap[i] = item
heap-down(item, i):
while (2*i + 1 < heap.size):
if (2*i + 1 == heap.size or heap[2*i+1].value > heap[2*i+2].value):
j = 2*i + 1
else
j = 2*i + 2
jtem = heap[j]
if (jtem.value < item.value):
break while
index[jtem.id] = i
heap[i] = heap[i]
i = j
index[item.id] = i
heap[i] = item
Если у меня есть n
предметов, то добавление или удаление одного занимает O(log n)
времени.
Теперь предположим, что элементы сгруппированы так, что даны два элемента: a
и b
, |a.value - b.value| < delta
& rArr; a
и b
находятся в одном кластере.
Например, если у нас есть значения (1, 2, 3, 4, 7, 8, 11, 13, 14, 15, 16)
и delta = 2
, то кластерами являются (1, 2, 3, 4)
, (7, 8)
, (11)
и (13, 14, 15, 16)
.
Я бы хотел отследить минимальное значение кластера, которое содержит максимальное жизненное значение. Я могу сделать это, считывая значения из кучи по порядку, пока не найду разрыв между значениями размера, превышающими delta
Однако это занимает O(n)
времени, что кажется довольно неэффективным.
Существует ли алгоритм O(log n)
для отслеживания минимального значения этого кластера?