Definire un oggetto come avente:Trovare il valore minimo del cluster massimo?
- un ID univoco
- un valore
- un tempo di creazione
- una delezione tempo
ho torrenti due ingressi - uno che mi informa quando viene creato un articolo, uno che mi informa quando l'oggetto viene cancellato. Chiama un oggetto che è stato creato ma non distrutto "vivente".
faccio a monitorare il valore massimo di tutti gli elementi che vivono con un mucchio:
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
Se ho n
voci, poi aggiungendo o eliminando uno prende O(log n)
volta.
Ora supponiamo gli elementi sono raggruppati in modo tale che dato due elementi, a
e b
, |a.value - b.value| < delta
⇒ a
e b
sono nello stesso cluster.
Per esempio, se abbiamo i valori (1, 2, 3, 4, 7, 8, 11, 13, 14, 15, 16)
e delta = 2
, poi i grappoli sono (1, 2, 3, 4)
, (7, 8)
, (11)
e (13, 14, 15, 16)
.
Vorrei tracciare il valore minimo del cluster che contiene il valore di vita massimo. Posso farlo leggendo i valori dall'heap in ordine finché non trovo uno spazio tra i valori di dimensione maggiore di uguale a delta
. Tuttavia, questo richiede tempo O(n)
, che sembra piuttosto inefficace.
Esiste un algoritmo O(log n)
per tracciare il valore minimo di tale cluster?
I cluster sono transitivi? Ad esempio, se il delta è 2, sono 1, 2, 3, 4, 5 e 6 tutti nello stesso cluster? – templatetypedef
Dubito che tu possa farlo solo con il tuo heap corrente. Sembra che avrai bisogno di una struttura dati separata per farlo in modo efficiente. Un insieme disgiunto sarebbe buono, anche se i tuoi cluster possono unirsi e quindi separarsi, quindi hai bisogno di qualcosa che permetta la separazione (che non trova il sindacato), o il raffinamento delle partizioni. – davin
La risposta di templatetypedef funziona, anche se sembra un'implementazione difficile. Se non prevedi molti casi limite allora forse vale la semplice soluzione 'O (n)'. Significato se sarà raro che la fine del cluster cambi spesso, quindi non è la fine del mondo. Puoi migliorarlo leggermente spostandoti su un BST e mantenendo un singolo puntatore, e quindi il tuo lavoro 'O (n)' non avviene su delete, solo sugli insert e anche allora, se ti aspetti piccoli cluster relativi a 'n' non dovrebbe essere evidente. – davin