Le strutture dati elementari
(III parte)
Gianpiero Cabodi
Dip. Automatica e Informatica
Politecnico di Torino
Strutture dati composte
Strutture dati semplici
„ primo livello di astrazione: array, liste
concatenate, stringhe
Strutture dati composte
„ strutture complesse costruite utilizzando le
strutture seplici come componenti:
z
A.A. 2006/2007
es. array di array, array di liste, array di
stringhe
03 Le strutture dati elementari (III parte)
2
Matrice bidimensionale
(versione standard)
Matrice come array con 2 indici.
Esempio: prodotto tra matrici
float a[N][N], b[N][N], c[N][N];
...
for (i=0; i<N; i++)
for (j=0; j<N; j++)
for (k=0, c[i][j]=0.0; k<N; k++)
c[i][j] += a[i][k]*b[k][j];
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
3
L’array bidimensionale è di fatto allocato in
memoria come un array unidimensionale, di
solito ordinato per righe:
Es. int a[M][N], *c=a;
a[i][j] è equivalente a c[N*i+j]
Ma tale corrispondenza non risulta vera nel
caso di ordinamento per colonne !
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
4
Matrice bidimensionale
(allocazione dinamica)
Obiettivo
„ matrice dinamica a di dimensione MxN, con
M e N noti in esecuzione
„ accesso con notazione a[i][j]
Soluzione A
„ int *a=malloc(M*N*sizeof(int));
NON funziona! ordinamento per righe non
garantito.
Meglio calcolo esplicito degli indici: a[i*N+j]
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
5
Soluzione B:
array di puntatori a righe
int **a=malloc2d(M,N);
con
int **malloc2d(int r, int c)
{ int i;
int **t=malloc(r*sizeof(int *));
for (i=0; i<r; i++)
t[i]=malloc(c*sizeof(int));
return t;
}
Garantisce accesso a[i][j]
(j-esima casella dell’i-esima riga)
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
6
Esempio
Dati N punti con coordinate nell’intervallo
0..1, contare i segmenti aventi come estremi
due di questi punti e lunghezza < d
„ tipo point (cfr strutture dati elementari I
parte)
„ lettura da riga di comandi di N (numero di
punti) e d (distanza)
„ generazione casuale di N punti e
memorizzazione in struttura dati.
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
7
Struttura dati concettuale
Quadrato unitario (0..1 x 0..1) diviso in una
griglia di quadratini di lato d
„ Granularità della griglia: tutti i punti a
distanza ≤ d sono nello stesso quadratino o in
quelli immediatamente adiacenti.
„
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
8
d = 0.1
1
0
A.A. 2006/2007
1
03 Le strutture dati elementari (III parte)
9
Dalle coordinate x, y del punto agli indici della
matrice X, Y
„ G = 1/d (es. d = 0.1, G = 9)
„ X = x * G +1
„ Y = y * G +1
„ punto (0.0, 0.0) => matrice(1,1)
„ punto (0.0, 1.0) => matrice(1,10)
„ punto (1.0, 0.0) => matrice(10,1)
„ punto (1.0, 1.0) => matrice(10,10)
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
10
11
10
9
8
7
6
5
4
3
2
1
0
d = 0.1
0≤X ≤ G+2
0≤Y ≤ G+2
0 1 2 3 4 5 6 7 8 9 10 11
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
11
Struttura dati
Griglia come array bidimensionale di liste
concatenate di G+2 x G+2 celle
„ “corona esterna” senza valori significativi
„ elemento dell’array (lista) = quadratino della
griglia
„ lista: punti inclusi in un quadratino
„ array ⇒ accesso diretto al sottoinsieme di
punti all’interno dello stesso quadratino
„ liste ⇒ accessi lineari (ai singoli punti della
lista)
„
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
12
Algoritmo
Generazione casuale delle coordinate di un
nuovo punto
„ inserimento del un nuovo punto in testa alla
lista corrispondente
„ scansione dei punti nel quadratino e in quelli
adiacenti per conteggiare quanti segmenti
hanno lunghezza < d
„ la “corona esterna” serve solo per il
controllo delle celle adiacenti
„
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
13
11
10
9
8
7
6
5
4
3
2
1
0
Data la cella X,Y, le
adiacenti hanno
indici
X-1≤i ≤ X+1
Y-1≤j ≤ Y+1
0 1 2 3 4 5 6 7 8 9 10 11
A.A. 2006/2007
03 Le strutture dati elementari (III parte)
14
Analisi di complessità
„S(n)
„
A.A. 2006/2007
= O(1/d2+N)
T(n) = O(d2N2)
03 Le strutture dati elementari (III parte)
15
Scarica

Le strutture dati elementari (II parte) - FmGroup