Si utilizzerà un heap min-max-mediano per trovare il minimo, il massimo e la mediana in tempo costante (e prendere il tempo lineare per costruire l'heap). Puoi utilizzare gli alberi delle statistiche degli ordini per trovare il k più piccolo/valore più grande. Entrambe queste strutture di dati sono descritte in this paper on min-max heaps [pdf link]. Gli heap min-max sono heap binari che si alternano tra min-heap e max-heap.
Dalla carta: Un mucchio min-max-mediana è un cumulo binaria con le seguenti proprietà:
1) La mediana di tutti gli elementi si trova alla radice
2) Il sottoalbero sinistro la radice è un HL min-max di dimensione del soffitto [((n-1)/2)] contenente elementi inferiori o uguali alla mediana. Il sottoalbero di destra è un Hr di dimensioni massime min. [((N-1)/2)] contenente solo elementi maggiori o uguali alla mediana.
Il foglio continua a spiegare come creare un simile heap.
Modifica: dopo aver letto il documento più a fondo, sembra che la costruzione degli heap min-max-mediani richieda di trovare prima la mediana (FTA: "Trova la mediana di tutti gli n elementi usando uno qualsiasi dei noti linear- algoritmi del tempo "). Detto questo, una volta costruito l'heap, è possibile mantenere la mediana semplicemente mantenendo l'equilibrio tra l'heap min-max a sinistra e l'heap max-min a destra. DeleteMedian sostituisce la radice con il min dell'heap max-min o il massimo dell'heap min-max (a seconda di quale mantiene il saldo).
Quindi, se si prevede di utilizzare un heap min-max-mediano per trovare la mediana di un set di dati fisso, si è SOL ma se lo si utilizza su un set di dati modificabile è possibile.
fonte
2010-04-09 23:34:46
Penso che possa essere sbagliato in merito alla mediana e al k-esimo, ma sarei molto felice di essere smentito, soprattutto per la mediana. –
Duplicato: http: // stackoverflow.it/questions/810657/quick-code-c-c-to-select-the-median-in-a-set-of-27-floating-point-values – Jacob
Non è un duplicato. (Penso, ma potrebbe essere sbagliato) non si tratta di algoritmi di selezione, ma di ottenere mediana per essere O (1) volta, dopo che gli heap sono stati creati. –