C'est une question d'entrevue:
Compte tenu d'un fichier d'entrée avec quatre milliards de nombres entiers, de fournir un algorithme permettant de générer un nombre entier qui n'est pas contenue dans le fichier. Supposons que vous disposez de 1 Go de mémoire. Suivre jusqu'à ce que vous feriez si vous n'avez que 10 mo de mémoire.
Mon analyse:
La taille du fichier est de 4 * 109 * 4 octets = 16 GiB.
Nous pouvons faire de tri externe, ainsi, nous obtenons pour connaître la gamme des nombres entiers. Ma question est quel est le meilleur moyen de détecter des manque les entiers triés grand nombre entier de jeux?
Ma compréhension(après la lecture de toutes les réponses):
En supposant que nous parlons de nombres entiers de 32 bits. Il y a 2^32 = 4*109 distincts entiers.
Cas 1: nous avons 1 Go = 1 * 109 octets * 8 bits/octet = 8 milliards de bits de la mémoire. Solution: si on utilise un bit qui représente un net entier, c'est assez. nous n'avons pas besoin de trier. Mise en œuvre:
int radix = 8;
byte[] bitfield = new byte[0xffffffff/radix];
void F() throws FileNotFoundException{
Scanner in = new Scanner(new FileReader("a.txt"));
while(in.hasNextInt()){
int n = in.nextInt();
bitfield[n/radix] |= (1 << (n%radix));
}
for(int i = 0; i< bitfield.lenght; i++){
for(int j =0; j<radix; j++){
if( (bitfield[i] & (1<<j)) == 0) System.out.print(i*radix+j);
}
}
}
Cas 2: 10 MO de mémoire = 10 * 106 * 8 bits = 80 millions de bits
Solution: For all possible 16-bit prefixes, there are 2^16 number of
integers = 65536, we need 2^16 * 4 * 8 = 2 million bits. We need build
65536 buckets. For each bucket, we need 4 bytes holding all possibilities because
the worst case is all the 4 billion integers belong to the same bucket.
Step 1: Build the counter of each bucket through the first pass through the file.
Step 2: Scan the buckets, find the first one who has less than 65536 hit.
Step 3: Build new buckets whose high 16-bit prefixes are we found in step2
through second pass of the file
Step 4: Scan the buckets built in step3, find the first bucket which doesnt
have a hit.
The code is very similar to above one.
Conclusion: Nous avons diminution de la mémoire à travers l'augmentation de fichier pass.
Une précision pour ceux qui arrivent en retard: La question posée, ne veut pas dire qu'il y a exactement un nombre entier qui n'est pas contenue dans le fichier -- au moins ce n'est pas la façon dont la plupart des gens l'interprètent. De nombreux commentaires dans le fil de commentaires sont sur que la variation de la tâche, bien que. Malheureusement, le commentaire qui introduit au fil de commentaires a été supprimé par son auteur, alors maintenant, il ressemble à l'orphelin réponses à juste mal compris tout. Il est très déroutant. Désolé.