Selezione efficiente della mediana e degli elementi a sinistra e a destra


14

Supponiamo di avere un set di programmatori.S={un'1,un'2,un'3,...,un'N}N

Ogni programmatore ha il punteggio e il numero di medaglie d'oro E i , che avevano vinto finora.RioEio

Una società di software vuole assumere esattamente tre programmatori per sviluppare un'applicazione.

Per assumere tre programmatori, hanno sviluppato la seguente strategia:

  1. Prima organizzano i programmatori in ordine crescente di classificazione e ordine decrescente di medaglie d'oro.
  2. Da questo elenco organizzato, selezionano i tre codificatori centrali. Ad esempio, se l'elenco organizzato è selezionano ( a 2 , a 3 , a 1 ) codificatori.(un'5,un'2,un'3,un'1,un'4)(un'2,un'3,un'1)

Ora dobbiamo aiutare l'azienda scrivendo un programma per questo compito.

Ingresso:

La prima riga contiene , ovvero il numero di programmatori.N

Poi la seconda riga contiene i feedback dei esima coder.Rioio

La terza riga contiene il numero di medaglie d'oro insaccate dal codificatore.io

Produzione:

Visualizza solo una riga che contiene la somma delle medaglie d'oro guadagnate dai tre programmatori selezionati dall'azienda.


3
Quindi i programmatori con punteggio più alto vincono sempre meno medaglie ?? In caso contrario, quale ordine stai effettivamente utilizzando per ordinare?
JeffE,

Risposte:


16

Questo è un problema di selezione dell'elemento più piccolo dall'elenco risolto da una classe di algoritmi chiamata algoritmi di selezione . Esistono algoritmi di selezione del tempo lineare deterministico, quindi il problema può essere risolto in tempo lineare selezionando n / 2 , n / 2K ° più piccoli dall'elenco originale non ordinato.n/2,n/2-1,n/2+1


6
Se lo desideri, puoi eseguire l'algoritmo di selezione una volta per trovare la mediana, quindi trovare il minimo e il massimo nelle partizioni destra e sinistra rispettivamente in un colpo solo.
Zach Langley,

@Sid @ Zach Langley Ciao, per favore, puoi fornire il codice pseudo. Sono passato attraverso wiki paedia ma ti senti un po 'difficile da capire, quindi puoi fornire il codice pseudo grazie mille!
Jack,

@Jack hai familiarità con il funzionamento di quicksort? L'algoritmo di selezione randomizzato è essenzialmente lo stesso, tranne per il fatto che ricorre solo su un lato di ciascun perno.
Zach Langley,

6
@Jack: l'articolo di Wikipedia sugli algoritmi di selezione (collegato nella risposta di Sid) contiene pseudocodice. Google funziona anche.
JeffE,

@Sid :: Ho letto l'algoritmo wiki (algoritmo di selezione generale basato su partizioni). Dobbiamo chiamare la funzione di selezione tre volte con k = n / 2, k = n / 2-1, k / 2. Inoltre, quale sarà il valore di left, right mentre chiama la funzione select. Anche nella funzione di partizione, quale sarà il valore dell'indice di partizione.
Jack
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.