Scrvere programm corrett L esempo della rcerca bnara o dcotomca J. Bentley, Programmng Pearls, Addson Welsey. 1 Schema processo produzone funzone teratva Algortmo n pseudo-codce Indvduazone nvarante Codfca cclo n modo da rspettare l nvarante Prova d correttezza Testng 2 1
Il problema B è un vettore d n nter, ordnato n modo crescente, coè tale che B[] <= B[+1], per 0 <n. Se n = 0, l vettore è vuoto. Voglamo sapere se un ntero t è presente n B e, se lo è, qual è la sua poszone. La rsposta al problema è qund un valore p (per poszone) tra 0 e n-1, se l elemento è presente, e -1 altrment. 3 L algortmo Inzalmente l ntervallo d rcerca dell elemento è l ntero vettore (array). L ntervallo d rcerca è rstretto n funzone del confronto tra l elemento cercato e quello medano: se l elemento cercato è pù pccolo d quello confrontato la rcerca s restrnge alla metà snstra del vettore, altrment a quella destra. Il processo s rpete fno a che s trova l elemento, oppure l ntervallo d rcerca dventa vuoto. 4 2
x < B[m] o x = B[m] o x > B[m] B m Se x < B[m] Se x > B[m] m m 5 Volendo mplementare l algortmo con un programma teratvo, convene utlzzare un nvarante per progettare correttamente l cclo. Invarante: devestare(,) come abbrevazone dell affermazone se t è presente nel vettore dovrà essere nell ntervallo,, coè tra gl element B[],,B[]. pseudocodce: 1. nzalzza ntervallo a 0,n-1. 2. loop {nvarante devestare(ntervallo)} 3. f (ntervallo è vuoto) esc dal cclo e resttusc -1 4. calcola l punto medano dell ntervallo n m 5. usa m per restrngere l ntervallo d rcerca 6. se t è trovato esc dal cclo e resttusc la sua poszone. 6 3
Raffnamento Vedamo d mplementare rga per rga lo pseudocodce: 1. nzalzza ntervallo a 0, n-1 Qu decdamo d rappresentare l ntervallo con due ndc e. L nzalzzazone che rspetta l nvarante è 1. = 0, = n-1 qund devestare(0,n-1) è vero all ngresso nel cclo. l prossmo passo è raffnare la terza e la quarta rga: 3. f (ntervallo è vuoto) esc dal cclo e resttusc -1 4. calcola l punto medano dell ntervallo n m Un ntervallo così ndvduato è vuoto se > (quando = c è un elemento) Qund la rga 3 dventa: 3. f (>) return -1; E la quarta: 4. m= (+)/2 7 Raffnamento 1. =0, = n-1 {devestare(,)} loop 3. f (>) return -1; 4. m= (+)/2 5. usa m per restrngere l ntervallo d rcerca 6. se t è trovato esc dal cclo e resttusc la sua poszone. Per raffnare queste ultme due rghe s deve confrontare t con B[m] e compere delle azon nel rspetto dell nvarante: f (B[m] == t) return m; else f (B[m] < t) [mplca devestare(m+1,), qund] =m+1 ; else [qu B[m] > t mplca devestare(,m-1), qund] =m-1; 8 4
Raffnamento: fne nt bnarysearch(nt *v, nt t, unsgned nt n) /* resttusce la poszone d t n un vettore ordnato v se presente, -1 altrment prec v!=null && v[] v[+1], 0 <n.*/ {nt,m,; = 0; = n-1; whle ( <= ) {nvarante :devestare(,)} { m= (+)/2; f ( v[m] < t) = m+1; else f (v[m] == t) return m; else /* v[m] > t*/ = m-1; } return -1;} 9 Testng per la rcerca bnara: scelta de dat a scatola nera B Dalle post condzon rcavamo che abbamo n+1 possbl output: valor tra 0 e n-1 n caso d successo e -1 n caso d nsuccesso. Poché gl element sono ordnat, notamo che l caso d nsuccesso può verfcars n n+1 mod dvers ( perchè? ). Per ogn vettore, dvdamo l nseme de possbl valor cercat n sottonsem equvalent rspetto al test: gl nsem {B[0]},, {B[n-1]}, cascuno de qual corrsponde a una rcerca con successo e gl n+1 ntervall (-,B[0]),(B[0],B[1]),,(B[n-2],B[n-1]), (B[n-1, ) per le rcerche con nsuccesso. 10 5
Testng per la rcerca bnara: scelta dat a scatola trasparente Nessuna, una o due esecuzon del cclo, con le possbl dverse uscte, sono state gà consderate, aggungamo l caso n cu cerchamo un elemento presente nel vettore ma fuor dal range della rcerca. Testng per la rcerca bnara: scelta dat per l organzzazone del test Non ha molta mportanza qual dat contene l vettore. Possamo organzzare l testng nel modo pù semplce possble consderando vettor d lunghezza n (che parte da 0 fno a un valore massmo), e nzalzzando l vettore con multpl d 10. Consdereremo noltre l caso n cu l vettore contene element tutt dvers e quello n cu l vettore contene element tutt ugual 11 Organzzazone del testng 1 #nclude #defne MAXL 100 nt man(vod) {nt n,, x[maxl]; for (n=0;n<maxl;n++) {for (=0;<=n;++) /* nzalzzazone del vettore, notare che x contene n+1 element */ x[] = 10*; /* rcerca sul vettore vuoto */ f (n==0) assert(bnsearch(x,10,n) == -1); else {for (=0;<n;++) /*rcerca su prm n element */ {/*rcerca su tutt present*/ assert( bnsearch(x,10*,n)== ); /* rcerca su prm n ntervall d assenza: (-,0), (0,10),,((n-2)*10,(n-1)*10)*/ assert(bnsearch(x,10*-5,n)==-1); } 12 6
Organzzazone del testng 2 /* rcerca nell'ultmo ntervallo: ((n-1)*10, )*/ assert(bnsearch(x,10*n-5,n)==-1); /*c asscuramo che non localzz un elemento pur presente nel vettore ma al d fuor dell'ambto della rcerca */ assert(bnsearch(x,10*n,n)==-1); } /*chude l'else */ /* faccamo le stesse verfche su element tutt ugual */ for (=0;<n;++) x[] = 10; f (n==0) assert(bnsearch(x,10,n) == -1); else /*rcerca d un presente */ {assert((0 <= bnsearch(x,10,n))&&(bnsearch(x,10,n) < n)); /*next rcerca nell'ntervallo d assenza (-,10)*/ assert(bnsearch(x,5,n)==-1); /*oppure rcerca nell'ntervallo d assenza (10, )*/ assert(bnsearch(x,15,n)==-1); } } /*chude l cclo for */ return 0;} 13 7