Dato N numeri interi arbitrari, come trovare la media della metà superiore di questi numeri? Esiste una soluzione O (n)? Se no è possibile provare che non è possibile?Come trovare la media della metà superiore di N numeri?
risposta
Innanzitutto, trovare uno median dell'array dato (è takes linear time).
Quindi, basta camminare attraverso la matrice e riassumere tutti gli elementi che sono maggiori della mediana.
Contare quanti elementi sono stati sommati (M
). Se M < N/2
, significa che diversi elementi uguali al valore mediano (ovvero, N/2 - M
) appartengono alla metà superiore. Aggiungi alla tua somma tanti valori mediani. Abbiamo bisogno di questa complessità perché non sappiamo quanti elementi mediani (ce ne possono essere diversi) appartengono alla metà superiore: se li prendiamo tutti, possiamo concludere che abbiamo sommato più di N/2
elementi.
Ora si ha la somma della metà superiore dell'array. Dividi per N/2
e il gioco è fatto.
Oppure il codice potrebbe essere più semplice se si esegue un passaggio O (n) extra e si conta solo il numero di elementi uguale alla mediana. Questo ti dice quanti elementi uguali alla mediana includere nella media. –
Ancora più semplice sarebbe utilizzare quasi tutti gli algoritmi per trovare una mediana e trovare una partizione dell'elenco di input in una parte superiore e inferiore. Quindi una volta trovata la mediana tutti gli elementi nella metà superiore sono già noti. – Accipitridae
vorrei suggerire questo:
Usa Quicksort, selezionare alcune pivot. Questa partizione verrà suddivisa in due sottoliste, una più piccola del pivot, una più grande di quella. Se la dimensione della sottolista più piccola è < = N/2, calcolare la media dire a1
.
Se size == N/2 or size == N/2 -1
hai finito immediatamente.
Se non la ripartizione, la sottolista maggiore fino alla dimensione totale è N/2.
Se la dimensione> N/2 divide la sottolista più piccola.
Ripeti tutto fino a fine.
P.S: non è necessario ordinare.
È 'O (n^2)' nel peggiore dei casi ... –
È possibile utilizzare una coda di priorità. Inserisci gli elementi nella coda mantenendo un conteggio del numero di elementi che hai visto, n
. Estrai n/2
elementi massimi dalla coda in un accumulatore e calcola la media.
Con una struttura dati ben selezionata dietro la coda, ad esempio un heap di Fibonacci, si otterrà il runtime O(n log n)
, poiché l'inserimento è O(1)
e l'estrazione è O(log n)
.
Sfortunatamente non il tempo di esecuzione O (n) che stavi cercando, ma con la struttura dati già implementata, questo produrrebbe un codice diretto molto comprensibile.
* Trovare * il massimo è O (1) in un heap di Fibonacci, ma * rimuoverlo * (consentendo così a quale era il secondo-massimo essere trovato in un altro O (1)) è O (log n). Se "insert" e "remove max" erano veramente entrambi O (1) in un heap di Fibonacci, allora sarebbe possibile usarne uno per eseguire un ordinamento di confronto in O (n). –
Hai perfettamente ragione, mi scuso, ho modificato la mia risposta di conseguenza. Quel fastidioso nlogn inferiore legato allo smistamento! –
Questo è ovviamente risolvibile in tempo lineare, se è possibile trovare la mediana in tempo lineare. E trovare una mediana in tempo lineare è complicato, ma possibile. Vedi ad esempio l'articolo di Wikipedia su selection algorithms.
- 1. Spiegazione della media sicurezza di due numeri
- 2. C'è un modo per trovare la media aritmetica "migliore" di sum()/N?
- 3. Matrice di numeri e numeri a metà in Ruby
- 4. Riordina una stringa della metà del carattere
- 5. Come trovare sottosequenze crescenti di numeri con la somma massima?
- 6. Trova la media della collezione di TimeSpans
- 7. O (n) algoritmo per trovare la mediana di una raccolta di numeri
- 8. Ottimizzazione media della varianza
- 9. Come trovare i k vicini più vicini alla mediana di n numeri distinti nel tempo O (n)?
- 10. Come eliminare N numeri di documenti in mongodb
- 11. Genera un numero casuale nell'intervallo [M .... N] con media X
- 12. i panda ottengono la media della colonna/media
- 13. Utilizza awk per trovare la media di una colonna
- 14. fattoriale di n numeri usando C# lambda ..?
- 15. Generazione di numeri casuali da -n a n in C
- 16. Come trovare la somma cumulativa di numeri in una lista?
- 17. Trovare la media di un array usando JS
- 18. generare una sequenza di numeri naturali N
- 19. Fattoriale/i di N numeri per ciclo
- 20. C++ k numeri casuale campioni della gamma 0: n-1 (n> k) senza sostituzione
- 21. Creazione di un rettangolo drawable in xml con un gradiente nella metà superiore e un altro nella metà inferiore
- 22. Python- Come trovare la media di più valori/chiave in un dizionario
- 23. Calcolo della media mobile
- 24. Valutazione della deviazione assoluta media di un insieme di numeri in Oracle
- 25. Trovare gruppi di numeri in un elenco
- 26. Scorrere verso la parte superiore della pagina
- 27. Come quantificare la qualità di un generatore di numeri pseudocasuali?
- 28. MySQL Raggruppa con un numero superiore N di ogni tipo
- 29. Come posso eliminare il contorno bianco sottile nella metà superiore di questo cerchio?
- 30. Grafico della casella che mostra la media come linea
La domanda dovrebbe riguardare la programmazione (ad esempio, risolvere questo utilizzando un programma)? – BoltClock
Io donno. Puoi dare una formula matematica se hai un metodo. È solo una domanda per un colloquio. – Seeker
Questa è una delle domande, in cui l'intervistatore vuole sapere se il candidato può ridurre i problemi del mondo reale agli algoritmi noti. Questo è spesso più importante della possibilità di recitare gli algoritmi stessi. Quindi, ho difficoltà a capire perché questa domanda è stata chiusa come fuori tema. – Accipitridae