Vous pouvez garder une file d'attente prioritaire de les 100 plus grand nombre, l'itération à travers les milliards de chiffres, chaque fois que vous rencontrez un nombre plus grand que le plus petit numéro dans la file d'attente (la tête de la file d'attente), de supprimer la tête de la file d'attente et ajouter le nouveau numéro de la file d'attente.
EDIT:
en tant que Dev a noté, avec une file d'attente de priorité mis en œuvre par un segment de mémoire, la complexité de l'insertion pour la file d'attente est - O(logN)
Dans le pire des cas, vous obtenez billion*log
ce qui est mieux que 2
En général, si vous avez besoin le plus grand K nombres à partir d'un ensemble de N nombres, la complexité est - (100)
plutôt que d' billion*log
, ce qui peut être très important lorsque K est très faible en comparaison des N.
EDIT2:
Le temps de cet algorithme est assez intéressant, car à chaque itération une insertion peut ou peut ne pas se produire. La probabilité de la i-ième nombre pour être inséré dans la file d'attente est la probabilité d'une variable aléatoire est supérieure à au moins 2
variables aléatoires à partir de la même distribution (les k premiers nombres sont automatiquement ajoutés à la file d'attente). Nous pouvons utiliser les statistiques d'ordre (voir lien) pour calculer cette probabilité. Par exemple, supposons les nombres ont été choisis au hasard uniformément à partir d' (billion)
, la valeur attendue de (i-K), le nombre (de je numéros) O(NlogK)
, et la probabilité d'une variable aléatoire étant plus grande que cette valeur est O(NlogN)
.
Ainsi, le nombre d'insertions est:
Et la durée de temps d'exécution peut être exprimé comme:
(i-K
temps de génération de la file d'attente avec le premier {0, 1}
éléments, (i-k)/i
comparaisons, et le nombre d'insertions, comme décrit ci-dessus, chacun prend une moyenne 1-[(i-k)/i] = k/i
du temps)
Notez que lors de l' k
est très grand en comparaison des k
, cette expression est beaucoup plus proche d' n-k
plutôt que d' log(k)/2
. C'est un peu intuitif, comme dans le cas de la question, même après 10000 itérations (ce qui est très faible comparer à un milliard de dollars), les chances d'un certain nombre pour être inséré dans la file d'attente est très faible.