Strutture dati e loro organizzazione Gabriella Trucco Introduzione I linguaggi di programmazione di alto livello consentono di far riferimento a posizioni nella memoria principale tramite nomi descrittivi (variabili) anziché indirizzi numerici Dato: un particolare valore che una variabile può assumere Tipo di dato: modello matematico che caratterizza l'insieme di valori che una variabile può assumere, e le operazioni che possono essere eseguite su di essa Tipi di dato primitivi Intero dati numerici costituiti da numeri interi Operazioni: aritmetiche e confronto Reali dati numerici costituiti da numeri non interi Operazioni simili a interi Booleani Vero/falso Operatori dell’algebra booleana, confronto Caratteri Dati alfanumerici Operazioni: concatenazione, confronto Struttura dati Un modo per memorizzare e organizzare i dati e rendere efficiente l’accesso e la modifica dei dati stessi Esempi: array, matrici, grafi, alberi, tabelle hash, heap, liste, code, pile, ... Una struttura dati consiste di: un modo sistematico di organizzare i dati un insieme di operatori che permettono di manipolare gli elementi della struttura Struttura dati Statiche: la dimensione è definita al momento della creazione. Una volta terminato lo spazio allocato, è necessario creare un’altra struttura di dimensione maggiore dello stesso tipo e copiarvi dentro il contenuto della prima Array, record Dinamiche: la dimensione della struttura dati può variare nel tempo senza limite. L’unico limite è la quantità di memoria disponibile nella macchina su cui andrà in esecuzione l’applicazione Liste, code, pile, alberi, grafi Strutture dati Lineari: i dati sono disposti in sequenza e possono essere nominati come primo, secondo, terzo, ... Non lineari: i dati non sono disposti in sequenza Omogenee: i dati sono tutti dello stesso tipo Non omogenee: i dati sono di tipi diverso Esempio: il tipo di dato array rappresenta una struttura dati lineare, omogenea, a dimensione fissa Struttura dati Nozione astratta svincolata dalla concreta rappresentazione della struttura nel modello di calcolo Implementazione: descrive il modo con il quale la struttura è memorizzata e viene gestita dal calcolatore Ogni struttura dati ammette più implementazioni con un costo diverso Spazio di memorizzazione Tempo per l’esecuzione delle operazioni primitive sulla struttura Array In alcuni casi, informazione da elaborare consiste di un’aggregazione di valori anziché un solo valore Utile indicare l’insieme di valori con una sola variabile: variabile di tipo strutturato Array: Insieme di variabili, tutte dello stesso tipo, identificato da un nome unico. Gli elementi dell’array sono disposti in memoria in posizioni consecutive. Definizione di array Specificare: Nome della variabile Tipo di elementi Numero di elementi presenti (cardinalità dell’array ESEMPI Definizione di una variabile array v contenente 20 interi: int v[20]; Definizione di una variabile array w contenente 10 float: float w[10];Estelar) Accesso agli elementi di un array Specificare il nome della variabile La posizione dell’elemento tramite un valore intero (indice) v[0]: primo valore dell’array v[N-1]: N-mo elemento Inizializzazione di un array Operazioni Inizializzazione: operazione di input per ciascuno degli elementi Stampa: fare la stampa di ognuno degli elementi. Quale costrutto usare? Ciclo iterativo Esempio int v[5]={23, 2, 4, 3, 54} for (i=0; i<5; i++) print v[i]; Ricapitolando… Array = blocco di elementi dello stesso tipo struttura dati statica e omogenea, usata in molti linguaggi di programmazione ispirata alla nozione matematica di vettore, (o di matrice, nel caso di array bidimensionali). sorta di casellario: le cui caselle sono dette celle dell'array stesso. Ogni cella come una variabile tradizionale che rappresenta un elemento dell'array; tutte le celle sono variabili di uno stesso tipo preesistente, detto tipo base dell'array. array di interi, array di stringhe, array di caratteri… Ciascuna delle celle dell'array è identificata da un valore di indice. indice numerico con valori che assumono numeri interi contigui che partono da 0 o da 1 cella di indice 0, di indice 1, e, in generale, di indice N, dove N è un intero compreso fra 0 (o 1) e il valore massimo per gli indici dell'array. Array Implementazione di un array A di n elementi di tipo primitivo (int, char, ...): è memorizzato in n celle consecutive a partire da un indirizzo ind A Scorrimento sequenziale tramite un ciclo iterativo in tutti i suoi elementi o a partire da alcuni di essi oltre a poter accedere singolarmente ad una sua generica posizione. il tempo di accesso ad un generico elemento i è uguale al tempo di accesso della cella di indirizzo ind A+ i , quindi è costante int vettore[5]; // definisce "vettore" come array di 10 elementi interi vettore[0] = 3; // assegna il valore "0" alla cella di indice 0 vettore[1] = 2; vettore[2] = 5; vettore[3] = 0; vettore[4] = 3; Array bidimensionali Matrici: necessari due indici per identificare un elemento dell’array Per definire un array bidimensionale, è necessario specificare: il nome della variabile array il tipo degli elementi il numero degli elementi presenti nelle due dimensioni (cardinalità di riga e cardinalità di colonna dell’array) Es: double mat [10][10]; Esempio Array multidimensionali Un indice per ogni dimensione ogni elemento è identificato dalla combinazione di valori di tutti gli indici del vettore Esempio di matrice: immagine bitmap Costituita da una griglia di n × m punti (dot o pixel) colorati n:l numero di righe di punti (pixel rows) m: numero di colonne di punti (pixel columns) Esempio: immagine 32×32 (ingrandita) Qualità immagine bitmap Dipende da: numero di punti nell’immagine (pixel count) numero dei colori: profondità di colore (color depth) Maggiori sono il numero di punti e la profondità di colore, maggiore è la qualità purtroppo aumenta anche la dimensione Occorre tenere sempre conto dell’impiego dell’immagine Esempi Es1: immagine 35×35 in due colori, bianco e nero, ingrandita, di un carattere per lo schermo numero di punti e colori molto basso, ma sufficiente Es2: immagine 1600×1200=1.92 Mpixel, in 224 = 16777216 colori, ridotta Profondità di colore I colori percepiti variano in modo continuo Nelle immagini digitali si utilizzano colori tratti da un insieme finito, rappresentabile con un numero finito di bit. Tale numero è la profondità di colore (color depth), o risoluzione cromatica, dell’immagine. Profondità di colore maggiormente usate: 1 bit: il pixel può essere solo bianco o nero 8 bit: il pixel può avere uno tra 28 = 256 differenti colori. 16 bit: 216 = 65536 (“64k”) colori 18 bit: 262144 (“256k”) colori 24 bit: 224 colori. La profondità è detta True Color. Profondità di colore Record Record (o tipo aggregato) = blocco di dati in cui elementi diversi possono appartenere a tipi diversi Struttura dati che può essere eterogenea o omogenea. Combinazione di elementi che possono essere di diverso tipo, ad esempio un intero, un numero in virgola mobile e un carattere testuale. Gli elementi che lo compongono sono detti anche campi, e sono identificati da un nome. Struct del linguaggio C Struct { char Nome[25]; int Età; }Impiegato;