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

imbrication des boucles

2 réponses
Avatar
glinsat2011
Bonjour,

Voici le code:
while (...)
{
....
for (...)
{
....
while (....)
{
if (....)
{
....
break;
}

}
if (....)
{
......
break;
}
}
}


Il y a beaucoup des boucles 'for' et 'while' qui sont imbriqu=E9es et il
y a aussi de 'break'.

- Est ce que on peut r=E9duire le nombre de ces boucles 'while' et 'for'
et rendre le code plus performant ? ce n'est pas possible de
l'optimiser surtout je m'int=E9resse au temps d'ex=E9cution le moins
possible ?

- Est ce que 'break' corresponde =E0 quelle boucle dans le hi=E9rarchie
dans ce code ?

- On peut fixer 'break' de quelle boucle ?

Merci.

Merci.

2 réponses

Avatar
Bertrand Lenoir-Welter
> - Est ce que on peut réduire le nombre de ces boucles 'while' et 'for'
et rendre le code plus performant ? ce n'est pas possible de
l'optimiser surtout je m'intéresse au temps d'exécution le moins
possible ?



Là, ça dépend de ce que vous voulez faire, et en particulier de ce qu'il
y a dans vos conditions. Si elles sont disjointes, vous ne réduirez pas
grand-chose. Si les if() et les while() ont des conditions identiques ou
sous-jacentes, alors il y a peut-être moyen de réduire. L'optimisation
consiste surtout à ne pas revérifier une condition qui vient déjà d'être
vérifiée et qui ne peut pas avoir changé entre-temps.

Ce n'est pas parce qu'il y a beaucoup de boucles imbriquées que le code
n'est pas optimal.


- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie
dans ce code ?



"break" fait un saut juste après l'accolade fermante du niveau courant.


- On peut fixer 'break' de quelle boucle ?



Eh ?
Avatar
Pierre Maurette
glinsat2011, le 08/11/2009 a écrit :
Bonjour,

Voici le code:
while (...)
{
....
for (...)
{
....
while (....)
{
if (....)
{
....
break;
}

}
if (....)
{
......
break;
}
}
}


Il y a beaucoup des boucles 'for' et 'while' qui sont imbriquées et il
y a aussi de 'break'.



Je ne trouve pas que la structure de boucles soit spécialement
tarabiscotée. Le while extérieur peut parcourir des pages, ou des
fichiers. Le for des lignes dans chacun de ces fichiers. Et le while
intérieur parcourt des caractères dans la ligne.

- Est ce que on peut réduire le nombre de ces boucles 'while' et 'for'
et rendre le code plus performant ? ce n'est pas possible de
l'optimiser surtout je m'intéresse au temps d'exécution le moins
possible ?



On ne peut pas améliorer cet algorithme systématiquement, il est sain.
Peut-être peut-on améliorer le code mais nous ne le connaissons pas.
On peut s'amuser à raisonner. Il faudra commencer à vérifier la
nécessité des break. Si par exemple le second break disparait, on
pourra envisager de fusionner les boucles while extérieure et for. Un
peu comme si au lieu de parcourir un tableau par lignes puis chaque
ligne par colonne, on parcourait le tableau par élément directement. Ça
n'apporte pas nécessairement un gain de performance, d'ailleurs.

- Est ce que 'break' corresponde à quelle boucle dans le hiérarchie
dans ce code ?



[je réponds sur la base du C, mais ça s'applique certainement à tous
les langages qui s'en inspirent, à ceci près qu'il peut exister dans
ces langages d'autres types de boucles]

Le premier break termine la boucle while intérieure en cours.
Attention, une boucle while repartira lors de l'itération suivante de
la boucle for.

Le second break termine la boucle for en cours. Attention, une boucle
for repartira lors de l'itération suivante de la boucle while
extérieure.

Le comportement est:

while (...)
{
....
for (...)
{
....
while (....)
{
if (....)
{
....
goto break1; //break;
}

}
break1: ;
if (....)
{
......
goto break2; //break;
}
}
break2: ;
}


Un break termine l'exécution de la plus "petite" boucle (ou d'un
switch) le contenant. Une boucle ici est exclusivement - en C - un for,
un while ou un do..while.

Un if/break dans le while intérieur ne peut terminer ni la boucle for,
ni la boucle while extérieure. Un if/break dans la boucle for ne peut
terminer le while extérieur. Pour faire ça, il faudrait positionner une
variable, faire le break, tester la variable dans la oucle
immédiatement supérieure pour éventuellement faire un break, et ainsi
de suite. Bref certainement quelque chose de tout à fait illisible. La
solition est alors un ... goto vers un label au nom bien choisi. La
principale précaution d'emploi du goto est de ne *jamais* poster un tel
code dans un forum ;-)

Par exemple si votre "code" était:

while (...)
{
....
terminate = 0;
for (...)
{
....
while (....)
{
if (....)
{
terminate = 1;
break;
}
}
if(terminate)
{
break;
}
}


Vous pourriez faire:

while (...)
{
....
for (...)
{
....
while (....)
{
.....
if (....)
{
goto finfor;
}
.....
}
}
finfor: ;
}



- On peut fixer 'break' de quelle boucle ?



What ?

--
Pierre Maurette