Réinitialiser les valeur d'un tableau à 0
Fermé
k-led87
Messages postés
10
Date d'inscription
dimanche 31 mars 2013
Statut
Membre
Dernière intervention
6 octobre 2013
-
31 mars 2013 à 22:22
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 1 avril 2013 à 15:02
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 1 avril 2013 à 15:02
A voir également:
- Réinitialiser les valeur d'un tableau à 0
- Réinitialiser un pc - Guide
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Comment faire un tableau - Guide
- Comment réinitialiser un ordinateur verrouillé - Guide
3 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié par KX le 1/04/2013 à 09:59
Modifié par KX le 1/04/2013 à 09:59
"je cherche une solution pour minimiser la taille de la mémoire utiliser (RAM)"
"la structure ArrayList est la solution du probléme"
Attention !
Une ArrayList est bien plus grosse en mémoire qu'un tableau. En particulier parce qu'on devra remplacer tous les int (4 octets) par des Integer (16 octets), sans oublier le tableau de références qui est à lui seul aussi gros que le tableau d'int !
Comparaison approximative des tailles (en octets)
Tableau d'int : 4*length ; ArrayList d'Integer : 4*capacity+16*size
De plus, la méthode clear ne va pas réinitialisé la valeur des Integer à 0, mais les supprimer de la liste, tu devras donc construire à nouveau autant d'Integer que tu n'en as supprimé. Ce qui va là encore coûter cher en mémoire (16*size) puisque les Integer enlevés de la liste ne seront pas immédiatement supprimés de la mémoire (il faudra attendre que Java n'ai plus de mémoire pour qu'il appelle le garbage collector qui lui libérera la mémoire, mais cette opération est coûteuse en temps)
Si tu veux mettre toutes les valeurs du tableau à zéro tu peux utiliser la méthode Arrays.fill(int[],int). Remarque : sans surprise l'implémentation de cette méthode est une boucle for, parce que tu auras beau tourner le problème dans tous les sens, c'est la méthode la plus rapide et la plus économe en mémoire.
"la structure ArrayList est la solution du probléme"
Attention !
Une ArrayList est bien plus grosse en mémoire qu'un tableau. En particulier parce qu'on devra remplacer tous les int (4 octets) par des Integer (16 octets), sans oublier le tableau de références qui est à lui seul aussi gros que le tableau d'int !
Comparaison approximative des tailles (en octets)
Tableau d'int : 4*length ; ArrayList d'Integer : 4*capacity+16*size
De plus, la méthode clear ne va pas réinitialisé la valeur des Integer à 0, mais les supprimer de la liste, tu devras donc construire à nouveau autant d'Integer que tu n'en as supprimé. Ce qui va là encore coûter cher en mémoire (16*size) puisque les Integer enlevés de la liste ne seront pas immédiatement supprimés de la mémoire (il faudra attendre que Java n'ai plus de mémoire pour qu'il appelle le garbage collector qui lui libérera la mémoire, mais cette opération est coûteuse en temps)
Si tu veux mettre toutes les valeurs du tableau à zéro tu peux utiliser la méthode Arrays.fill(int[],int). Remarque : sans surprise l'implémentation de cette méthode est une boucle for, parce que tu auras beau tourner le problème dans tous les sens, c'est la méthode la plus rapide et la plus économe en mémoire.
Arrays.fill(tab, 0);
totodunet
Messages postés
1377
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
5 mars 2020
199
31 mars 2013 à 23:19
31 mars 2013 à 23:19
tu créer un nouveau tableau de même dimension :
type[] t2 = new type[t1.length];
t1=t2;
Tu alloues alors de la mémoire pour le tableau t2, et tu dis que maintenant l'adresse mémoire de la variable t1 sera la même que t2. En fait le nouveau tableau sera partagé entre t1 et t2. Si tu modifies t1, tu modifies t2. Le problème est que le tableau t1 d'avant est toujours stocké quelque part dans la mémoire. Donc si tu dis que ton tableau est assez grand, le mieux reste de faire une boucle !
type[] t2 = new type[t1.length];
t1=t2;
Tu alloues alors de la mémoire pour le tableau t2, et tu dis que maintenant l'adresse mémoire de la variable t1 sera la même que t2. En fait le nouveau tableau sera partagé entre t1 et t2. Si tu modifies t1, tu modifies t2. Le problème est que le tableau t1 d'avant est toujours stocké quelque part dans la mémoire. Donc si tu dis que ton tableau est assez grand, le mieux reste de faire une boucle !
k-led87
Messages postés
10
Date d'inscription
dimanche 31 mars 2013
Statut
Membre
Dernière intervention
6 octobre 2013
31 mars 2013 à 23:58
31 mars 2013 à 23:58
merci" totodunet" pour votre aide
mais avec votre solution le problème n'est vraiment régler car moi je cherche une solution pour minimiser la taille de la mémoire utiliser (RAM) et l'estimation de temps d'exécution par ce traitement , parce que je suis obligé de le répéter plusieurs fois (plusieurs appelle de la méthode)
Merci
mais avec votre solution le problème n'est vraiment régler car moi je cherche une solution pour minimiser la taille de la mémoire utiliser (RAM) et l'estimation de temps d'exécution par ce traitement , parce que je suis obligé de le répéter plusieurs fois (plusieurs appelle de la méthode)
Merci
totodunet
Messages postés
1377
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
5 mars 2020
199
Modifié par totodunet le 1/04/2013 à 00:18
Modifié par totodunet le 1/04/2013 à 00:18
si ton tableau est un ArrayList, tu peux faire tontableau.clear()
tiens voilà la doc officielle de ce que tu peux faire avec les ArrayList :
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html
tiens voilà la doc officielle de ce que tu peux faire avec les ArrayList :
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html
k-led87
Messages postés
10
Date d'inscription
dimanche 31 mars 2013
Statut
Membre
Dernière intervention
6 octobre 2013
1 avril 2013 à 04:33
1 avril 2013 à 04:33
Merci "totodunet" ,la structure ArrayList est la solution du probléme
totodunet
Messages postés
1377
Date d'inscription
mercredi 18 mars 2009
Statut
Membre
Dernière intervention
5 mars 2020
199
1 avril 2013 à 12:42
1 avril 2013 à 12:42
j'avais pas compris comme ça le "mettre tout à 0". et je ne savais pas non plus pour le clear.
Mais oui à mon avis il faut parcourir tout ton tableau case par case soit en utilisant fills soit manuellement car visiblement c'est la seule façon de le mettre directement à jour dans la mémoire. Il doit certainement exister des algorithmes pour les très gros tableaux mais à ce niveau là je ne sais pas du tout comment ça fonctionne.
Mais oui à mon avis il faut parcourir tout ton tableau case par case soit en utilisant fills soit manuellement car visiblement c'est la seule façon de le mettre directement à jour dans la mémoire. Il doit certainement exister des algorithmes pour les très gros tableaux mais à ce niveau là je ne sais pas du tout comment ça fonctionne.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
1 avril 2013 à 15:02
1 avril 2013 à 15:02
Si vraiment il fallait optimiser un traitement, on utiliserai des méthodes Java avec le mot-clé "native" qui déléguerait le traitement à une bibliothèque compilée dans un autre langage (c'est souvent le C++). Mais dans le cas qui nous intéresse ici ce serait peu intéressant, car il faudra de toute façon faire en C++ une boucle for qui devra parcourir un à un les cases du tableau...
Ici il faudrait surtout regarder ce que veux faire exactement k-led87, pour peut-être améliorer son algorithme, mais en tout cas l'ArrayList est une fausse bonne idée !
Ici il faudrait surtout regarder ce que veux faire exactement k-led87, pour peut-être améliorer son algorithme, mais en tout cas l'ArrayList est une fausse bonne idée !