Mi è stato chiesto in un'intervista di fornire un algoritmo O (n) per stampare un elemento che appare più di n/2 volte in un array, se c'è un tale elemento. n è la dimensione dell'array. Non ho idea di come farlo. Qualcuno può aiutare?O (n) algoritmo per scoprire l'elemento che appare più di n/2 volte
risposta
È il Boyer's Voting algorithm.
È anche O (1) nello spazio !.
Modifica
Per coloro che si lamentano la combinazione di colori sito (come me) ... here is the original paper.
La combinazione di colori su quel link è orribile. –
Ecco alcune ulteriori informazioni: http://stackoverflow.com/questions/780937/linear-time-voting-algorithm-i-dont-get-it – chrisaycock
Bella lettura. Mi ci è voluto un minuto per trovare la logica sottile che evita di mantenere i conteggi indipendenti: "..._ incrementa o decrementa il contatore_ a seconda che e sia l'attuale candidato ..." –
In psuedocodarlo:
int n = array.length
Hash<elementType,int> hash
foreach element in array
hash[element] += 1
foreach entry in hash
if entry.value > n/2
print entry.key
break
Questo non dovrebbe essere considerato O (2n)? –
O (2n) == O (n) credo – Samuel
@Eric Questo sarebbe 'O (n + m)'. A proposito, non esiste qualcosa come "O (2n)' come grande-O non usa coefficienti costanti; in tal caso è solo 'O (n)'. – chrisaycock
E 'anche il valore mediano, che prende O (n) per trovare utilizzando il median-of-medians algorithm. In C++ puoi farlo in una riga:
std::nth_element(begin, begin + n/2, begin + n)
Si noti tuttavia che 'std :: nth_element' è richiesto solo per essere previsto O (n) e quindi probabilmente non usa l'algoritmo mediano-di-mediani. La selezione rapida come la selezione tende ad essere migliore in pratica rispetto alla m-of-m. –
- 1. più lunga sottostringa che appare n volte
- 2. numero che appare più di n/3 volte in una matrice
- 3. Un algoritmo di ordinamento O (n)
- 4. O (n) Algoritmo per scoprire se 2 array hanno 2 elementi che si sommano a un numero
- 5. Algoritmo C++ per N! ordini
- 6. per o mentre il ciclo fa qualcosa n volte
- 7. ottenere l'articolo che appare il più delle volte in un array
- 8. Algoritmo più veloce per scoprire se un BigInteger è un numero primo o no?
- 9. Esiste un algoritmo O (n) per costruire un max-heap?
- 10. Algoritmo di distanza di Levenshtein meglio di O (n * m)?
- 11. SQL conta quante volte un valore appare in più colonne?
- 12. Architettura MySQL per algoritmo n * (n - 1)/2
- 13. Questo algoritmo di O (n^4) è evitabile?
- 14. Perché la complessità spaziale di questo algoritmo è O (1)
- 15. Algoritmo per risolvere il puzzle di N Queens Domination
- 16. O (n) algoritmo per trovare la mediana di una raccolta di numeri
- 17. Algoritmo intervista di puzzle
- 18. Che cos'è O (log * N)?
- 19. MATLAB: duplicazione vettore 'n' volte
- 20. Questo algoritmo dovrebbe essere eseguito in O (n)?
- 21. Raccomandazione ASP.Net CMS, frutteto, Sitefinity, Umbraco o N2?
- 22. C'è un modo rapido per scoprire se (n-1)! è divisibile per n?
- 23. Che cos'è l'analisi Big O di questo algoritmo?
- 24. Esempio di Big O di 2^n
- 25. constexpr per concatenare due o più stringhe di carattere
- 26. --launcher.XXMaxPermSize appare due volte in eclipse.ini
- 27. Differenza tra O (n) e O (log (n)) - che è migliore e che cosa è esattamente O (log (n))?
- 28. dinamica programmazione algoritmo N, K problema
- 29. Intersezioni cerchio di calcolo in O ((n + s) log n)
- 30. Un algoritmo efficiente per trovare le finestre pangrammatiche più piccole?
È sufficiente utilizzare un hash e contare il numero di elementi durante la scansione attraverso l'array? – chrisaycock
Non sicuro. Penso che ci dovrebbe essere una soluzione più semplice ed elegante. – devnull
Oh. Non hai chiesto il più elegante, solo O (n) – Samuel