Определите элемент как имеющий:
У меня есть два входных потока - один, который информирует меня, когда создается элемент, который информирует меня об удалении элемента. Назовите элемент, который был создан, но не уничтожен, «живым».
Я могу отследить максимальное значение всех живых элементов с помощью кучи:
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 |
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)
.
Я хотел бы отслеживать минимальное значение кластера, содержащего максимальную жизненную ценность. Я могу сделать это, считывая значения из кучи по порядку, пока не найду разрыв между значениями, размер которых больше, чем равный дельте
. Однако это занимает O (n)
времени, что кажется довольно неэффективным.
Существует ли алгоритм O (log n)
для отслеживания минимального значения этого кластера?