Ricerca Dicotomica o Binaria

Proprio in questi giorni ho concluso un progetto VBA abbastanza complesso, si trattava dell’analisi di diversi file di Log generati da una linea di verniciatura, nulla di fantascientifico si trattava di macinare dei file di testo ben strutturati quasi dei CSV. Purtroppo ben tre campi, contenuti in ogni riga di Log, sono dei codici alfanumerici di sei caratteri del tipo (FTJO8B) e riguardano l’evento che ha generato la riga di Log, la zona impianto che ha generato l’evento ed infine lo stato dell’impianto prima che si verificasse l’evento. L’elenco dei codici è contenuto in un file di testo, anche questo ben formattato, ogni riga è formata da 78 caratteri e contiene tutte le informazioni inerenti a quel codice, l’unico problema è che il file contiene più di 278 mila righe, per la precisione 278382, più di 21 Mb di file.
I primi sei caratteri di ogni riga corrispondono al codice contenuto nel file di Log, le righe sono ordinate alfabeticamente proprio in relazione a questo codice. La situazione si presta ottimamente per applicare l’algoritmo di ricerca binaria che vado a rispolverare dai miei vecchi appunti scolastici, ma è facile trovare tantissima documentazione anche su Internet, segnalo questa pagina di Wikipedia.

Diag-Ric-Bin

Questo è il diagramma di flusso che avevo realizzato sui banchi di scuola, molto accademico, può essere ottimizzato nel calcolo del valore medio, può essere implementato in cicli DO / LOOP oppure con chiamate ricorsive ma l’algoritmo rimane questo.

La sua efficienza è calcolabile in LOG2 N (logaritmo in base 2 del numero totale di elementi) quindi nel mio caso avrei 18 confronti nella condizione peggiore.

La grande limitazione di questo algoritmo, come è facile intuire, è che la lista di ricerca deve essere ordina sulla base dell’elemento da trovare. Se così non è questo algoritmo è del tutto inutile.

Questo diagramma di flusso prevede che la lista di ricerca sia ordinata in modo ascendente (dal valore più piccolo a quello più grande) ovviamente è possibile utilizzarlo anche con liste ordinate in modo discendente a patto di invertire i confronti.

La funzione in VBA che ho scritto è riportata nel riquadro sotto, accetta in entrata un valore Stringa che rappresenta il codice da trovare e restituisce il numero di riga trovata o un valore negativo (-1) se la corrispondenza non è stata trovata. Un’unica precisazione mCompare è una funzione privata che provvede ad estrarre dal file dei codici la riga M, quindi effettua il confronto del codice estratto con vMatch e restituisce -1 se il valore estratto è minore, 1 se è maggiore e 0 (zero) se è uguale.

I commenti sono chiusi.

Blog su WordPress.com.

Su ↑