Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Inversion d'un tableau

24 réponses
Avatar
Marc
Bonjour,

Je recherche une methode "optimisee" (minimum de memoire et de temps)
d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours d'algoje crois
mais ca fait un petit bout de temps maintenant.

Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5} devienne
{5,4,3,2,1,0}.

A dire vrai je vais effectuer cette operation sur des blocs memoires mais
comme ca revient au meme ....

D'avance merci,

Marc

10 réponses

1 2 3
Avatar
DINH Viêt Hoà

Je recherche une methode "optimisee" (minimum de memoire et de temps)
d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours d'algoje crois
mais ca fait un petit bout de temps maintenant.

Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5} devienne
{5,4,3,2,1,0}.


je crois que c'est une question sur de l'algorithmique et non sur du C.

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant la
taille du tableau.

après, tu peux effectivement faire cela sur place, genre (en langage C
puisqu'on est sur le groupe) :

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème d'orthographe,
c'est un problème de capillarité palmaire" -- ed

Avatar
Marc
je crois que c'est une question sur de l'algorithmique et non sur du C.


il existe un NG d'algorithmique en francais ?

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant la
taille du tableau. Après, tu peux effectivement faire cela sur place,
genre (en langage C

puisqu'on est sur le groupe) :



Et puisque C est mon langage préféré...:D

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.


Si tu veux optimiser, deja tu peux echanger les cases en economisant la
variable temp:

for(i = 0 ; i < n / 2 ; i ++) {

tab[i]=a tab[n - i - 1]=b
tab[i] += tab[n - i - 1]; tab[i] = a+b
tab[n - i - 1]=b
tab[n - i - 1] = tab[i] - tab[n - i - 1]; tab[i] = a+b tab[n -
i - 1]=a
tab[i] -= tab[n - i - 1]; tab[i] = b
tab[n - i - 1]=a
}

Le probleme c'est que je ne suis pas sur que ce qui marche aussi facilement
pour des entiers marche pour des blocs memoire de quelques centaines de
bytes. Ou alors, au lieu de faire une addition j'utilise le AND bit a bit,
mais au niveau du temps d'execution j'ai des doutes ...



"DINH Viêt Hoà" wrote in message
news:

Je recherche une methode "optimisee" (minimum de memoire et de temps)
d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours d'algoje
crois


mais ca fait un petit bout de temps maintenant.

Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5}
devienne


{5,4,3,2,1,0}.


je crois que c'est une question sur de l'algorithmique et non sur du C.

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant la
taille du tableau.

après, tu peux effectivement faire cela sur place, genre (en langage C
puisqu'on est sur le groupe) :

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème d'orthographe,
c'est un problème de capillarité palmaire" -- ed




Avatar
DINH Viêt Hoà

Si tu veux optimiser, deja tu peux echanger les cases en economisant la
variable temp:

for(i = 0 ; i < n / 2 ; i ++) {

tab[i]=a tab[n - i - 1]=b
tab[i] += tab[n - i - 1]; tab[i] = a+b
tab[n - i - 1]=b
tab[n - i - 1] = tab[i] - tab[n - i - 1]; tab[i] = a+b tab[n -
i - 1]=a
tab[i] -= tab[n - i - 1]; tab[i] = b
tab[n - i - 1]=a
}

Le probleme c'est que je ne suis pas sur que ce qui marche aussi facilement
pour des entiers marche pour des blocs memoire de quelques centaines de
bytes. Ou alors, au lieu de faire une addition j'utilise le AND bit a bit,
mais au niveau du temps d'execution j'ai des doutes ...


ça c'est fort ! tu gagnes la taille d'une case du tableau en mémoire et tu
perds beaucoup plus en temps de calcul.

(casséé !)

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème d'orthographe,
c'est un problème de capillarité palmaire" -- ed

Avatar
Marc
LOOOOOOOOOOOOL

(Mon intention n'etait pas de te casser... :D)


"DINH Viêt Hoà" wrote in message
news:

Si tu veux optimiser, deja tu peux echanger les cases en economisant la
variable temp:

for(i = 0 ; i < n / 2 ; i ++) {

tab[i]=a tab[n - i - 1]=b
tab[i] += tab[n - i - 1]; tab[i] = a+b
tab[n - i - 1]=b
tab[n - i - 1] = tab[i] - tab[n - i - 1]; tab[i] = a+b
tab[n -


i - 1]=a
tab[i] -= tab[n - i - 1]; tab[i] = b
tab[n - i - 1]=a
}

Le probleme c'est que je ne suis pas sur que ce qui marche aussi
facilement


pour des entiers marche pour des blocs memoire de quelques centaines de
bytes. Ou alors, au lieu de faire une addition j'utilise le AND bit a
bit,


mais au niveau du temps d'execution j'ai des doutes ...


ça c'est fort ! tu gagnes la taille d'une case du tableau en mémoire et tu
perds beaucoup plus en temps de calcul.

(casséé !)

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème d'orthographe,
c'est un problème de capillarité palmaire" -- ed




Avatar
Paul Bacelar
Tout ça c'est du pipo. L'optimisation pour des choses aussi basiques ne se
fait pas en C mais avec l'optimiseur donc sans info sur l'optimiseur cela ne
sert à rien.

Si c'est une question d'algorithme, utilise un reverse itérateur et tu
n'aura pas à copier ton tableau.
--
Paul Bacelar
Développeur, Consultant, Expert en technologie de développement Microsoft.
Recherchant poste CDI/CDD/FREELANCE pour Janvier 2004.

"Marc" <fun.x@#nospam#caramail.com> a écrit dans le message de
news:3f9fec70$0$2790$
je crois que c'est une question sur de l'algorithmique et non sur du C.


il existe un NG d'algorithmique en francais ?

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant la
taille du tableau. Après, tu peux effectivement faire cela sur place,
genre (en langage C

puisqu'on est sur le groupe) :



Et puisque C est mon langage préféré...:D

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.


Si tu veux optimiser, deja tu peux echanger les cases en economisant la
variable temp:

for(i = 0 ; i < n / 2 ; i ++) {

tab[i]=a tab[n - i - 1]=b
tab[i] += tab[n - i - 1]; tab[i] = a+b
tab[n - i - 1]=b
tab[n - i - 1] = tab[i] - tab[n - i - 1]; tab[i] = a+b tab[n -
i - 1]=a
tab[i] -= tab[n - i - 1]; tab[i] = b
tab[n - i - 1]=a
}

Le probleme c'est que je ne suis pas sur que ce qui marche aussi
facilement

pour des entiers marche pour des blocs memoire de quelques centaines de
bytes. Ou alors, au lieu de faire une addition j'utilise le AND bit a bit,
mais au niveau du temps d'execution j'ai des doutes ...



"DINH Viêt Hoà" wrote in message
news:

Je recherche une methode "optimisee" (minimum de memoire et de temps)
d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours d'algoje
crois


mais ca fait un petit bout de temps maintenant.

Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5}
devienne


{5,4,3,2,1,0}.


je crois que c'est une question sur de l'algorithmique et non sur du C.

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant la
taille du tableau.

après, tu peux effectivement faire cela sur place, genre (en langage C
puisqu'on est sur le groupe) :

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème d'orthographe,
c'est un problème de capillarité palmaire" -- ed








Avatar
Anthony Fleury
je crois que c'est une question sur de l'algorithmique et non sur du
C.


il existe un NG d'algorithmique en francais ?


Oui, fr.comp.algorithmes

Anthony
--
"On est bien sûr de soi quand on est grand, avec notre savoir, notre
moral, tous ces principes auxquels on tient tant.
Mais c'est souvent trop tard que l'on comprend, que le bonheur
était simple comme un jeu d'enfant." -- Sinsemilia


Avatar
Marc
Tout ça c'est du pipo. L'optimisation pour des choses aussi basiques ne se
fait pas en C mais avec l'optimiseur donc sans info sur l'optimiseur cela
ne

sert à rien.


mouais ...
Il ne faut pas oublier que parfois le programme n'est pas destine a tourner
sur des pc ... et que dans certains de ces memes cas la vitesse importe peu
mais la memoire oui.


Si c'est une question d'algorithme, utilise un reverse itérateur et tu
n'aura pas à copier ton tableau.


Je ne comprends pas ce que tu entends par "reverse iterateur".
Sauf qu'il s'agit d'un tableau a deux dimension et que je veux faire
inverser ses lignes

Rappel :
Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5}
devienne {5,4,3,2,1,0}.





thx


--
Paul Bacelar
Développeur, Consultant, Expert en technologie de développement Microsoft.
Recherchant poste CDI/CDD/FREELANCE pour Janvier 2004.

"Marc" <fun.x@#nospam#caramail.com> a écrit dans le message de
news:3f9fec70$0$2790$
je crois que c'est une question sur de l'algorithmique et non sur du
C.




il existe un NG d'algorithmique en francais ?

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant
la



taille du tableau. Après, tu peux effectivement faire cela sur place,
genre (en langage C

puisqu'on est sur le groupe) :



Et puisque C est mon langage préféré...:D

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.


Si tu veux optimiser, deja tu peux echanger les cases en economisant la
variable temp:

for(i = 0 ; i < n / 2 ; i ++) {

tab[i]=a tab[n - i - 1]=b
tab[i] += tab[n - i - 1]; tab[i] = a+b
tab[n - i - 1]=b
tab[n - i - 1] = tab[i] - tab[n - i - 1]; tab[i] = a+b
tab[n -


i - 1]=a
tab[i] -= tab[n - i - 1]; tab[i] = b
tab[n - i - 1]=a
}

Le probleme c'est que je ne suis pas sur que ce qui marche aussi
facilement

pour des entiers marche pour des blocs memoire de quelques centaines de
bytes. Ou alors, au lieu de faire une addition j'utilise le AND bit a
bit,


mais au niveau du temps d'execution j'ai des doutes ...



"DINH Viêt Hoà" wrote in message
news:

Je recherche une methode "optimisee" (minimum de memoire et de
temps)




d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours d'algoje
crois


mais ca fait un petit bout de temps maintenant.

Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5}
devienne


{5,4,3,2,1,0}.


je crois que c'est une question sur de l'algorithmique et non sur du
C.




Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n étant
la



taille du tableau.

après, tu peux effectivement faire cela sur place, genre (en langage C
puisqu'on est sur le groupe) :

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème
d'orthographe,



c'est un problème de capillarité palmaire" -- ed












Avatar
Paul Bacelar
Les optimiseurs, c'est aussi pour la taille de l'exécutable et pour la
memory finger print. Il suffit d'utiliser les bons flags. Donc dans
l'absolu, ton problème est indécidable puisque trop vague (plate-forme
target, priorité entre vitesse taille de code memeory finger print etc).

Je ne comprends pas ce que tu entends par "reverse iterateur".


C'est trivial, au lieu de faire une "inversion de zone mémoire par blocs",
il suffit de mettre en place un mécanisme d'indexation qui faire croire que
ta zone mémoire a été inversé.

montableau[MACRO_D_INVERSION(i)]
--
Paul Bacelar
Développeur, Consultant, Expert en technologie de développement Microsoft.
Recherchant poste CDI/CDD/FREELANCE pour Janvier 2004.

"Marc" <fun.x@#NO-SPAM#caramail.com> a écrit dans le message de
news:3fa00456$0$223$
Tout ça c'est du pipo. L'optimisation pour des choses aussi basiques ne
se


fait pas en C mais avec l'optimiseur donc sans info sur l'optimiseur
cela


ne
sert à rien.


mouais ...
Il ne faut pas oublier que parfois le programme n'est pas destine a
tourner

sur des pc ... et que dans certains de ces memes cas la vitesse importe
peu

mais la memoire oui.


Si c'est une question d'algorithme, utilise un reverse itérateur et tu
n'aura pas à copier ton tableau.


Je ne comprends pas ce que tu entends par "reverse iterateur".
Sauf qu'il s'agit d'un tableau a deux dimension et que je veux faire
inverser ses lignes

Rappel :
Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5}
devienne {5,4,3,2,1,0}.





thx


--
Paul Bacelar
Développeur, Consultant, Expert en technologie de développement
Microsoft.


Recherchant poste CDI/CDD/FREELANCE pour Janvier 2004.

"Marc" <fun.x@#nospam#caramail.com> a écrit dans le message de
news:3f9fec70$0$2790$
je crois que c'est une question sur de l'algorithmique et non sur du
C.




il existe un NG d'algorithmique en francais ?

Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n
étant




la
taille du tableau. Après, tu peux effectivement faire cela sur
place,




genre (en langage C
puisqu'on est sur le groupe) :



Et puisque C est mon langage préféré...:D

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.


Si tu veux optimiser, deja tu peux echanger les cases en economisant
la



variable temp:

for(i = 0 ; i < n / 2 ; i ++) {

tab[i]=a tab[n - i - 1]=b
tab[i] += tab[n - i - 1]; tab[i] = a+b
tab[n - i - 1]=b
tab[n - i - 1] = tab[i] - tab[n - i - 1]; tab[i] = a+b
tab[n -


i - 1]=a
tab[i] -= tab[n - i - 1]; tab[i] = b
tab[n - i - 1]=a
}

Le probleme c'est que je ne suis pas sur que ce qui marche aussi
facilement

pour des entiers marche pour des blocs memoire de quelques centaines
de



bytes. Ou alors, au lieu de faire une addition j'utilise le AND bit a
bit,


mais au niveau du temps d'execution j'ai des doutes ...



"DINH Viêt Hoà" wrote in message
news:

Je recherche une methode "optimisee" (minimum de memoire et de
temps)




d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours
d'algoje





crois
mais ca fait un petit bout de temps maintenant.

Pour simplifier cela revient a ce ke mon tableau = {0,1,2,3,4,5}
devienne


{5,4,3,2,1,0}.


je crois que c'est une question sur de l'algorithmique et non sur du
C.




Enfin bon, je crois qu'il n'y a qu'une seule méthode en O(n), n
étant




la
taille du tableau.

après, tu peux effectivement faire cela sur place, genre (en langage
C




puisqu'on est sur le groupe) :

for(i = 0 ; i < n / 2 ; i ++) {
void * tmp;

tmp = tab[i];
tab[i] = tab[n - i - 1];
tab[n - i - 1] = tmp;
}

après, appeler cela de l'optimisation, je trouve ça un peu gros.

--
DINH V. Hoa,

"écrire 'dsl' au lieu de 'désolé', c'est pas un problème
d'orthographe,



c'est un problème de capillarité palmaire" -- ed
















Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Marc" <fun.x@#nospam#caramail.com> wrote:

Je recherche une methode "optimisee" (minimum de memoire et de temps)
d'inversion d'un tableau. J'avoue j'ai deja vu ca en cours d'algoje crois
mais ca fait un petit bout de temps maintenant.


T'aurais pas plutôt une question sur le langage C?

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Marc" <fun.x@#nospam#caramail.com> wrote:

je crois que c'est une question sur de l'algorithmique et non sur du C.


il existe un NG d'algorithmique en francais ?


news:fr.comp.alrgorithmes

Incroyable non?

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


1 2 3