[C] Construire un tableau à partir d'un fichier

Construire un tableau à partir d'un fichier [C] - C - Programmation

Marsh Posté le 31-01-2007 à 15:10:41    

Bonjour,
 
j'ai un fichier contenant des entiers (nombre non connu à l'avance), par exemple
0
1
2
...
 
Je voudrais stocker ces entiers dans un tableau dynamique, mais je ne sais pas trop quelle méthode adopter pour remplir le tableau; quel est le mieux (en terme de performances surtout) ?
 
1) Parcourir le fichier une première fois pour connaitre le nombre d' entiers et ainsi faire une unique allocation puis le reparcourir pour remplir le tableau ?
2) Parcourir le fichier une seule fois mais faire autant de realloc qu'il y a d' entiers ?
3) Une méthode "hybride", genre faire un malloc (n...), où n serait un nombre "typique" de entiers, puis adapter le tableau au cas où on aurait plus de n entiers ?
 
Merci d'avance pour vos suggestions :)

Reply

Marsh Posté le 31-01-2007 à 15:10:41   

Reply

Marsh Posté le 31-01-2007 à 22:38:40    

man realloc
 
ou utiliser une bibliothèque genre glib g_array

Reply

Marsh Posté le 31-01-2007 à 23:01:38    

je pencherais pour une méthode "hybride" où tu alloues par paquets. Dans ce genre là, il y différents types de méthodes : celles où tu alloues par paquets de taille fixe (genre 1000 éléments). Sinon, il y a des trucs plus dynamiques, comme par exemple la stratégie d'allocation des vectors du C++ : tu doubles la taille à chaque réallocation.

Message cité 1 fois
Message édité par franceso le 31-01-2007 à 23:01:53

---------------
TriScale innov
Reply

Marsh Posté le 01-02-2007 à 08:32:11    

franceso a écrit :

je pencherais pour une méthode "hybride" où tu alloues par paquets. Dans ce genre là, il y différents types de méthodes : celles où tu alloues par paquets de taille fixe (genre 1000 éléments). Sinon, il y a des trucs plus dynamiques, comme par exemple la stratégie d'allocation des vectors du C++ : tu doubles la taille à chaque réallocation.

Apparemment, il semble qu'il faille multiplier par le nombre d'or : voir http://www.bourguet.org/realloc.pdf

Reply

Marsh Posté le 01-02-2007 à 10:10:54    

:jap: merci, je ne connaissais pas ça. Je vais me pencher un peu là dessus : ça a l'air intéressant.


---------------
TriScale innov
Reply

Marsh Posté le 01-02-2007 à 16:45:22    

Trap D a écrit :

Apparemment, il semble qu'il faille multiplier par le nombre d'or : voir http://www.bourguet.org/realloc.pdf


 
Taz avait déjà dit un truc analogue dans un de ses topics. Il avait privilégié la méthode "taille n" = "taille n - 2 + taille n - 1" ce qui amène évidemment au nombre d'or...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-02-2007 à 17:17:03    

Le tout c'était de multiplier n avec un facteur k de manière à ce que n[i+2] ~ n[i+1] + n[i]. En effet dans le cas d'une réallocation complète et dans si l'allocateur mémoire a des propriétés de type 'best fit', ce facteur de croissance peut permettre de réussir l'allocation i+2 en réutilisant l'espace des deux précédentes allocations i+1 et i. C'est choisi par pas mal d'implémentations mais aussi parce l'accroissement est moins important qu'avec k = 2 tout en restant exponentiel.

 

On cherche donc un k tel que
¤ n[i+1] = k * n[i]
¤ n[i+2] = n[i+1] + n[i]

 

<=> k² * n[i] = k * n[i] + n[i]
<=> k² = k + 1
on cherche k réel strictement positif
<=> k = (1 + sqrt(5)) / 2
i.e. k ~ 1,62

 


Et ne pas oublier qu'on peut faire une approximation en calcul entier en faisant '16 * n / 10' par exemple.


Message édité par Taz le 01-02-2007 à 17:19:55
Reply

Marsh Posté le 05-02-2007 à 09:46:25    

:jap:


---------------
TriScale innov
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed