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