Écrire un programme pour trouver les 100 plus grands nombres d'un tableau de 1 milliards de chiffres

J'ai récemment assisté à une interview où on m'a demandé "écrire un programme pour trouver les 100 plus grands nombres d'un tableau de 1 milliard de dollars de chiffres".

J'ai seulement été en mesure de donner une force brute solution qui a été pour trier le tableau en O(nlogn) le temps de la complexité et de prendre les 100 derniers numéros.

Arrays.sort(array);

L'intervieweur a la recherche d'un meilleur temps de la complexité, j'ai essayé un couple de d'autres solutions, mais a échoué à lui répondre. Est-il un meilleur temps de la complexité de la solution?

  • Bucketsort pourrait être une allusion
  • Peut-être le problème, c'est que ce n'était pas une question de tri, mais un à la recherche d'un.
  • Comme une note technique de tri peut être pas le meilleur moyen de résoudre le problème, mais je ne pense pas que c'est de la force brute - je pense à une aggravation de la situation, des moyens de le faire.
  • Une autre force brute méthode serait de créer un réseau parallèle dans lequel vous stocker la position de chaque chiffre dans le "plus grand nombre" de la concurrence. Vous itérer le premier élément et affecter un 1. Lorsque vous arrivez à la 8701th un vous parcourez la précédente 8700 et "mise à jour" de leur position: Ajouter 1 s'ils sont inférieurs, et de la laisser dans le cas contraire (mais dans ce cas, ajouter un à la position de l'actuel, 8701th, nombre). Il est probablement en O(n^2).
  • Voir en.wikipedia.org/wiki/Partial_sorting et en.wikipedia.org/wiki/Selection_algorithm
  • Je viens de penser à un encore plus stupide de la force brute de la méthode...de Trouver toutes les combinaisons possibles de 100 éléments de la 1 milliards d'élément de tableau et de voir laquelle de ces combinaisons a la somme la plus importante.
  • Vous pouvez également parcourir le tableau et la copie de ses effectifs en une carte de jeux, dans lequel la clé est le nombre de chiffres de chaque numéro d'origine est. Alors vous ne devez effectuer une itération de votre carte par la clé dans le sens inverse de l'ordre et de garder saisissant vos numéros et de les compter. À un certain moment vous aimerai atteindre au-delà de 100 numéros, de sorte que vous besoin de sélectionner seulement certains des chiffres de la dernière série; dire par exemple que les jeux avec plus de 9 chiffres vous avais donné 96 numéros, et un ensemble de nombres à 8 chiffres contient 9 numéros: vous avez seulement besoin de 4 d'entre eux de sorte que vous aurez besoin de les trouver... par la force brute, bien sûr 🙂
  • Cette dernière stratégie a ses binaire de contrepartie, ce qui est intéressant, car il pourrait être appliqué sans l'aide de l'espace supplémentaire. Lire le premier bit de chaque numéro, en fonction du type dans lequel elle est stockée. Si il y a plus de 100 1, garder tous ces chiffres et d'éliminer ceux avec 0; sinon, vous avez déjà des gagnants (dire, 63) et vous avez besoin de garder une itération de trouver le reste des 37 numéros. Vous ferez cela en regardant le deuxième bit. Vous allez balayer les nombres de gauche à droite, de sorte que vous pouvez directement choisir ceux avec la plus extrême gauche 1s'.
  • Notez que tous les déterministe (et corriger) les algorithmes sont O(1) dans ce cas, car il n'y a pas de dimension augmentation. L'enquêteur doit m'ont demandé "Comment trouver les m plus grands éléments à partir d'un tableau de n avec n >> m?".
  • Oui, nous avons été en supposant que n a été l'un milliard seulement par le contexte. La confusion des concepts que l'interviewer a eu, c'est plutôt commun, à partir de mon expérience.
  • Je suis peut-être fou, mais ne pourriez-vous pas utiliser une variation sur un radix MSD trier pour en faire un algorithme O(n)?
  • Voir aussi: Obtenir les 100 plus grand nombre à partir d'une liste infinie
  • Wow, comment cette question peut devenir 59 jusqu'voix et la meilleure réponse 58 upvotes alors que cette question est seulement de 16 heures?
  • Il n'est pas rare que certaines question a plus de 50 upvotes après un jour. Ils sont une minorité, mais bien souvent, vous pouvez trouver l'un d'eux.
  • Cette question montre l'effort de la recherche; je pense que je vais upvote il. 79 d'autres peut-être pas tort, après tout.
  • Également similaire à Comment puis-je trier 1 millions de numéros, et d'imprimer uniquement le top 10 en Python?
  • Il a également été en vedette dans le stackoverflow newsletter. Que j'ai pour elle, et c'est comment il a obtenu ma upvote.
  • J'ai trouvé que l'utilisation d'un tri rapide est très efficace avec un grand nombre de tableaux
  • Je pense juste parcourant chaque nombre dans la grande liste et supprimer des numéros de haut en devient finalement plus efficace que le tri si m reste constante et n augmente...
  • statistiques.
  • Cela semble être un problème de statistiques d'ordre... trouver le 100e plus petit numéro de dire N dans la liste et ensuite il suffit de parcourir le tableau une fois pour sélectionner tous les numéros moindre que le N. Pour plus de vérifier Erik de conférence 6 (MIT analyse d'algorithmes ) .
  • Je pense que nous pouvons tout simplement obtenir en O(n) . Nous pouvons utiliser de tri à bulles pour obtenir les 100 plus grands éléments en utilisant le code suivant
  • Double Possible de Récupération du top 100 des numéros à partir d'une centaine de millions de chiffres

InformationsquelleAutor userx | 2013-10-07