I cicli annidati sono spesso (ma non sempre) cattive pratiche, perché sono frequentemente (ma non sempre) eccessivo per ciò che stai cercando di fare. In molti casi, c'è un modo molto più rapido e meno dispendioso per raggiungere l'obiettivo che stai cercando di raggiungere.
Ad esempio, se hai 100 elementi nell'elenco A e 100 elementi nell'elenco B e sai che per ogni elemento nell'elenco A c'è un elemento nell'elenco B che lo abbina (con la definizione di "corrispondenza"). lasciato deliberatamente oscuro qui), e vuoi produrre una lista di coppie, il modo semplice per farlo è come questo:
for each item X in list A:
for each item Y in list B:
if X matches Y then
add (X, Y) to results
break
Con 100 voci in ciascuna lista, questa operazione richiederà in media 100 * 100/2 (5.000)% di operazioni dimatches
. Con più elementi o se la correlazione 1: 1 non è garantita, diventa ancora più costosa.
D'altra parte, c'è un modo molto più veloce per eseguire un'operazione come questa:
sort list A
sort list B (according to the same sort order)
I = 0
J = 0
repeat
X = A[I]
Y = B[J]
if X matches Y then
add (X, Y) to results
increment I
increment J
else if X < Y then
increment I
else increment J
until either index reaches the end of its list
Se lo fai in questo modo, invece del numero di matches
operazioni basate su length(A) * length(B)
, ora si basa su length(A) + length(B)
, il che significa che il tuo codice verrà eseguito molto più velocemente.