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;