Indice
Prefazione
1
2
xv
Algoritmi e loro implementazione in Java
1.1 Ciclo di sviluppo di codice algoritmico . . . . . . . . . . . . .
1.2 Fase progettuale . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 Analisi dei requisiti . . . . . . . . . . . . . . . . . . .
1.2.2 Valutazione della difficoltà intrinseca del problema . .
1.2.3 Progetto di un algoritmo risolutivo . . . . . . . . . . .
1.2.4 Analisi di correttezza . . . . . . . . . . . . . . . . . .
1.2.5 Analisi delle prestazioni in un modello di costo teorico
1.2.6 Progetto di algoritmi più efficienti . . . . . . . . . . .
1.3 Fase realizzativa . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.1 Implementazione in un linguaggio di programmazione
1.3.2 Collaudo e analisi sperimentale . . . . . . . . . . . .
1.3.3 Metodologie di analisi sperimentale . . . . . . . . . .
1.3.4 Messa a punto e ingegnerizzazione . . . . . . . . . . .
1.4 Ingredienti per l’implementazione in Java . . . . . . . . . . .
1.4.1 Stessa interfaccia, diverse realizzazioni . . . . . . . .
1.4.2 Tipi generici e boxing . . . . . . . . . . . . . . . . .
1.4.3 Test di uguaglianza: il metodo equals . . . . . . . .
1.4.4 Ordinamento naturale: il metodo compareTo . . . .
1.4.5 Gestione degli errori: eccezioni . . . . . . . . . . . .
1.4.6 Iteratori . . . . . . . . . . . . . . . . . . . . . . . . .
1.4.7 Il Java Collections Framework . . . . . . . . . . . . .
1.5 Progetto motore di ricerca . . . . . . . . . . . . . . . . . . .
1.6 Sommario . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
3
4
4
4
5
5
9
10
10
12
15
19
21
21
23
24
25
27
29
30
31
34
36
Strutture dati elementari
2.1 Tipi di dato e interfacce Java . . . . . . . . . .
2.2 Strutture dati e classi Java . . . . . . . . . . . .
2.3 Tecniche per rappresentare collezioni di oggetti
2.3.1 Strutture indicizzate: array . . . . . . .
2.3.2 Strutture collegate: record e puntatori .
2.4 Tipo di dato pila . . . . . . . . . . . . . . . . .
2.5 Tipo di dato coda . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
37
37
38
43
43
47
52
55
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
x
Indice
2.6
2.7
2.8
2.9
3
4
Progetto motore di ricerca: lexicon e indice diretto
Analisi sperimentale . . . . . . . . . . . . . . . .
Sommario . . . . . . . . . . . . . . . . . . . . . .
Esercizi . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
58
63
68
69
Alberi
3.1 Definizioni preliminari sugli alberi . . . .
3.2 Tipo di dato albero . . . . . . . . . . . .
3.3 Tipo di dato albero binario . . . . . . . .
3.4 Rappresentazioni indicizzate . . . . . . .
3.4.1 Vettore padri . . . . . . . . . . .
3.4.2 Vettore posizionale . . . . . . . .
3.5 Rappresentazioni collegate . . . . . . . .
3.5.1 Puntatori ai figli . . . . . . . . .
3.5.2 Lista figli . . . . . . . . . . . . .
3.5.3 Primo figlio-fratello successivo .
3.6 Visite di alberi . . . . . . . . . . . . . . .
3.6.1 Visita in profondità . . . . . . . .
3.6.2 Visita in ampiezza . . . . . . . .
3.7 Progetto motore di ricerca: compressione
3.7.1 I codici di Huffman . . . . . . . .
3.7.2 Gli alberi di Huffman . . . . . . .
3.8 Analisi sperimentale . . . . . . . . . . .
3.9 Sommario . . . . . . . . . . . . . . . . .
3.10 Esercizi . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
71
71
72
75
77
78
81
82
83
86
86
88
89
92
94
94
95
100
102
103
Ordinamento
4.1 Ordinare in tempo quadratico . . . . . . .
4.1.1 Ordinamenti incrementali . . . .
4.1.2 Ordinamento a bolle . . . . . . .
4.2 Mergesort . . . . . . . . . . . . . . . . .
4.3 Heapsort . . . . . . . . . . . . . . . . . .
4.3.1 Struttura dati heap . . . . . . . .
4.3.2 Ordinare in loco mediante heap .
4.4 Quicksort . . . . . . . . . . . . . . . . .
4.5 Ordinare in tempo lineare . . . . . . . . .
4.5.1 Integersort . . . . . . . . . . . .
4.5.2 Radixsort . . . . . . . . . . . . .
4.6 Progetto motore di ricerca: indice inverso
4.7 Analisi sperimentale . . . . . . . . . . .
4.8 Sommario . . . . . . . . . . . . . . . . .
4.9 Esercizi . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
105
106
106
109
110
113
113
117
118
121
122
123
126
132
136
137
Indice
5
6
7
8
Selezione
5.1 Selezione per piccoli valori di k . .
5.1.1 Ricerca del secondo minimo
5.1.2 L’algoritmo Heapselect . . .
5.2 Calcolo randomizzato del mediano .
5.3 Calcolo deterministico del mediano
5.4 Progetto motore di ricerca: ranking .
5.5 Analisi sperimentale . . . . . . . .
5.6 Sommario . . . . . . . . . . . . . .
5.7 Esercizi . . . . . . . . . . . . . . .
xi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
141
141
142
143
144
146
151
157
160
160
Alberi di ricerca
6.1 Alberi binari di ricerca . . . . . . . . . . . . . . . .
6.2 Alberi AVL . . . . . . . . . . . . . . . . . . . . . .
6.2.1 Ribilanciamento tramite rotazioni . . . . . .
6.2.2 Realizzazione di rotazioni semplici e doppie .
6.2.3 Inserimenti e cancellazioni di chiavi . . . . .
6.3 Alberi 2-3 . . . . . . . . . . . . . . . . . . . . . . .
6.4 B-alberi . . . . . . . . . . . . . . . . . . . . . . . .
6.5 Alberi 2-3-4 e alberi rosso-neri . . . . . . . . . . . .
6.6 Analisi sperimentale . . . . . . . . . . . . . . . . .
6.7 Sommario . . . . . . . . . . . . . . . . . . . . . . .
6.8 Esercizi . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
165
167
177
178
181
185
188
193
198
205
212
212
Tabelle hash
7.1 Tabelle ad accesso diretto . . . . . . .
7.2 Tabelle hash . . . . . . . . . . . . . .
7.2.1 Hashing perfetto . . . . . . .
7.2.2 Altre tecniche di hashing . . .
7.3 Liste di collisione . . . . . . . . . . .
7.4 Indirizzamento aperto . . . . . . . . .
7.4.1 Funzioni di scansione . . . . .
7.4.2 Generazione di numeri primi .
7.4.3 Cancellazione di chiavi . . . .
7.4.4 Analisi del costo di scansione
7.5 Analisi sperimentale . . . . . . . . .
7.6 Sommario . . . . . . . . . . . . . . .
7.7 Esercizi . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
217
217
220
221
223
227
231
235
239
240
243
244
251
253
Code con priorità
8.1 d-heap . . . . . . . .
8.2 Heap binomiali . . .
8.3 Analisi sperimentale
8.4 Sommario . . . . . .
8.5 Esercizi . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
255
255
268
279
286
287
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
xii
9
Indice
Union-find
9.1 Approcci elementari al problema union-find . . . . . . .
9.1.1 Algoritmi di tipo QuickFind . . . . . . . . . . .
9.1.2 Algoritmi di tipo QuickUnion . . . . . . . . . .
9.2 Bilanciamento nell’operazione union . . . . . . . . . . .
9.2.1 Bilanciamento per algoritmi di tipo QuickFind .
9.2.2 Bilanciamento per algoritmi di tipo QuickUnion
9.3 Euristiche di compressione nell’operazione find . . . . .
9.4 Analisi sperimentale . . . . . . . . . . . . . . . . . . .
9.5 Sommario . . . . . . . . . . . . . . . . . . . . . . . . .
9.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . .
10 Grafi e visite di grafi
10.1 Definizioni preliminari sui grafi . . .
10.2 Tipo di dato grafo . . . . . . . . . .
10.3 Strutture dati per rappresentare grafi
10.3.1 Lista di archi . . . . . . . .
10.3.2 Liste di adiacenza . . . . . .
10.3.3 Matrice di adiacenza . . . .
10.3.4 Matrice di incidenza . . . .
10.4 Visite di grafi . . . . . . . . . . . .
10.5 Visita in ampiezza . . . . . . . . . .
10.6 Visita in profondità . . . . . . . . .
10.7 Progetto motore di ricerca: crawling
10.8 Analisi sperimentale . . . . . . . .
10.9 Sommario . . . . . . . . . . . . . .
10.10Esercizi . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
289
294
294
296
298
299
301
306
309
315
316
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
319
321
323
327
327
329
336
337
338
344
351
359
364
367
368
11 Minimo albero ricoprente
11.1 Proprietà dei minimi alberi ricoprenti . . . . . . . . .
11.2 Algoritmo di Kruskal . . . . . . . . . . . . . . . . .
11.2.1 Implementazione mediante union-find . . . .
11.3 Algoritmo di Prim . . . . . . . . . . . . . . . . . . .
11.3.1 Implementazione mediante code con priorità
11.4 Progetto motore di ricerca: clustering . . . . . . . .
11.5 Sommario . . . . . . . . . . . . . . . . . . . . . . .
11.6 Esercizi . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
371
372
374
375
379
382
386
391
392
12 Cammini minimi
12.1 Cammini minimi e distanze in un grafo . . . . . . .
12.2 La tecnica del rilassamento . . . . . . . . . . . . . .
12.3 Algoritmo di Bellman, Ford e Moore . . . . . . . . .
12.3.1 Implementazione mediante coda . . . . . . .
12.4 Algoritmo di Dijkstra . . . . . . . . . . . . . . . . .
12.4.1 Implementazione mediante code con priorità
12.5 Algoritmo di Floyd e Warshall . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
395
395
398
399
400
404
407
412
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Indice
12.6
12.7
12.8
12.9
Progetto motore di ricerca: crawling
Analisi sperimentale . . . . . . . .
Sommario . . . . . . . . . . . . . .
Esercizi . . . . . . . . . . . . . . .
Bibliografia
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
414
416
418
419
421