Si vous faites cela en un nombre constant de passages dans la liste, vous avez besoin d'une seconde structure de données.
Si vous avez des limites inférieures et supérieures pour les valeurs de cet ensemble et que les valeurs sont relativement denses, alors un tableau de compteurs est une bonne solution.
Sinon, il est préférable d'utiliser un Map<Integer, Integer>
, où les clés sont des éléments de l'ensemble et les valeurs sont des compteurs.
Analyse
Si vous ne savez pas avoir des bornes inférieures/supérieures sur l'ensemble avant de commencer, vous n'avez pas grand un tableau des compteurs à allouer. Donc, vous devez faire un passage préliminaire sur le tableau pour trouver les limites ... et vous avez maintenant une solution à deux passes. Si vous avez des limites inférieures et supérieures mais que l'ensemble est clairsemé, le coût d'initialisation de la matrice de comptes + le coût de la recherche des trois plus grands comptes dominera le coût du comptage des éléments de l'ensemble. Si la différence est suffisamment grande (c'est-à-dire que l'entrée est grande & très éparse), une HashMap sera plus rapide et prendra moins de mémoire.
Vous pouvez également
Si vous êtes autorisé à modifier le tableau, vous pouvez trier dans l'ordre ascendant O(NlogN)
puis trouver les trois éléments les plus communs en un seul passage sur le tableau trié.
L'expression « si boucle » me fait mal au cerveau. – sje397
if (ifloop) {me.gougeOutEyes();} – ubiquibacon
Lié - [Le moyen le plus efficace de trouver les mots les plus fréquents K dans une séquence Big Word] (http: // stackoverflow.com/q/185697) (peut-être pas un doublon, parce que cela traite des mots, cela traite des nombres - certaines approches diffèrent) – Dukeling