Si les données sont déjà dans un tableau que vous pouvez modifier, vous pouvez utiliser une variante de Hoare de sélection de l'algorithme, qui est (à son tour) une variante de Quicksort.
L'idée de base est assez simple. Dans Quicksort, la partition de la matrice en deux morceaux, l'un des éléments plus grands que le pivot, et de l'autre des éléments plus petits que le pivot. Ensuite, vous récursive trier chaque partition.
Dans la sélection de l'algorithme, vous ne l'étape de partitionnement exactement comme avant -- mais plutôt de manière récursive tri les deux partitions, vous regardez la partition qui contient les éléments que vous voulez, et de manière récursive sélectionner UNIQUEMENT dans la partition. E. g., en supposant que votre 100 millions d'articles partition de près de moitié, la première de plusieurs itérations vous allez seulement à la partie supérieure de la partition.
Finalement, vous êtes susceptible d'atteindre un point où la partie que vous voulez "ponts" deux partitions -- par exemple, vous avez une partition de ~150 numéros, et quand vous la partition que vous vous retrouvez avec deux morceaux de ~75 la pièce. À ce stade, un seul petit détail change: au lieu de rejeter une partition et de la poursuite des travaux que l'autre, vous acceptez la partie supérieure de la partition de 75 articles, et puis continuer à chercher pour le top 25 dans le bas de la partition.
Si vous faisiez cela en C++, vous pouvez le faire avec std::nth_element
(qui sera normalement mis en œuvre environ comme décrit ci-dessus). En moyenne, ce qui a linéaire de la complexité, qui je crois est à peu près aussi bon que ce que vous pouvez espérer (en l'absence d'une affection préexistante de l'ordre, je ne vois pas de moyen de trouver les N premiers éléments sans les regarder, tous les éléments).