Ad un certo punto le slide dicono che l'alg. di ricerca binaria ricorsiva è meno efficiente di quello iterativo, specialmente in termini di spazio.
Qualcuno potrebbe spiegarmi il perchè? Io erroneamente pensavo fosse più veloce la procedura ricorsiva che quella iterativa..
Di seguito ci sono le due versioni.
Iterativa:
- Codice:
public class IntArrayOrdinato {
…
public static int ricercaBinaria(int x) {
int inf = 0;
int sup = numElementi - 1;
if(sup == -1 || x < a[0])
return -1;
if(x > elementi[sup])
return –(numElementi + 1); //oppure – numElementi - 1
//IC(Invar. di ciclo): se x in a, allora x in a[inf…sup]
while(inf <= sup) {
int i = (inf + sup) >>> 1;
if(x < elementi[i])
sup = i - 1;
else if(x > elementi[i])
inf = i + 1;
else return i;
}
return –(inf + 1); //posizione di inserimento
}
…
}
Ricorsiva:
- Codice:
public static int ricBin(int x, int[] a) {
return ricBin(x, a, 0, a.length - 1);
}
static int ricBin(int x, int[] a, int inf, int sup) {
if(inf > sup)
return -1;
else {
int i = (inf + sup) >>> 1;
if(x < a[i])
return ricBin(x, a, inf, i-1);
else if(x > a[i])
return ricBin(x, a, i+1, sup);
else
return i;
}
}
Grazie