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