Title: Nessun titolo diapositiva
1Algoritmi e complessità
2Sommario
- La complessità
- Complessità in tempo e spazio
- Complessità asintotica
- Algoritmi e complessità
- Strutture dati array, liste, alberi, tabelle
hash - Ricerca e ordinamento
- La macchina di Turing e le classi di complessità
- Ai limiti del calcolo i problemi intrinsecamente
difficili
2
3La complessità
3
4La complessità
- Lanalisi di complessità definisce le risorse
teoricamente consumate da un algoritmo - Complessità temporale tempo necessario
allesecuzione del-lalgoritmo - Complessità spaziale memoria necessaria
allesecuzione del-lalgoritmo - Poiché ad ogni algoritmo corrispondono più
implementazioni (più programmi), lo studio della
complessità non definisce esattamente il tempo e
la memoria usata si concentra sulle proprietà
che sono indipendenti dallimplementazione,
for-nendo unidea di quanto sia efficiente un
algoritmo
4
5Che cosa si misura? ? 1
- Complessità temporale
- Si contano le istruzioni eseguite dallalgoritmo
- Poiché le istruzioni potrebbero essere di natura
diversa, si individuano quelle che incidono
principalmente sul tempo di esecuzione - Le operazioni in virgola mobile le più lente da
eseguire per una CPU sono predominanti se il
loro numero è paragonabile al numero delle altre
istruzioni - Le istruzioni di controllo (gli if) e le
istruzioni più frequenti (sono predominanti se
sono in numero molto superiore rispetto alle
altre istruzioni) - Le istruzioni di accesso alla memoria secondaria
e alle periferiche sono decine di migliaia di
volte più lente delle istruzioni svolte nella
memoria principale se unapplicazione ne
richiede molte, queste potrebbero essere
predominanti (ad es., nei database, lanalisi di
complessità è concentrata sugli accessi al disco)
5
6Che cosa si misura? ? 2
- Complessità spaziale
- Si misurano le posizioni di memoria occupate
dai dati necessari allo svolgimento
dellalgoritmo - La complessità spaziale sarà misurata
relativamente alla memoria principale se i dati
dellalgoritmo possono essere allocati in memoria
principale, in base alloccupazione di memoria
secondaria quando le strutture dati
dellalgoritmo sono troppo grandi per poter
risiedere nella memoria centrale
6
7Complessità asintotica
- Lo studio della complessità si concentra su i
casi in cui il problema è grande - non importa se un programma di contabilità
impiega 1 o 100 millisecondi a calcolare il
bilancio - cambia molto se il programma della segreteria
impiega 1 o 10 secondi a trovare i dati di uno
studente nellarchivio - Complessità asintotica
- Definisce le risorse usate da un algoritmo al
crescere della dimensione del problema affrontato - Ad esempio come cambia il tempo di accesso ai
dati quando cresce il numero degli studenti
nellarchivio della segreteria
7
8Complessità temporale asintotica ? 1
- Formalmente, si usa il concetto matematico di
ordine di grandezza - sia n la dimensione del problema, cioè la
dimensione dellinput dellalgoritmo - sia T(n) il tempo impiegato per lesecuzione
dellalgoritmo quando lingresso ha dimensione n - sia f(n) una qualsiasi funzione di n, ad esempio
3, n, n2, n5, 2n - Si dice che la complessità asintotica
dellalgoritmo è dellordine di f(n) e si scrive
O (f(n)) se esiste una costante ? tale che T(n)??
f(n) - Osservazione importante in base alla definizione
data, algoritmi che differiscono solo per una
costante moltiplicativa hanno lo stesso ordine di
complessità - Esempio due algoritmi che richiedono 4n e 7n
operazioni sono entrambi O (n)
8
9Complessità temporale asintotica ? 2
- Informalmente
- Lordine O (f(n)) fornisce una misura della
complessità tempo-rale di ogni programma che
implementa lalgoritmo - Esempio Calcolare la somma degli elementi di un
array - n numero di elementi dellarray
- complessità O (n)
9
10Complessità media e relativa al caso peggiore
- Un algoritmo può richiedere un numero di
operazioni diverse per ingressi di dimensione
uguale - Complessità media complessità valutata su tutti
i possibili ingressi - Complessità nel caso peggiore complessità
dellalgoritmo per lingresso che richiede più
operazioni - Di solito, quando si parla di complessità, ci si
riferisce alla complessità nel caso peggiore
10
11Algoritmi e complessità
11
12Complessità asintotica array e liste
- Array
- n numero degli elementi dellarray
- Ricerca/inserimento/cancellazione di un elemento
- Complessità O (n)
- Liste semplici
- n numero delle posizioni nella lista
- Ricerca/cancellazione di un elemento
- Complessità O (n)
- Inserimento di un elemento allinizio della lista
(in testa) - Complessità O (1)
12
13Complessità asintotica alberi binari di ricerca
? 1
- Albero binario, cioè tale che da ogni nodo si
dipartono al più due archi, che soddisfa le
seguenti proprietà - ogni nodo v contiene un elemento elem(v) cui è
associata una chiave chiave(v) presa da un
dominio totalmente ordinato - le chiavi nel sottoalbero sinistro di v sono
tutte ? chiave(v) - le chiavi nel sottoalbero destro di v sono tutte
? chiave(v)
Albero binario di ricerca
Albero binario non di ricerca
13
14Complessità asintotica alberi binari di ricerca
? 2
- Alberi binari di ricerca
- n numero dei nodi dellalbero
- Inserire, eliminare o ricercare un elemento in un
albero binario bilanciato - Complessità media pari allaltezza dellalbero O
(h) ?O (log2n) - Complessità nel caso peggiore pari a O (n)
(alberi molto sbilan-ciati e profondi)
14
15Alberi binari di ricerca Ricerca
- Si traccia un cammino nellalbero partendo dalla
radice e, su ogni nodo, si usa la proprietà di
ricerca per decidere se proseguire nel
sottoalbero sinistro o destro
15
16Alberi binari di ricerca Inserimento
- A partire dalla radice, confronta la chiave k con
chiave(v) - In caso di coincidenza, lelemento da inserire è
già presente nellalbero (che non deve contenere
duplicati) - Altrimenti, si prosegue ricorsivamente nel
sottoalbero sinistro o destro in base al
risultato del confronto fino a trovare un nodo
foglia o un nodo dotato di un solo figlio
relativamente al quale lelemento con chiave k
possa opportunamente occupare il posto del figlio
mancante
16
17Alberi binari di ricerca Cancellazione ? 1
- Sia u il nodo contenente lelemento da
cancellare - Se u è una foglia, viene direttamente rimosso
- Se u è un nodo dotato di un solo figlio w, il
sottoalbero con radice w va ad occupare il posto
di u
17
18Alberi binari di ricerca Cancellazione ? 2
- Se u ha due figli, deve essere sostituito dal suo
predecessore v (che ha un solo figlio e) che deve
essere fisicamente rimosso
18
19Alberi binari di ricerca Cancellazione ? 3
19
20Complessità asintotica tabelle hash
- Problema
- Memorizzare in maniera opportuna un insieme di
dati ? tipicamente sotto forma di record ? in
modo da poter reperire un qualsiasi elemento
dellinsieme con un numero piccolo di tentativi - Cosa significa piccolo ?
- Indipendente (o quasi) dalla dimensione della
tabella su cui si effettua la ricerca, quindi con
una complessità in tempo pari ad O (1)
20
21Funzioni hash ? 1
- h K ? 0, 1, 2, , m?1
- K insieme dei valori distinti che possono
essere assunti dalle chiavi dei record - m dimensione del vettore in cui si intende
memorizzare la tabella - Ipotesi K sottoinsieme dei numeri naturali
- Possibile funzione di accesso
- h(k) ? k MOD m, k?K
- Valore della funzione sempre compreso fra 0 e m?1
21
22Funzioni hash ? 2
- Se K non è un sottoinsieme dei numeri naturali
- Esempio insieme di stringhe alfanumeriche
- Problema la funzione hash si applica a numeri
- Per utilizzarla in corrispondenza di una chiave
non numerica occorre associare alla chiave un
valore numerico - Necessità di definire funzioni hash generali
- Associazione di un valore numerico ad una chiave
di qualunque tipo - Applicazione della funzione hash a tale valore
- Esempio si utilizza la somma dei codici ASCII
dei caratteri che costituiscono la stringa - Comunque metodo non adatto a reperire
sottoinsiemi di dati con chiave che soddisfi una
data relazione
22
23Collisioni ? 1
- Associazione, da parte di una trasformazione,
della stessa posizione a chiavi distinte - Sinonimi k1? k2, ma h(k1)? h(k2)
- Esempio 10,12,20,23,27,30,31,39,42,44,45,49,53,5
7,60 - h(chiave) ? (chiave MOD 15)
- Posizione 0 ? 30, 45, 60
- Posizione 8 ? 23, 53
- Posizione 12 ? 12, 27, 42, 57
- Ciascuna posizione dellarray può contenere al
più un elemento occorre - Ridurre al massimo le collisioni
- Gestirle quando si verificano
23
24Collisioni ? 2
- Funzioni di hashing perfetto (che evitano i
duplicati) sono difficili da trovare, anche per
tabelle grandi - Esempio paradosso del compleanno
- Dato un gruppo di 23 persone, ci sono più del
50 di probabilità che due di esse siano nate
nello stesso giorno dellanno - In altre parole, se scegliamo una funzione
aleatoria (a valori casuali) che trasforma 23
chiavi in un indirizzo di una tabella di 365
elementi, la probabilità che due chiavi NON
collidano è solo 0.4927 (meno della metà) - Individuare una funzione di accesso che porti ad
un numero ridotto di collisioni è un problema
complesso
24
25Collisioni ? 3
- Tuttavia numero di collisioni ridotto
drasticamente se accettiamo uno spreco del 25 di
memoria - Esempio array di 19 elementi (indicizzati da 0 a
18) - Posizione 0 ? 57
- Posizione 8 ? 27
- Posizione 1 ? 20, 39
- Posizione 10 ? 10
- Posizione 3 ? 60
- Posizione 11 ? 30, 49
- Posizione 4 ? 23, 42
- Posizione 12 ? 12, 31
- Posizione 6 ? 44
- Posizione 15 ? 53
- Posizione 7 ? 45
- Collisioni non eliminate del tutto
h(chiave) ? (chiave MOD 19)
25
26Collisioni ? 4
- Diminuire il fattore di carico ??n/m, con n
numero degli oggetti da inserire ed m dimensione
della tabella, garantisce un minor numero di
collisioni - Lo spazio utilizzato è proporzionale ad m, non al
numero n di elementi può esserci grande spreco
di memoria! - Inoltre per ridurre la probabilità di
collisioni, una buona funzione hash dovrebbe
essere in grado di distribuire in modo uniforme
le chiavi nello spazio degli indici della tabella - Ipotesi la funzione hash gode della proprietà di
uniformità semplice
26
27Collisioni ? 5
- Sia P(k) la probabilità che la chiave k sia
presente nellinsieme delle chiavi da allocare e
sia - la probabilità che la cella i sia occupata
- Una funzione hash h gode della proprietà di
uniformità semplice se
27
28Collisioni ? 6
- Esempio Se U è linsieme dei numeri reali in
0,1 e ogni chiave in U ha la stessa probabilità
di essere scelta, allora si può dimostrare che la
funzione hash - soddisfa la proprietà di uniformità semplice
28
29Gestione delle collisioni
- Uso di liste concatenate destinate alla
memorizzazione degli elementi che, in
inserimento, hanno portato ad una collisione gli
elementi sono contenuti in liste esterne alla
tabella ti punta alla lista degli elementi
tali che h(k)?i - Indirizzamento aperto tutti gli elementi sono
contenuti nella tabella se una cella è occupata,
se ne cerca unaltra libera
29
30Liste concatenate ? 1
- Ricerca di un elemento di chiave k
- Si calcola h(k) se si verifica una collisione
allora si accede alla lista associata alla
posizione h(k) e la si scandisce
30
31Liste concatenate ? 2
- Il costo delloperazione di ricerca ? realizzata
in modo lineare relativamente alle liste di
elementi in collisione ? si mantiene pressoché
indipendente da n (numero degli elementi
contenuti nella tabella) - Inserimento/cancellazione costano ?O (1)
31
32Indirizzamento aperto ? 1
- Supponiamo di voler inserire un elemento con
chiave k e che la sua posizione naturale h(k)
sia già occupata - Lindirizzamento aperto consiste nelloccupare
unaltra cella, anche se potrebbe spettare di
diritto ad una chiave diversa - Si cerca la cella vuota (se cè) scandendo le
celle secondo una sequenza di indici, per esempio
utilizzando una tecnica di scansione lineare - t(k,i) ? (h(k)?i) mod m, per 0?i?m
- Per i?1 la ricerca parte dalla cella indicizzata
e procede a scandire le successive (ad una ad
una) fino alla prima cella libera
32
33Indirizzamento aperto ? 2
- La scansione lineare provoca effetti di
agglomerazione, cioè lunghi gruppi di celle
consecutive occupate, che rallentano la scansione
33
34Indirizzamento aperto ? 3
- Lhashing doppio riduce il problema delle
agglomerazioni e produce funzioni hash che sono
quasi semplicemente uniformi - t(k,i) ? ?h1(k)?i h2(k)? mod m
- per 0?i?m, con h1 e h2 funzioni hash distinte
- Lidea sottesa allhashing doppio è quella di
partire da un valore hash ed esaminare le
posizioni successive saltando di una quantità
pari a multipli di un valore determinato da una
altra funzione hash - In questo modo la prima posizione esaminata è
h1(k) mentre le successive sono distanziate di
h2(k)
34
35Hashing doppio ? 1
- Esempio
- m13
- h1(k)k mod 13
- h2(k)1 (k mod 11)
- Si consideri linserimento della chiave 14 nella
seguente tabella - h1(14) 14 mod 13 1
- h2(14) 1(14 mod 11) 13 4
- t(14,i) (h1(k)i?h2(k)) mod m (1i?4) mod m
35
36Hashing doppio ? 2
- i0 ? 1 posizione esaminata t(14,0) 1
- i1 ? 2 posizione esaminata t(14,1) 14 5
- i2 ? 3 posizione esaminata t(14,2) 14?2 9
36
37Hashing doppio ? 3
- Si deve porre attenzione a far sì che h2(k) sia
primo rispetto alla dimensione della tabella m - ..infatti, se m e h2(k) hanno un massimo comune
divisore d, allora si esaminerebbero solo m/d
elementi della tabella (invece di m) - Esempio m?10 e h2(k)?2, partendo da 0 si ha la
sequenza 0 2 4 6 8 0 2 4 6 8 - Per garantire che h2(k) sia primo rispetto a m si
può - prendere m2p e scegliere h2(k) in modo che
produca sempre un numero dispari - prendere m primo e scegliere h2(k) in modo che
produca sempre un intero positivo minore di m
37
38Complessità asintotica fattoriale
- Sia dato un programma che prende in ingresso i
partecipanti ad una competizione e genera (ad
esempio per stamparle) tutte le possibili
classifiche finali - n numero di partecipanti
- Complessità O (n!)
- Si osservi che n! è un numero molto grande anche
per n relativamente piccoli - 20! ? 2.432.902.008.176.640.000?2.4?1018
38
39Complessità asintotica polinomiale
- Sia dato un programma che ha come ingresso due
array a, b e cerca tutte le coppie (i,j) tali che
ai?bj - n dimensione di a
- m dimensione di b
- Complessità O (n?m)
void search(int a, int b, int alength, int
blength) for(i?0i?alengthi??)
for(j?0j?blengthj??) if(ai??bj)
printf(Trovata corrispondenza
ad?bd?d,i,j,ai)
39
40Algoritmi facili e difficili
- In base alla loro complessità temporale
asintotica, gli algoritmi sono tipicamente divisi
in classi - Algoritmi a complessità costante O (1) o lineare
O (n) - Molto veloci, scalabili
- Algoritmi a complessità polinomiale O (na) per un
qualche valore a - Usabili se lesponente a è piccolo
- Algoritmi a complessità esponenziale O (an) per
un qualche valore a (?1) - Usabili solo per n molto piccoli
40
41Algoritmi a complessità esponenziale
- Fondamentale perché gli algoritmi a complessità
esponen-ziale sono considerati quasi inusabili? - Perché richiedono talmente tante operazioni che
probabilmente anche i calcolatori futuri non
saranno in grado di eseguire in tempi ragionevoli
le loro possibili implementazioni (programmi) per
dati in ingresso ad alta dimensionalità
41
42Esempio
- Si consideri il programma che genera tutte le
classifiche finali di una competizione con n
partecipanti, complessità O (n!) (è
esponenziale, perché n!?nsqrt(n)) - Con 20 concorrenti le classifiche sono 20!
?2.4?1018 - Un computer che generi 1 miliardo di classifiche
al secondo, circa 3?1016 lanno, impiegherebbe
circa 79 anni per generare tutte le classifiche
richieste - Tendenzialmente, i computer diverranno sempre più
veloci e fra dieci anni forse saranno abbastanza
veloci da realizzare in un mese quello per cui
adesso occorrono 79 anni ma - comunque, fra dieci anni per risolvere il
problema con 21 partecipanti occorreranno ancora
21 mesi e per 25 partecipanti circa 531300 anni!!
42
43La ricerca dicotomica ? 1
- Per cercare un elemento in un vettore ordinato
esiste un metodo detto ricerca binaria o
dicotomica - Si confronta il valore val da ricercare con
lelemento centrale del vettore Alength/2 - Se val è minore dellelemento mediano, si ripete
la ricerca sulla metà sinistra del vettore,
altrimenti si ricerca nella metà destra
43
44La ricerca dicotomica ? 2
- Esempio ricerca del numero 23
Si confronta 23 con 13
Ci si concentra sulla metà sinistra (da ind. 8 a
ind. 10) si confronta 23 con 20
Ci si concentra sulla metà destra (da ind. 9 a
ind. 9) trovato!!
0
27
30
34
35
23
20
16
13
9
8
5
4
2
44
45La ricerca dicotomica ? 3
int search(int val, int A, int from, int to)
int center?(from?to)/2 if (from ? to)
return ?1 if (from??to) if (Afrom??val)
return from return ?1 // si esegue solo
se Afrom!?val //si esegue solo se (from?to)
if (val?Acenter) return search(val,A,from,cen
ter?1) if (val?Acenter) return
search(val,A,center?1,to) return center
45
46Complessità della ricerca dicotomica
- La ricerca dicotomica divide il vettore in due ad
ogni passo - dopo p passi la dimensione del vettore è n/2p
- nel caso peggiore, la ricerca si ferma quando
n/2p è 1, cioè quando p?log2n - Quindi la ricerca dicotomica è O (log2n)
46
47Mergesort ? 1
- Il Mergesort è un algoritmo basato sul paradigma
del divide et impera - Una strategia divide et impera consiste nel
suddividere un problema in sottoproblemi, nel
risolvere i sottoproblemi, e nel ricomporre le
soluzioni parziali per ottenere la soluzione del
problema originale - Il Mergesort è composto da due fasi
- una fase di divisione del vettore da ordinare in
sottovettori - una fase di ricomposizione dei risultati (merge)
47
48Mergesort ? 2
- Idea Dato un vettore da ordinare, lo si divide
in due sottovettori di ugual dimensione, si
ordinano i sottovettori e poi si fondono insieme
48
49Mergesort la divisione ricorsiva
- Come si ordinano i due sottovettori ?
- Applicando ricorsivamente la divisione fino a
quando il vettore contiene un solo elemento in
tal caso lordinamento è banale
49
50Mergesort la fusione ricorsiva ? 1
- I sottovettori ordinati verranno poi
ricorsivamente fusi
50
51Mergesort la fusione ricorsiva ? 2
- La fusione viene realizzata utilizzando due
indici che scorrono i due sottovettori da
fondere - Ad ogni passo si confrontano i due elementi
indicati dagli indici i e j, Ai, Aj - Si copia lelemento minore in un vettore
dappoggio e si incrementa lindice
corrispondente - Si torna al passo 1. fino a quando i due vettori
non sono stati completamente visitati
1 2 6 8
1
3
2
4
5
6
7
8
3 4 5 7
51
52Complessità del Mergesort
- Il Mergesort ha complessità O (n?log2n) sia nel
caso medio che nel caso pessimo - Mergesort è un algoritmo ottimo!
- La sua complessità asintotica è la migliore
possibile - Comunque
- esistono algoritmi che per alcuni ingressi fanno
meglio di n?log2n (ad es., Bubblesort su vettori
ordinati) - esistono altri algoritmi con complessità n?log2n
anche nel caso pessimo ? Heapsort
52
53Quicksort ? 1
- Quicksort, come Mergesort, è un algoritmo divide
et impera - Idea
- Si divide il vettore A in due sottovettori, che
contengono rispettivamente tutti gli elementi
minori e maggiori di (per esempio) A0, cioè il
primo elemento del vettore ? detto perno - Si ripete ricorsivamente la divisione
53
54Quicksort ? 2
54
55Quicksort loperazione perno ? 1
- Come si divide il vettore?
- Si usano due indici i, j che scorrono il vettore
da sinistra e da destra, rispettivamente - Lindice i scorre fino a quando Ai?A1
- Lindice j scorre fino a quando Aj?A1
- Si effettua lo scambio fra Ai e Aj e quindi
si procede come sopra
55
56Quicksort loperazione perno ? 2
- Alla fine si scambia il perno con lelemento in
posizione j
Si scambiano gli elementi
i
j
Si scambia Aj con il perno
j
56
57Implementazione
void perno(int A, int from, int to) int
i?from?1, j?to while(i??j)
while(Ai?Afrom) i?? while(Aj?Afrom)
j?? if(i?j) scambia(A,i,j)
scambia(A,from,j)
57
58Complessità del Quicksort
- Il Quicksort ha complessità media O (n?log2 n)
- Il caso pessimo si verifica quando il perno
finisce in fondo o in testa al vettore - In tal caso, Quicksort ha complessità pari ad O
(n2)
58
59Mergesort vs Quicksort
- Mergesort ha il vantaggio di avere sempre
complessità pari a O (n?log n) - Quicksort ha il vantaggio di non richiedere un
vettore di appoggio ordina il vettore in loco
(minore complessità spaziale) - In media, Quicksort si comporta bene e, per
questo motivo, in pratica spesso è preferito a
Mergesort
59
60Heap ? 1
- Ospita gli elementi dellinsieme A di cardinalità
n, su cui è definita una relazione dordine
totale ? - Lo heap (mucchio) è un albero binario
- Proprietà 1
- Lalbero è quasi perfettamente bilanciato è
completo fino al livello k?1, cioè contiene il
numero massimo di nodi, 2k?1, mentre al livello k
contiene un numero di nodi (foglie) compreso tra
1 e 2k i nodi a livello massimo sono tutti
addossati a sinistra - Proprietà 2
- Ogni nodo contiene un elemento ? dellelemento
contenuto nel padre
60
61Heap ? 2
- Noto il valore di n, la forma del-lalbero è
fissata dalla Proprietà 1 - Lallocazione degli elementi nei nodi può
variare, nel rispetto della Proprietà 2 - Lelemento massimo dellinsieme è allocato nella
radice - I sottoalberi di ciascun nodo sono ancora heap
- Lo heap può essere allocato in un array
1 2 3 4 5 6 7 8 9 10
63 38 23 12 28 17 22 10 5 18
61
62Heap ? 3
- Con lallocazione lineare
- A1 è lelemento contenuto nella radice dello
heap - Per ogni Ai, gli elementi corrispondenti ai
figli sinistro e destro, se esistono, sono
memorizzati in A2i e A2i?1 - Se 2i ? n e/o 2i?1? n il figlio sinistro e/o
destro di Ai non esiste nellalbero - A2i?Ai e A2i?1?Ai, quando tali elementi
sono definiti
62
63Heapsort ? 1
- Lo heap trova la sua applicazione più elegante
nel metodo di ordinamento noto come Heapsort - Si estrae lelemento massimo dallo heap (quello
nella radice, o in prima posizione nella
rappresentazione lineare) - Si ricostruisce lo heap
- fino a quando non ci sono più elementi nello
heap (ovvero gli elementi del vettore sono
ordinati)
63
64Heapsort ? 2
- Come si ricostruisce lo heap, dopo lestrazione
della radice?
1 2 3 4 5 6 7 8 9 10
63 38 23 12 28 17 22 10 5 18
1 2 3 4 5 6 7 8 9 10
18 38 23 12 28 17 22 10 5 63
Continua
64
65Heapsort ? 3
- Si considera il massimo fra i due figli della
radice e, se maxA2,A3?A1, si effettua lo
scambio
1 2 3 4 5 6 7 8 9 10
18 38 23 12 28 17 22 10 5 63
1 2 3 4 5 6 7 8 9 10
38 18 23 12 28 17 22 10 5 63
Continua
65
66Heapsort ? 4
- Si considera il massimo fra i due figli di A2
e, se maxA4,A5?A2, si effettua lo scambio
1 2 3 4 5 6 7 8 9 10
38 18 23 12 28 17 22 10 5 63
1 2 3 4 5 6 7 8 9 10
38 28 23 12 18 17 22 10 5 63
Continua
66
67Heapsort ? 5
- Si estrae A1 che è lelemento più grande e si
ricomincia il procedimento di ricostruzione
1 2 3 4 5 6 7 8 9 10
38 28 23 12 18 17 22 10 5 63
1 2 3 4 5 6 7 8 9 10
5 28 23 12 18 17 22 10 38 63
67
68Heapsort ? 6
- Poiché ogni estrazione e ricostituzione dello
heap richiede tempo O (log2n'), se n' è il numero
di elementi attualmente contenuti nello heap - Heapsort ha complessità O (n?log2n)
- Lalgoritmo di ordinamento può essere realizzato
facilmente sulla rappresentazione sequenziale
dello heap
68
69Heapsort ? 7
void heapsort(int a, int left, int right)
int k, temp, size?right?left?1, p?a?left?1
/ si costruisce lo heap / for (k?size?2
k??1 k??) heap(p, k, size) / si scambia
lelemento più grande con quello finale e si
ricostruisce lo heap / while (size?1)
temp ? p1 p1 ? psize
psize ? temp heap(p, 1, ??size)
exit(0)
69
70Heapsort ? 8
/ Costruzione top?down di uno heap / define
LESS(A,B)((A)?(B)) void heap(int a, int k, int
size) int j, temp while(2?k??size)
j ? 2?k if (j?size
LESS(aj,aj?1)) j?? if
(!LESS(ak,aj)) break temp ?
ak ak ? aj aj ? temp
k ? j
70
71Ancora sulla complessità
71
72Problemi e algoritmi
- Anche per i problemi si parla di complessità
- Tipicamente non si riesce a definire univocamente
la complessità di un problema, perché... - ...lo stesso problema può essere risolto con
algoritmi diversi che hanno diversa complessità - anche se si riesce a stabilire qual è il miglior
algoritmo per la risoluzione di un dato problema,
tale stima ha comunque un valore non assoluto, ma
limitato nel tempo, in quanto non è dato
prevedere se in futuro potrà esistere un metodo
risolutivo migliore - Per questi motivi, si parla solo di limite
inferiore e superiore alla complessità di un
problema
72
73Complessità di un problema
- In alcuni casi è possibile dimostrare che nessun
algoritmo che risolve un dato problema può/potrà
impiegare meno risorse di un certo limite
inferiore - Esempi banali
- Nessun algoritmo che genera tutte le classifiche
possibili per n concorrenti può farlo in meno di
n! operazioni (il limite inferiore alla
complessità è O (n!)) - Nessun algoritmo può effettuare la somma fra
vettori n?dimensionali in meno di n operazioni
(il limite inferiore alla complessità è O (n)) - Esempio non banale
- Nessun algoritmo può ordinare un vettore di n
elementi in meno di n?log2n operazioni, nel caso
peggiore
73
74Algoritmi ottimi
- Un algoritmo si dice ottimo, quando ha
complessità pari al limite inferiore - Esempi
- Mergesort e Heapsort sono ottimi
- Si consideri il problema di sommare gli elementi
di un vettore un algoritmo che scorre tutti gli
elementi e li somma uno ad uno richiede O (n)
operazioni tale algoritmo è ottimo perché la sua
complessità corrisponde con quella minima - Si consideri il problema di inserire un elemento
in un albero binario di ricerca, bilanciato, che
contiene n elementi - Abbiamo visto una soluzione algoritmica che
impone O (log2n) operazioni ? log2n è un limite
superiore per tale problema - Si può dimostrare che tale complessità
corrisponde con il limite inferiore e che
lalgoritmo proposto è ottimo
74
75Algoritmi e computer
- Dubbi
- La complessità è indipendente dal computer su cui
gira il programma? - Ad esempio, se si inventasse un calcolatore in
grado di generare contemporaneamente tutte le
classifiche di n concorrenti, allora quel
problema non avrebbe più complessità n! - Oppure potrebbe esistere in futuro un computer
in grado di ordinare un vettore di qualsiasi
lunghezza per mezzo di una sola istruzione - Nessuno conosce la risposta ma, fino ad ora,
nessuno è riuscito a progettare un computer con
queste capacità tutti i calcolatori conosciuti
sono equivalenti, in termini di capacità di
calcolo, ad un computer semplicissimo ? la
macchina di Turing
75
76La macchina di Turing ? 1
- Alan Turing (1912?1954) è considerato uno dei
padri dellinformatica - Nel 1936 propose lidea di una macchina
immaginaria che fosse capace di eseguire ogni
tipo di calcolo su numeri e simboli
(nellarticolo On computable numbers with an
application to the Entscheidungsproblem) - Il problema della decisione era stato proposto da
David Hilbert nel suo programma di fondazione
formalista della matematica - La macchina di Turing è una macchina formale,
cioè un sistema formale che può descriversi come
un meccanismo ideale, ma in linea di principio
realizzabile concretamente
76
77La macchina di Turing ? 2
- È una macchina a stati, può cioè trovarsi in
stati ben determinati, opera su stringhe in base
a regole precise e costituisce un modello di
calcolo - È retta da regole molto semplici, ovvero la sua
modalità operativa può essere descritta mediante
meccanismi elementari - Si presume abbia il massimo potere
computazionale e si dimostra che è equivalente,
ovvero in grado di effettuare le stesse
elaborazioni, ai modelli di calcolo di più ampia
portata (formali e implementati)
77
78La macchina di Turing ? 3
- Per le sue caratteristiche, la macchina di Turing
è un efficace strumento teorico che viene
largamente usato nella teoria della calcolabilità
e nello studio della complessità degli algoritmi - Inoltre, per definire in modo formalmente preciso
la nozione di algoritmo, oggi si sceglie
preferenzialmente di ricondurlo al concetto di
elaborazione effettuabile da una macchina di
Turing - Esistono varie versioni (computazionalmente
equivalenti) della macchina di Turing, quella più
simile ai nostri calcolatori è quella cosiddetta
a registri (o counter machine, Minsky?Lambek,
1961)
78
79La macchina di Turing a registri
- È costituita da un insieme di registri di lavoro
R1, R2, R3, e di registri di ingresso I1, I2,
I3, - Ogni registro contiene un intero non negativo
- I programmi sono costituiti da tre semplici tipi
di istruzioni
- incremento Ri ??
- Il registro i viene incrementato di 1
- decremento Ri ??
- Il registro i viene decrementato di 1 se il
registro ha già valore 0, listruzione non ha
effetto - salto condizionato IF Ri GOTO L1
- Se il registro i contiene un valore mag-giore di
0, si salta allistruzione L1
IF I1 GOTO ciclo I3?? IF I3 GOTO
fine ciclo I2?? I1?? IF I1 GOTO
ciclo fine
Programma che somma i contenuti di I1 e I2 in I2
79
80La tesi di Church?Turing
- La tesi di Church?Turing afferma che
- Ogni problema intuitivamente calcolabile
(risolubile) da un qualsiasi elaboratore è
calcolabile da una macchina di Turing, purché
dotata di memoria (e tempo di elaborazione)
sufficiente - Nessuno è mai riuscito a confutare la tesi di
Church?Turing - La maggior parte dei ricercatori ritiene che sia
vera
80
81Il problema della terminazione
- Supponiamo che esista un programma halt in grado
di risolvere il problema della terminazione - halt(P,I) restituisce
- true se P con ingresso I termina
- false se P con ingresso I non termina
- Consideriamo il programma Q
- Cosa succede se si applica Q a Q ?
- Q(Q) termina o no ?
- Se Q(Q) termina allora halt(Q,Q) dovrebbe essere
vero ma allora Q(Q) non dovrebbe terminare - Se Q(Q) non termina allora halt(Q,Q) dovrebbe
essere falso ma allora Q(Q) dovrebbe terminare - Quindi il programma halt non esiste!!
void Q(Program P) while (halt(P,P))
81
82Problemi impossibili
- Esistono problemi molto difficili problemi non
calcolabili con una macchina di Turing e ? se la
tesi di Church?Turing è vera ? con nessun
calcolatore!! - Esempi
- Problema della terminazione
- Dato un programma e un suo ingresso, dire se il
programma terminerà (o entrerà in un ciclo
indefinito) - Problema di Post
- Dato un programma e due stati (uno stato è
definito da un certo valore delle variabili),
dire se a partire dal primo stato si potrà
raggiungere il secondo
82
83La macchina di Turing non deterministica ? 1
- Nella macchina non deterministica, i programmi
includono anche altre istruzioni - scelta casuale FORK
- prende in ingresso un insieme di istruzioni e ne
esegue una a caso - istruzione di accettazione ACCEPT
- quando viene eseguita, il programma termina
correttamente - Un problema è risolubile se esiste un programma e
una scelta casuale per cui il programma termina
con ACCEPT e fornisce la risposta desiderata
83
84La macchina di Turing non deterministica ? 2
- Esempio Programma che assegna a caso valori in
0, 1 a R1 e R2 e termina solo se R1?R2?1 -
R4?? FORK R1??, R1?? FORK
R2??, R2?? IF R1 GOTO cont IF R4 GOTO
no cont IF R2 GOTO ok IF R4 GOTO no ok
ACCEPT no
84
85La macchina di Turing non deterministica ? 3
- La macchina non deterministica non calcola più
di quella deterministica - Si può dimostrare che tutto ciò che è calcolabile
sulla macchina di Turing non deterministica è
calcolabile anche sulla macchina deterministica - La macchina non deterministica è però più
efficiente di quella deterministica - Il non determinismo può essere pensato infatti
come una forma di parallelismo - FORK è unistruzione che genera più programmi
paralleli - Il parallelismo permette di risolvere i problemi
velocemente ad esempio, si può cercare un
elemento in un vettore guardando
contemporaneamente a tutti i suoi elementi
85
86Problemi P ed NP
- I problemi decisionali richiedono solo una
risposta binaria (sì/no), correlata in genere
allesistenza di una soluzione (es., problema
della terminazione) - Nella teoria della complessità, i problemi
decisionali si dividono in due classi - P ? problemi risolubili in tempo polinomiale
sulla macchina di Turing deterministica - NP ? problemi risolubili in tempo polinomiale
sulla macchina di Turing non deterministica - Includono sia i problemi facili, sia anche la
quasi totalità dei problemi che si incontrano
nelle situazioni pratiche - Ovviamente vale P?NP, ma non è noto se P?NP
86
87Problemi NP-completi ? 1
- Problema decisionale della soddisfattibilità
Data una forma normale congiuntiva F(x1,x2,,xn)
stabilire se esiste un assegnamento di valori
delle variabili booleane x1,x2,,xn che soddisfi
F - Qualunque problema della classe NP si riduce, in
tempo polinomiale, al problema della
soddisfattibilità PS - PS è il più difficile fra i problemi di NP
87
88Problemi NP-completi ? 2
- Un problema P è detto NP?completo se P?NP e PS si
riduce a P - I problemi NP?completi sono tutti equivalenti fra
loro - Sarebbe sufficiente trovare un algoritmo
polinomiale per uno solo di essi ed avremmo
trovato un algoritmo polinomiale per risolvere
tutti i problemi - Inoltre, tutti i problemi in NP sarebbero
risolubili in tempo polinomiale sulla macchina di
Turing deterministica, cioè avremmo dimostrato
che NP?P!
88
89Problemi NP-completi esempi
- Problema decisionale del commesso viaggiatore
- Dato un insieme di n città con le relative
distanze, trovare, se esiste, un cammino di
lunghezza ?k che, partendo da una città, le
visiti tutte tornando in quella di partenza - Un problema NP?arduo (non decisionale)
- Programmazione lineare intera
- Data una matrice A e due vettori b, c, calcolare
un vettore di interi x che soddisfi Ax?b e
minimizzi f(x)?cx - Problemi di programmazione lineare
- definire lorario dei treni e degli autobus
- definire lorario delle lezioni
89
90P?NP e tesi di Church?Turing
- Attualmente si pensa che NP?P
- ma nessuno è ancora riuscito a dimostrarlo
- Si pensa anche che la tesi di Church?Turing sia
vera - ovviamente questo non si può dimostrare ma è,
eventualmente, solo confutabile - Talvolta, problemi con complessità proibitiva
sono utili - Ad esempio, gli algoritmi crittografici sono
basati sul fatto che decrittare una chiave è
molto complesso e richiederebbe un tempo troppo
lungo - Se la tesi di Church?Turing non fosse vera o se
P?NP, tali metodi non sarebbero più efficaci
90
91Ai limiti del calcolo I problemi intrinsecamente
difficili
91
92Il problema del commesso viaggiatore
- Il problema del commesso viaggiatore è uno dei
più celebri tra i problemi di soddisfacimento di
vincoli non calcolabili - Una sua versione piuttosto diffusa è la seguente
- È possibile stimare il percorso più breve per un
commesso viaggiatore che deve fare visita ai suoi
clienti in tutte le città indicate sulla mappa? - A prima vista, sembra facile, ma allaumen-tare
del numero delle città, il problema diventa
esponenzialmente più difficile, mettendo nei guai
anche i più potenti computer
92
93I problemi difficili ? 1
- Ma dove sta scritto che tutti i problemi si
devono risolvere facilmente e che la loro
soluzione deve essere calcolabile in modo
efficiente? - Eppure lascia perplessi il fatto che alcuni
calcoli siano tanto più complessi di altri - Lesempio classico è quello della moltiplicazione
e della scomposizione in fattori - Se vengono dati due numeri primi grandi
moltiplicarli è semplice - ma cercare, una volta dato il prodotto, di
ritrovare i due fattori sconosciuti è un problema
molto difficile - fino al punto che una delle tecniche
crittografiche più diffuse (RSA) si basa sulla
difficoltà di risoluzione di questo problema
inverso
93
94I problemi difficili ? 2
- E dunque, dove sono i problemi difficili?
- In matematica, in informatica, in fisica
- Il tema comune che lega strettamente queste tre
discipline è infatti la presenza di problemi con
transizioni improvvise da un tipo di
comportamento ad un altro
94
95In matematica ? 1
- Il filo matematico comincia negli anni 60 con lo
studio dei grafi aleatori, iniziato da Paul Erdós
e Alfred Rényi - Un grafo è una struttura matematica astratta un
insieme di vertici e archi, disegnato in genere
come uno schema di punti (i vertici) e linee che
li uniscono (gli archi) - Per disegnare un grafo aleatorio si inizia
distribuendo n vertici sul foglio, sce-gliendo
casualmente, per ogni coppia e con probabilità p,
se tracciare o no un arco che connetta i due
vertici
Costruzione di un grafo aleatorio
95
96In matematica ? 2
- Quando p è vicino a 0, gli spigoli sono pochi e
il grafo è composto di molti piccoli pezzi, o
componenti connesse, separate le une dalle altre - Al crescere di p, il grafo comincia a essere
dominato da una singola componente connessa
gigante, che comprende la maggior parte dei
vertici - Lesistenza di questa componente gigante non è
certo una sorpresa, ma il modo in cui essa si
sviluppa non è ovvio - La componente non evolve gradualmente al crescere
di p, bensì emerge allimprovviso quando viene
superata una certa soglia - La soglia è definita in termini di un parametro
che chiameremo ? il rapporto fra numero dei lati
e numero dei vertici - La componente gigante nasce quando ? è circa 1/2
96
97In informatica ? 1
- In campo informatico un simile fenomeno di soglia
attirò molta attenzione nei primi anni 90 - In questo caso la soglia determina la probabilità
che certi problemi computazionali abbiano
soluzione - Uno di questi problemi, che deriva dalla teoria
dei grafi, è il problema della k?colorazione, che
richiede di dipingere ogni vertice di un grafo
con uno di k colori, con la regola che due
vertici adiacenti non possano avere lo stesso
colore - Trovare una colorazione corretta diventa sempre
più difficile al crescere di ?, perché più sono i
lati più sono anche i vincoli imposti su ogni
vertice
Problema di 3-colorazione
97
98In informatica ? 2
- Di nuovo, la soglia è netta al di sotto di un
certo valore del rapporto ? quasi tutti i grafi
sono k?colorabili, mentre al di sopra di questa
soglia non lo è quasi nessuno - Inoltre, la soglia non solo influisce
sullesistenza di soluzioni, ma anche sulla
difficoltà di trovarne lo sforzo computazionale
necessario per decidere se un grafo è
k?colorabile ha un picco significativo vicino al
valore critico di ? - Il problema della colorazione dei grafi è
strettamente correlato al problema della
colorazione delle carte geografiche politiche,
nelle quali regioni adiacenti devono avere colori
distinti - Se i nodi del grafo rappresentano regioni,
collegate da un arco se adiacenti il gioco è
fatto ed il grafo è un RAG, per Region Adjacency
Graph
98
99In fisica
- Anche i fisici sanno qualcosa dei problemi di
soglia li chiamano transizioni di fase - Ma i cambiamenti di stato osservati nei grafi
aleatori sono veramente analoghi ad eventi fisici
come il congelamento dellacqua e la comparsa
della magnetizzazione nel ferro? O la somiglianza
è una semplice coincidenza? - Per qualche tempo largomento è stato
controverso, ma ora è chiaro che i fenomeni di
soglia nei grafi e in altre strutture matematiche
sono autentiche transizioni di fase e, quindi,
gli strumenti e le tecniche della fisica
statistica sono adattissimi a studiarli - Il problema della k?colorazione è in
corrispondenza esatta con un modello di sistema
magnetico nella fisica dello stato solido
99
100Il problema della 3-colorazione ? 1
- La 3colorazione è un problema complesso, ma non
impossibile - La domanda Questo grafo è 3-colorabile? ha
sempre risposta, almeno in linea di principio
visto che a ogni vertice può essere assegnato un
colore qualunque e che ci sono n vertici, ci
devono essere esattamente 3n modi di colorare il
grafo
100
101Il problema della 3-colorazione ? 2
- Per decidere se uno specifico grafo è
3-colorabile, basta prendere in esame, una per
una, tutte le possibilità - Se si trova unassegnazione di colori che
soddisfa il vincolo, cioè in cui nessun arco
congiunge vertici dello stesso colore, allora la
risposta alla domanda è sì - Se si esauriscono tutte le possibilità senza
trovare una colorazione appropriata, si può
essere certi che non esiste - Questo algoritmo è semplice e sicuro, ma anche
inutile, perché enumerare 3n colorazioni è al di
là di ciò che si può fare in pratica per
qualsiasi n maggiore di 15 o 20
101
102Il problema della 3-colorazione ? 3
- Procedure più sofisticate possono garantire una
ricerca esatta ed esaustiva pur riducendo il
numero di operazioni a meno di 1,5n ? è un
miglioramento significativo, ma si tratta sempre
di una funzione esponenziale che innalza il
limite a n?50 - Per grafi grandi, con migliaia di vertici, tutti
i metodi brute force non offrono speranze - Daltro canto, se si potesse in qualche modo
sbirciare la soluzione di un problema di
3-colorazione su molti vertici, se ne potrebbe
controllare la correttezza facendo assai meno
fatica tutto quello che si dovrebbe fare sarebbe
verificare che i vertici alle estremità di
ciascun lato abbiano colori diversi
102
103Il problema della 3-colorazione ? 4
- Il numero di lati in un grafo non può essere
maggiore di n2, che è una funzione polinomiale
anziché esponenziale, e quindi cresce molto più
lentamente - I problemi con risposte che sono difficili da
trovare ma facili da verificare sono
(nondeterministic polynomial) NP e, a meno di un
miracolo, non si avranno mai algoritmi in tempo
polinomiale per risolverli - Avendo appurato le credenziali della
3-colorazione come problema ufficialmente
difficile, possiamo rivelare che la maggior parte
dei problemi di 3-colorazione su grafi aleatori è
in realtà piuttosto semplice
103
104Il problema della 3-colorazione ? 5
- Dato un grafo tipico, si hanno buone probabilità
di trovare rapidamente una 3-colorazione o di
dimostrare che non esiste - Questa curiosa situazione non è veramente
paradossale la classificazione della
3-colorazione come problema NP si basa
sullanalisi del caso peggiore - Esistono infatti molti algoritmi che hanno, nella
maggior parte dei casi, un tempo di elaborazione
rapido, a patto di accettare un occasionale
fallimento
104
105Il problema della 3-colorazione ? 6
- Una strategia diffusa per algoritmi che colorano
grafi è il backtracking (letteralmente tornare
sui propri passi) ed assomiglia al modo in cui
la maggior parte delle persone affronterebbe il
problema se dovesse cercare di colorare il grafo
a mano - si inizia assegnando un colore arbitrario a un
vertice arbitrario - poi si passa ai vertici vicini, assegnando loro
colori che non causino un conflitto - proseguendo così si può arrivare a un vertice per
cui non cè un colore lecito a questo punto si
torna sui propri passi annullando alcune scelte
precedenti, e si riprova
105
106Il problema della 3-colorazione ? 7
- Per mostrare che un grafo non può essere
3-colorato occorre un altro tipo di algoritmo - Lapproccio fondamentale consiste nel cercare un
sottoin-sieme di vertici che, anche se fosse
isolato dal resto del grafo, non potrebbe essere
3-colorato - Per esempio, una cricca costituita da quattro
vertici ognuno dei quali sia collegato con tutti
gli altri ha questa proprietà - Se si trova anche solo una di queste strutture,
la questione è risolta per lintero grafo
106
107Il problema della 3-colorazione ? 8
- Algoritmi come questi sono molto diversi dai
metodi di ricerca esaustiva - La semplice enumerazione di tutte le 3n
colorazioni può essere inammissibilmente lenta,
ma almeno è prevedibile - Ciò non è vero per il backtracking e per altri
algoritmi inesatti o incompleti le loro
prestazioni variano notevolmente a seconda della
natura del grafo
107
108Il problema della 3-colorazione ? 9
- In particolare, questi algoritmi sono sensibili
al valore di ? ? il rapporto tra il numero di
lati e il numero di vertici ? che è di nuovo il
parametro che controlla la transizione tra fasi
colorabili e non colorabili - Molto al di sotto del valore critico di ?, dove
gli spigoli sono radi, cè un numero tale di modi
di colorare il grafo che qualsiasi strategia
ragionevole ha buone probabilità di trovarne uno - Allestremo opposto, molto al di sopra della
soglia, i grafi sono densamente interconnessi, ed
è facile trovare un sottografo che renda
impossibile la 3-colorazione - La regione problematica è situata tra questi
estremi, vicino alla soglia in questa zona
intermedia possono esserci pochissime colorazioni
o nessuna distinguere tra queste due situazioni
può rendere necessario controllare quasi ogni
possibile assegnazione di colori
108
109Dove sono le soluzioni? ? 1
- Il valore critico di ? è circa 2.35
- In altre parole, se un grafo aleatorio con n
vertici ha meno di 2.35n archi, può essere quasi
sicuramente 3-colorato se ne ha di più, una
3-colorazione è improbabile - Inoltre si sa che la transizione tra questi due
regimi è netta è una vera discontinuità, un
salto improvviso anziché un passaggio graduale - Per esprimere più formalmente questa idea si dice
che lampiezza della regione di transizione tende
a zero quando n tende allinfinito
109
110Dove sono le soluzioni? ? 2
- La nettezza della transizione di fase può essere
considerata una notizia incoraggiante - Se gli algoritmi per decidere la colorabilità si
impantanano solo nella regione di transizione, e
se essa è tanto ristretta da essere quasi
trascurabile, allora la probabilità di incontrare
un grafo difficile da classificare è
proporzionalmente piccola - Tuttavia, la nettezza della transizione è
garantita solo per grafi infinitamente grandi se
n è finito, gli angoli della curva di transizione
sono arrotondati - Inoltre, sebbene la fase non colorabile non inizi
fino ad ??2.35, gli esperimenti hanno mostrato
che gli algoritmi cominciano a rallentare un po
prima, a valori di ? attorno a 2.2
110
111Dove sono le soluzioni? ? 3
- Per capire la causa, giova visualizzare tutte le
possibili 3-colorazioni di un grafo distese su
una curva laltezza della curva in ogni punto
rappresenta il numero di conflitti nella
colorazione corrispondente - Così le colorazioni perfette (quelle senza
conflitti) si trovano tutte al livello del mare,
mentre le colorazioni peggiori creano picchi o
altipiani ad alta quota - Naturalmente la topografia di questo paesaggio
dipende dal particolare grafo che stiamo
esaminando
111
112Dove sono le soluzioni? ? 4
- Si consideri come evolve la superficie via via
che ? cresce gradualmente - Per piccoli valori di ? ci sono ampi bacini e
vallate, che rappresentano i molti modi di
colorare perfettamente il grafo - Per grandi valori di ? il paesaggio è alpino, e
anche il punto più basso è molto al di sopra del
livello del mare, denotando una completa assenza
di colorazioni perfette - Il valore di transizione ? 2.35 segna il
momento in cui scompaiono le ultime aree estese
che si trovano al livello del mare
112
113Dove sono le soluzioni? ? 5
- Che cosa avviene nello spazio delle soluzioni
per ??2.2? - Si è scoperto che questo è il momento in cui
unampia distesa di terreno a livello zero si
frammenta in piccoli bacini isolati - Al di sotto di 2.2, quasi tutte le colorazioni
perfette formano ununica gigantesca regione
connessa (fatta di tante soluzioni vicine) - Al di sopra di 2.2, ogni bacino rappresenta un
insieme isolato di soluzioni - Le colorazioni che si trovano in bacini separati
sono sostanzialmente diverse e per trasformarne
una in unaltra si dovrebbe scalare una catena
montuosa formata da colorazioni che presentano un
alto numero di conflitti - È improbabile che gli algoritmi che funzionano
conducendo una ricerca locale riescano a valicare
queste catene montuose, e quindi rimangono
confinati a lungo nel primo bacino in cui capitano