Strutture informative 1 Strutture Informative • I dati utilizzati ed elaborati da un programma, che possiamo conservare nella memoria di un computer, possono essere di diversi tipi: numerici, alfanumerici, alfabetici, logici e possono essere distinti , a loro volta, in costanti e variabili. Essi dipendono in genere dalla natura del problema da risolvere. • Tali dati, che abbiamo finora considerato soltanto dal punto di vista della loro tipologia, possono essere allocati nella memoria di un computer purché vengano messi prima in relazione tra loro. • I dati si presentano quindi strutturati in modi differenti, per ciascuno dei quali è necessario individuare una rappresentazione interna al calcolatore che risulti conveniente per le elaborazioni da eseguire e per lo scambio di informazioni con l’esterno 2 Esempi I dati elaborati in un programma, in genere, non sono mai dati singoli, ma fanno parte di insiemi di dati che possono essere variamente strutturati. Es.: Tabella delle distanze stradali tra diverse città: BARI FIRENZE BOLOGNA - 681 784 FIRENZE 681 - 106 BOLOGNA 784 106 - BARI L’informazione “distanza tra la città X e la città Y” viene facilmente trovata esaminando la tabella. Questo risulta semplice in quanto i dati sono stati strutturati, cioè legati tra di loro secondo uno schema logico. Un altro esempio ci è fornito dall’elenco telefonico. Qui, il numero di telefono di un abbonato è facilmente reperibile in quanto gli utenti sono elencati in ordine alfabetico per Cognome e Nome. 3 Strutture Informative Nella rappresentazione delle informazioni non è sufficiente considerare l’insieme dei valori, ma anche la loro STRUTTURA, cioè le relazioni logiche che legano tra loro i valori stessi. Un insieme di dati e la struttura che li lega costituiscono una STRUTTURA INFORMATIVA. La parte più piccola e indivisibile della struttura informativa si dice ELEMENTO. 4 Strutture informative • Di conseguenza è opportuno esaminare i principali tipi di aggregati dal punto di vista della struttura logica, cioè le cosiddette strutture astratte di dati, e i sistemi per la loro rappresentazione nella memoria di un calcolatore, cioè le possibili strutture concrete adatte a contenere le strutture astratte. • In altri termini, la formulazione di un problema sarà espressa tenendo conto anche del tipo di rappresentazione dei dati in memoria che si pensa di adottare 5 Tipi di Strutture Informative Con il termine strutture informative, si comprendono, – le strutture astratte, proprie del problema e dipendenti unicamente da questo. Esse studiano ed organizzano le relazioni logiche che intercorrono tra i dati; vengono usate per descrivere le proprietà dell’insieme dei dati indipendentemente da come questi saranno memorizzati (insieme di leggi che definiscono le relazioni esistenti fra i dati di un insieme finito); – le strutture concrete, analizzano il processo dal punto di vista hardware, cioè come i dati vengono allocati nella memoria del PC. Sono le strutture interne che vengono usate per rappresentare in memoria le strutture astratte. 6 Strutture Astratte Definire una STRUTTURA ASTRATTA significa stabilirne il TIPO, precisando: • l’aspetto STATICO, ovvero – quali sono gli elementi di base che la caratterizzano; – quali sono le relazioni possibili tra gli elementi e come si accede ad essi • l'aspetto DINAMICO, ovvero – le operazioni sui dati, cioè se e in quale modo è possibile operare sui dati mediante inserimenti, variazioni e cancellazioni. 7 Tipi Un’altra classificazione prevede la distinzione tra • STRUTTURA STATICA: quando il numero degli elementi che lo compongono rimane costante nel tempo. Ciò significa che, una volta costruita la struttura, essa viene usata solo per operazioni di ricerca o per modificare qualche valore. • STRUTTURA DINAMICA : quando il numero degli elementi può subire variazioni nel tempo (esempio: elenco telefonico, in cui si possono inserire nuovi abbonati, o cancellarne) 8 Accesso L'ACCESSO specifica il modo con cui si “raggiunge” l'informazione all'interno della struttura (attraverso operazioni di lettura e/o scrittura). Può essere: • ACCESSO SEQUENZIALE: quando per raggiungere un elemento è necessario consultare tutti gli elementi che lo precedono; • ACCESSO DIRETTO: quando è possibile raggiungere direttamente l'informazione desiderata, o mediante la sua posizione all'interno della struttura (es.: nei vettori tramite l'indice) o mediante altre informazioni. 9 Operazioni • OPERAZIONI LOCALI: sono quelle che interessano uno solo elemento alla volta (ricerca, modifica, inserimento, cancellazione di un elemento) • OPERAZIONI GLOBALI: sono quelle che interessano tutti gli elementi della struttura (creazione, fusione, scansione, ordinamento) 10 Strutture astratte di dati: array • Si tratta di un insieme finito di elementi in corrispondenza biunivoca con un insieme di n-ple di numeri interi (indici) • Gli indici possono assumere valori compresi in un intervallo determinato: – per n=1, si parla di vettore (array monodimensionale) – per n=2, si parla di matrice (array bidimensionale) • L array è una struttura a lunghezza fissa (struttura statica) in cui l accesso ad un suo elemento avviene attraverso la n-pla di indici e non in modo sequenziale come avviene nelle liste (accesso diretto) • Un vettore si distingue quindi da una lista lineare per il fatto che l accesso all elemento di indice i avviene direttamente attraverso l indice i, mentre l accesso ad un elemento della lista avviene tramite una ricerca sequenziale che esamina tutti gli elementi della lista fino al reperimento dell i-simo elemento voluto 11 Memorizzazione delle strutture astratte: matrici • Si usa tipicamente una struttura sequenziale accodando gli elementi riga dopo riga oppure colonna dopo colonna • Per una matrice avente m righe e n colonne, l indirizzo del generico elemento Aij è: IND (Aij) = IND (A11) + (i-1)*n*l + (j-1)*l dove: IND (A11) è l indirizzo iniziale della struttura sequenziale l è la lunghezza di ciascun elemento, i l’indice di riga e j l’indice di colonna • Se la memorizzazione avviene per colonne, basta sostituire nell equazione m ad n e i a j • Il discorso si può estendere anche a matrici a k dimensioni 12 Memorizzazione delle strutture astratte: matrici • Se la matrice ha grandi dimensioni, ma ha molti zeri (matrice sparsa), può essere opportuno organizzare gli elementi non nulli, insieme con i loro indici, in una TAVOLA. • Un altra possibilità è quella di usare una doppia famiglia di catene circolari: ogni elemento non nullo appartiene a 2 catene, una di riga ed una di colonna; quindi l elemento della catena è formato: – dal dato – dai suoi due indici – da due puntatori agli elementi successivi su riga e colonna 13 Ricerca sequenziale • Gli elementi nella tabella sono allocati senza seguire alcuna regola di ordinamento • L operazione di ricerca si effettua scandendo gli elementi della tabella fino al reperimento della chiave desiderata • È una tecnica scarsamente efficiente in cui il tempo medio di ricerca è pari a N/2, se N è la lunghezza della tavola • Si può migliorare il tempo di accesso concentrando gli elementi in cui si prevede un accesso frequente nelle prime posizioni • Una tavola su cui si opera una ricerca sequenziale può essere memorizzata come struttura sequenziale o a catena 14 Ricerca binaria • La tavola deve essere ordinata secondo le chiavi • La ricerca binaria richiede il confronto fra la chiave cercata e quella dell elemento centrale della tavola • Il risultato del confronto indica se la ricerca ha termine oppure in quale metà della tavola deve continuare • Il procedimento viene iterato • Il tempo massimo di ricerca è log2N • E una tecnica di ricerca veloce, ma è difficile inserire nuovi elementi (riordino delle chiavi) • Una tavola su cui si opera una ricerca binaria deve essere memorizzata come struttura sequenziale con elementi di lunghezza costante, dato che l accesso deve avvenire tramite calcolo dell indirizzo 15 Accesso diretto • È applicabile solo a tavole per cui le chiavi permettano di stabilire una corrispondenza biunivoca con gli indirizzi di memoria corrispondenti agli elementi della tavola • Esiste quindi una funzione di accesso che, a partire dalla chiave dell elemento ricercato, permette di ottenere l indirizzo di memoria • A chiavi diverse corrispondono indirizzi diversi • È difficile prevedere l inserimento di nuovi elementi (le relative chiavi devono ancora permettere l identificazione di indirizzi diversi) • Alta velocità di accesso, ma scarsa applicabilità a causa delle ipotesi restrittive • Tavola memorizzata in una struttura sequenziale 16