Stampa i tre risultati, ciascuno su una riga, formattati con due cifre decimali, nell’ordine: Euclidea, City-block, Chessboard.
📌 Importante:
Utilizza le funzioni matematiche standard del tuo linguaggio: math.sqrt, abs (o fabs) e max.
L’output deve contenere solo i numeri (uno per riga), senza testi aggiuntivi.
Consulta un simulatore interattivo per questo esercizio nella Figura 1.11 (grafico con trascinamento dei punti e visualizzazione delle tre metriche).
1.17.1.1 🖼️ Perché è importante? – Costo computazionale
In un’immagine 1000×1000 pixel (1 milione di pixel), calcolare la distanza di ogni pixel da un punto di riferimento richiede 1 milione di operazioni. La scelta della metrica influisce sulle prestazioni:
Metrica
Operazioni per pixel
Costo relativo (1M pixel)
Quando utilizzarla
Euclidea (L2)
2 sottrazioni, 2 moltiplicazioni, 1 somma, 1 sqrt
🔴 Più costosa – sqrt è dispendiosa
Distanza “reale” nello spazio continuo
City-block (L1)
2 sottrazioni, 2 abs, 1 somma
🟡 Moderata – senza radice quadrata
Griglie, robotica, immagini binarie
Chessboard (L∞)
2 sottrazioni, 2 abs, 1 max
🟢 Più efficiente
Movimenti di pezzi, morfologia
La funzione sqrt è computazionalmente più costosa rispetto ad operazioni come addizione, sottrazione, moltiplicazione e valore assoluto. Nelle CPU moderne, la differenza può essere piccola (circa 1,5× a 3×), ma nei sistemi embedded o nei cicli di milioni di iterazioni, qualsiasi guadagno conta. Per questo motivo, quando l’obiettivo è solo confrontare le distanze (es.: trovare il punto più vicino), utilizza la distanza euclidea al quadrato.
1.17.1.2 📋 Compito (specifica per VPL)
Input:
Un’unica riga con quattro numeri reali: Ax Ay Bx By
Output:
Tre righe, ciascuna con un numero reale con due cifre decimali (Euclidea, City-block, Chessboard).
1.17.1.3 📌 Esempi
Input
Output
Osservazione
0 0 3 4
5.00 7.00 4.00
Triangolo 3-4-5
0 0 1 1
1.41 2.00 1.00
Diagonale unitaria
Esempio di test di sqrt in Python, con timeit che isola ogni operazione:
import mathimport timeitN =50_000_000def apenas_soma(): a, b =3.0, 4.0return a + bdef soma_e_sqrt(): a, b =3.0, 4.0return math.sqrt(a*a + b*b)t_soma = timeit.timeit(apenas_soma, number=N)t_sqrt = timeit.timeit(soma_e_sqrt, number=N)print(f"Somma semplice : {t_soma:.3f} s")print(f"Somma + sqrt : {t_sqrt:.3f} s")print(f"Rapporto (sqrt/somma) : {t_sqrt/t_soma:.2f}x")
Somma semplice : 2.727 s
Somma + sqrt : 5.113 s
Rapporto (sqrt/somma) : 1.88x
🎮 Simulatore EP01_01: Metriche di Distanza nello Spazio DiscretoEuclidea vs City-block vs Scacchiera
Clicca e trascina i punti A o B nel piano cartesiano o regola le loro coordinate qui sotto per confrontare le tre metriche di distanza in tempo reale.
📐 EUCLIDEA (L2)
5.00
√(Δx² + Δy²)
🧱 CITY-BLOCK (L1)
7.00
|Δx| + |Δy|
🏁 SCACCHIERA (L∞)
4.00
max(|Δx|, |Δy|)
👆 Trascina i punti A (Viola) o B (Arancione) sulla griglia.
Punto A
Punto B
Legenda Geometrica: Linea tratteggiata (Euclidea), Percorso ortogonale a L (City-block) ed Evidenziazione della dimensione massima (Scacchiera).
Euclidea City-block Scacchiera (Max)
Figura 1.11: Simulatore EP01_01: Distanze Euclidea, City-block e Chessboard