Definir un elemento por tener:¿Encontrando el valor mínimo del grupo máximo?
- un identificador único
- un valor
- un tiempo de creación
- una deleción tiempo
he dos flujos de entrada - uno que me informa cuando se crea un elemento, uno que me informa cuando se elimina el elemento. Llamar a un elemento que ha sido creado pero no destruido "vivo".
que puede realizar un seguimiento del valor máximo de todos los elementos vivos utilizando una pila:
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
Si Tengo n
artículos, a continuación, añadiendo o eliminando uno toma O(log n)
tiempo.
Supongamos ahora que los artículos se agrupan de tal manera que da dos artículos, a
y b
, |a.value - b.value| < delta
⇒ a
y b
están en el mismo grupo.
Por ejemplo, si tenemos los valores (1, 2, 3, 4, 7, 8, 11, 13, 14, 15, 16)
y delta = 2
, a continuación, los racimos son (1, 2, 3, 4)
, (7, 8)
, (11)
y (13, 14, 15, 16)
.
Me gustaría realizar un seguimiento del valor mínimo del clúster que contiene el valor de vida máximo. Puedo hacer esto leyendo valores del montón en orden hasta que encuentre un espacio entre valores de tamaño mayor que igual a delta
. Sin embargo, esto toma el tiempo O(n)
, que parece bastante ineficaz.
¿Hay un algoritmo O(log n)
para rastrear el valor mínimo de ese clúster?
¿Los clústeres son transitivos? Por ejemplo, si el delta es 2, ¿1, 2, 3, 4, 5 y 6 están todos en el mismo grupo? – templatetypedef
Dudo que puedas hacerlo solo con tu montón actual. Parece que necesitará una estructura de datos separada para hacer esto de manera eficiente. Un conjunto disjunto sería bueno, aunque sus clústeres pueden fusionarse y luego desaparecer, por lo que necesita algo que permita la separación (lo que no ocurre con la unión-unión), también conocido como el refinamiento de la partición. – davin
La respuesta de templatetypedef funciona, aunque parece una implementación difícil. Si no anticipa muchos casos dudosos, tal vez valga la pena la simple solución 'O (n)'. Es decir, si será raro que el final del clúster cambie a menudo, entonces no es el fin del mundo. Puedes mejorarlo ligeramente moviéndote a BST y manteniendo un único puntero, y luego tu trabajo 'O (n)' no ocurre en delete, solo en inserts e incluso entonces, si esperas pequeños clusters relativos a 'n' no debería ser notable. – davin