2014-11-18 20 views
13

Sto provando a scrivere un bilanciatore di carico in Haskell con la strategia di leastconn (in parte per divertimento ..). Ho bisogno di una coda di priorità dove solo le seguenti operazioni devono essere 'veloce':Coda di priorità rapida con aggiornamenti incrementali

  • lettura minima della chiave
  • +1 minima della chiave
  • -1 su qualsiasi tasto

Se ho avuto un linguaggio imperativo con i puntatori, probabilmente venire con:

Head 
    | 
Priority 0 -> Item <-> Item <-> Item <-> Item 
    | 
Priority 1 -> Item <-> Item 
    | 
Priority 4 -> Item <-> Item <-> Item 

Le priorità sono collegati tramite un doppio collegamento lista, anche gli articoli per ogni priorità. Ogni Item contiene un collegamento alla priorità della testa. Tale struttura avrebbe complessità:

  • O (1) per la chiave minima leggere - Prendere prima dalla coda sotto la testa
  • O (1) per 1 - rimuovere prima voce sotto prioritaria, inserirla a livello inferiore (possibilmente creando un nuovo livello)
  • O (1) per -1 - a condizione che abbiamo un puntatore all'elemento, possiamo accedere immediatamente alla Priorità, rimuovere l'elemento dall'elenco doppiamente collegato e inserirlo in uno diverso

Esiste una struttura dati (funzionale?) Che si comporterebbe in modo approssimativo? Il numero di elementi sarebbe approssimativamente al massimo un paio di centinaia.

+2

Penso che sia un fatto abbastanza stabilito che non è possibile avere tutte le operazioni della coda di priorità O (1). Mentre l '"inserimento" o "rimozione" in quanto tale sono a buon mercato, il costo appare quando si considera il tempo per trovare il punto da inserire o rimuovere, e lo sforzo per riequilibrare (mantenere ordinati). –

+0

Che dire di 'Data.Heap'? – josejuan

+2

Sassa, questo vale per gli heap generici, ma quando limito le operazioni a +/- 1, posso aggiornare la priorità semplicemente spostandola verso l'alto o verso il basso nell'elenco delle priorità da un livello noto e cioè O (1) – ondra

risposta

1

Mi sembra che la struttura comune più adatta alle proprie esigenze sia una coda di ricerca prioritaria come descritto in Hinze (2001). Uno dei migliori pacchetti di hackage che fornisce tale struttura è qui: http://hackage.haskell.org/package/psqueues

Questo forse non è regolato esattamente per il tuo flusso di lavoro, ma certamente non è squallido!

+0

Non sono sicuro delle complessità - penso che non sia O (1), ma O (min (n, W)) mi sembra che più o meno possa essere considerato in questo modo per i problemi della vita reale. .. – ondra

+0

sì - le complessità non sono esattamente le stesse. è tipicamente la struttura funzionale che mi piacerebbe raggiungere in una situazione del genere comunque :-) – sclv

Problemi correlati