web-dev-qa-db-fra.com

Algorithme pour trier dix millions d'entiers à 7 chiffres à l'ordre croissant avec seulement 1,5 Mo de RAM?

Compte tenu d'un fichier contenant au plus dix millions d'entiers à 7 chiffres sans doublons. Qu'est-ce qu'un moyen efficace d'imprimer ces chiffres dans l'ordre croissant en utilisant seulement 1,5 MB RAM et en lisant les données juste une fois? Et si les doublons étaient autorisés?

J'ai rencontré ci-dessus la question sur Google, mais je ne trouve aucune réponse pertinente. Basé sur Google Research/Réponses et ma compréhension, je crois que cela peut être une approche et une algorithme (considérer la langue comme Java même si cela n'a pas d'importance pour la plupart des points) avec des requêtes spécifiques à chaque point)

  1. En supposant que tout entier est situé 4 octet entier en Java. Je ne pense pas que la longueur (comme 7 chiffres ou 6 chiffres) devrait être importante ici?

  2. Nombre d'entiers pouvant être accueillis sous 1,5 MB RAM = 1,5/4 = 375K (où 4 représente l'entier de 4 octets) qui sort d'une 3,3 millions d'entiers. Cela signifie que .3 millions d'entiers peuvent être triés en une seule fois sur 1,5 MB.

  3. Maintenant, trier d'abord .3 millions d'entiers en mémoire et écrivez-les dans le fichier Temp.

  4. Choisissez un autre lot de 0,3 million et faites de la fusion de cela avec un fichier Temp créé à l'étape 3 et créez un nouveau fichier Temp. Supprimer celui à l'étape 3.

  5. Répétez l'étape 4 jusqu'à ce que le processus soit complet I.E. 10/.3 = 34 fois.

Cet algorithme est-il correct? Si oui, je ne suis pas comment permettre des doublons aura un impact ici?

6
M Sach

Je dirais que vous pourriez utiliser un champ de bit. C'est vous utiliser un bit pour chaque nombre de 0 à 9 999 9999. Ceci est 1,25 Mo de RAM.

Vous lisez le fichier une fois et marquez le bit correspondant lorsqu'un numéro est lu. Ensuite, dans la deuxième passe, vous marchez sur le Bitfield et imprimez l'index à toutes les entrées qui ont le jeu. Cela fonctionne parce que vous savez qu'il n'y a pas de doublons. Le maximum de 10 000 000 n'est qu'une conséquence de cela. L'algorithme fonctionne avec n'importe quel nombre de chiffres.

En ce qui concerne la question de savoir ce qui se passe s'il y a des doublons autorisés, il n'est pas clair pour moi de savoir si on devrait également imprimer les doublons ou simplement les chiffres. Ce dernier cas fonctionnera bien sûr également, le premier non - il doit stocker des informations supplémentaires.

11
Andreas H.

10 millions de nombres à 7 chiffres sans doublons triés sont les suivants: 0, 1, 2, 3, ..., 9 999 999.

J'espère que cela vous donne un indice pour moins de 10 millions d'euros, en utilisant 1,25 MB de mémoire et en cours d'exécution en temps linéaire.

3
gnasher729

Votre algorithme ne peut pas fonctionner, car le fichier Temp devient plus grand à chaque fois, et vous serez bientôt de retour à l'épuisement de la mémoire.

Pensez à une approche où vous divisez le total plage des nombres en "seaux" en conséquence, et attribuez un fichier par godet.
[.____] alors lisez un groupe, attribuez-les à leurs godets et les appendez aux fichiers "seau" respectifs.
[.____] Après une exécution à tous les numéros, vous avez maintenant des fichiers de seau que vous pouvez lire et trier complètement en mémoire (en supposant que vous ayez choisi la taille du godet approprié) et d'imprimer dans le bon ordre. Plus important encore, vous pouvez être sûr qu'un godet ultérieur ne contient pas de numéro, vous auriez besoin d'imprimer déjà.

0
Aganju