Con i pesi dei contatori interi è possibile utilizzare il benna per ottenere una coda di priorità con la complessità del caso peggiore O(1)
, ma ulteriore complessità dello spazio O(U)
.
All'interno degli algoritmi MST che hai menzionato dovresti essere in grado di sostituire le code di priorità basate sul confronto con questa struttura integer, e quindi rimuovere la depenenza O(log(n))
nei requisiti di complessità. Immagino che ti ritroverai con una complessità complessiva nello stile di O(n + m)
.
In sostanza si imposta una serie di compressi collegate liste, dove ogni lista è indicizzato dal costo associato a quel secchio (intero!):
struct bucket_list
{
_cost; // array[0..N-1] holding current cost for each item
_head; // array[0..U-1] holding index of first item in each bucket
_next; // array[0..N-1] where _next[i] is the next item
// in a list for the ith item
_prev; // array[0..N-1] where _prev[i] is the last item
// in a list for the ith item
};
Questa struttura si basa sul fatto che ogni elemento può sii solo in una lista di secchi singoli contemporaneamente.
sulla base di questa struttura è possibile ottenere nel caso peggiore O(1)
complessità di queste operazioni:
push(item, cost); // push an item onto the head of the appropriate bucket list
_pop(item, cost); // _pop an item from (anywhere!) within a bucket list
update(item, old_cost, new_cost); // move an item between buckets by combining
// push and _pop
Per utilizzare questa struttura come una coda di priorità è sufficiente mantenere un indice puntato verso il secchio minima corrente per eseguire la scansione. Quando vuoi ottenere il prossimo oggetto a minor costo, devi semplicemente estrarre l'elemento principale da questo bucket. Se il bucket è vuoto, incrementa l'indice del bucket finché non ne trovi uno non vuoto.
Ovviamente se U
diventa molto grande, la complessità extra dello spazio e la possibilità di una distribuzione sparsa di articoli oltre i bucket possono rendere poco attraente questo tipo di approccio.
fonte
2012-01-16 00:39:09
Le lunghezze sono anche limitate a numeri interi o limitate a tale intervallo? – harold
@ harold: sono numeri interi. Posterò una correzione – templatetypedef
Diverse fonti menzionano un algoritmo di tempo lineare per questo, ma link a qualcosa che non riesco a visualizzare. – harold