Qual è il modo migliore per tenere traccia della mediana?

8

Ho letto una domanda e sto cercando suggerimenti su come risolverlo:

Numbers are randomly generated and stored into an (expanding) array, How would you keep track of the median?

Ci sono due strutture dati in grado di risolvere il problema. Uno è l'albero binario bilanciato, l'altro è due cumuli che tengono traccia della metà più grande e della metà più piccola degli elementi. Penso che queste due soluzioni abbiano lo stesso tempo di esecuzione di O(n lg n) , ma non sono sicuro del mio giudizio.

Qual è il modo migliore per tenere traccia della mediana?

Il mio tentativo:

In questa domanda, penso che un mucchio sia il modo migliore per tenere traccia della mediana. Ci sono due heap, il grande heap e il piccolo heap, che non devono essere sequenziali. Innanzitutto, calcoliamo il valore medio degli elementi nella matrice. Se l'elemento è inferiore al valore medio, inseriamo il num nel piccolo heap. Al contrario, mettiamo il numero sul grande mucchio. Se il numero del grande heap è uguale al numero del piccolo heap, il più grande nel piccolo heap e il più piccolo nel grande heap sono la mediana. Se i due heap hanno dimensioni diverse, inseriamo l'elemento radice dall'heap con dimensioni maggiori e lo inseriamo nella radice dell'heap di dimensioni più piccole. Per l'heap grande, l'elemento radice è il più piccolo e, per l'heap piccolo, l'elemento radice è il più grande. In questo modo, se i due heap hanno la stessa dimensione o una differenza digitale, troviamo il supporto nella radice.

Penso che questa soluzione abbia il tempo di esecuzione come O (m * n), m indica le volte in cui aggiustiamo gli heap di squilibrio.

È questo il modo migliore per tenere traccia della mediana?

    
posta Steven Mou 28.06.2011 - 17:37
fonte

3 risposte

1

Probabilmente ci sono più di 2 strutture dati che risolvono questo problema. Dai un'occhiata a Mediani approssimativi e altri quantili in un solo passaggio e con memoria limitata

Non usano due heap. Immagino che potresti modificare il loro algoritmo per ottenere periodicamente un valore approssimativo della mediana. La buona approssimazione, ovviamente, dipende da molti fattori, non ultimo il numero di dati che sono passati attraverso l'algoritmo.

    
risposta data 29.06.2011 - 19:39
fonte
0

Una soluzione migliore è usare una lista di salti. Poiché l'elenco in cui verrà inserito verrà sempre mantenuto come elenco ordinato (in base al modo in cui lo si sta costruendo), la complessità dell'inserimento è O (log n). Trarrai vantaggio dal fatto che il primo inserimento ti fornisce la mediana a costo zero (l'elemento inserito è la mediana). Dopo ogni inserimento aggiuntivo, la lista viene ancora ordinata e la mediana stessa si sposta verso l'alto o verso il basso di un singolo indice e questo confronto è O (1).

Complessità totale = O (log n)

    
risposta data 29.06.2011 - 17:55
fonte
0

In effetti puoi trovare la mediana nelle operazioni O (n) solo trovando il k th numero più piccolo in una lista, :) guarda Algoritmo di selezione mediana dei medi per i dettagli.

    
risposta data 17.07.2011 - 21:39
fonte

Leggi altre domande sui tag