MPSI Option Informatique Année 2001, Deuxième TP Caml Vcent Simonet (http://cristal.ria.fr/~simonet/) Les eux pots les plus proches Lors e cette séance, nous allons nous téresser au problème suivant : étant onné un ensemble e pots u plan, entifier le couple e pots les plus proches au sens e la istance eucliienne. Ce type algorithme voit son utilité ans les transports aériens ou maritimes par exemple. Nous représenterons un pot en Caml par un couple e flottants (x, y) représentant ses cooronnées ans un repère orthonormé. L ensemble es pots consiérés sera quant à lui stocké ans un tableau t. Nous supposerons toujours que tous les couples stockés ans t sont istcts. 1 Une première solution Consiérons eux pots p et p e cooronnées respectives (x, y) et (x, y ). Leur istance eucliienne est onnée par la formule p p = (x x ) 2 + (y y ) 2. Question 1 Écrivez une fonction ist qui calcule la istance eucliienne séparant eux pots. Une méthoe «naïve» permettant e étermer les eux pots les plus proches ans un tableau t consiste à consiérer successivement tous les couples e pots possibles, ce qui peut se faire facilement à l aie e eux boucles for. Question 2 Écrivez une fonction plus proches qui pr pour argument un tableau e pots t et retourne un couple e pots ((x, y), (x, y )) situés à une istance mimale l un e l autre. Vous pourrez Commencer par créer une référence (itialisée par exemple avec ist t.(0) t.(1)) qui contira tout au long u éroulement e l algorithme la plus petite istance trouvée ; asi que eux références s i et s j contenant les ices es pots qui permettent attere cette istance. Utiliser eux boucles imbriquées pour consiérer tous les couples e pots communs. Mettre à jour les trois références à chaque fois qu un couple (i, j) tel que t.(i) t.(j) <! est trouvé. Question 3 Évaluez le coût un appel à la fonction plus proches en fonction e la taille u tableau t. Nous allons matenant nous téresser à la mise au pot un algorithme permettant e résoure ce même problème en temps O(n log n). Cet algorithme nécessite e isposer e eux copies u tableau t, l une triée par abscisses croissantes et l autre par oronnées croissantes. Nous allons onc écrire ans un premier temps quelques fonctions permettant e trier un tableau. 2 Tri un tableau Soit t = [ ; x 1 ;... ; x n 1 ] un tableau. Trier t consiste à permuter le contenu es cases u tableau t e façon à obtenir le tableau [ x σ(0) ; x σ(1) ;... ; x σ(n 1) ] avec x σ(0) x σ(1)... x σ(n 1). L algorithme e tri par sélection aopte le prcipe suivant : pour i variant e 0 à n 2, chercher l ice k i e la case e la partie u tableau située à roite e la case i contenant le plus petit élément ; puis permuter le contenu es cases k et i. c Vcent Simonet 2001 Ce ocument est istribué selon les termes e la GNU Free Documentation License.
Par exemple, pour trier le tableau [ 4; 3; 1; 2 ], on passe par les étapes suivantes : [ 4; 3; 1; 2 ] i = 0 k = 2 [ 1; 3; 4; 2 ] i = 1 k = 3 [ 1; 2; 4; 3 ] i = 2 k = 3 [ 1; 2; 3; 4 ] Question 4 Écrivez une fonction swap qui pr pour argument un tableau t, eux entiers a et b et permute le contenu es cases ices a et b. Votre fonction ne créera pas un nouveau tableau, elle se contentera e moifier sur place le tableau t. Elle sera onc e type a vect t t unit. Question 5 Écrivez une fonction sel qui pr pour argument un tableau t ; eux entiers a et b et retourne l ice e la case u sous-tableau t.(a)... t.(b) qui contient le plus petit élément pour l orre <. Question 6 Déuisez-en une fonction tri qui effectue le tri un tableau. La fonction que vous venez écrire vous permet e trier un tableau pour la relation orre <. Sur les couples, cet orre est en Caml l orre lexicographique. On peut cepant imager autres relations orre sur es couples, comme par exemple : l e t orre x ( x, y ) ( x, y ) = x < x l e t orre y ( x, y ) ( x, y ) = y < y Question 7 Aaptez les fonctions sel et tri e sorte qu elle prennent également en argument une fonction implantant une relation orre (comme orre x ou orre y). 3 Diviser pour régner Nous revenons matenant à notre premier problème, étermer parmi un ensemble e pots un couple e pots situés à une istance mimale. Nous supposons que nous isposons e eux copies e l ensemble es n pots : un tableau t x, trié par abscisses croissantes, un tableau t y, trié par oronnées croissantes. On pose k = n/2 et on consière les eux sous-tableaux t 1 = [ t.(0);... ; t.(k) ] et t 2 = [ t.(k + 1);... ; t.(k + 2) ]. Soit un flottant plus gran que les abscisses es pots e t 1 et plus petit que les abscisses es pots e t 2. Le plan est ivisé en eux parties : Notons p 1 = (x 1, y 1 ) et p 1 = (x 1, y 1) les eux pots les plus proches ans le tableau t 1 (avec x 1 x 1) asi que p 2 = (x 2, y 2 ) et p 2 = (x 2, y 2) eux pots les plus proches ans t 2. On note = m( p 1 p 1, p 2 p 2 ). Si eux pots u tableau t sont à une istance strictement férieure à alors nécessairement l un fait partie e t 1 et l autre e t 2 et ils sont ans la bane abscisses [ ; + ]. p 1 p 1 p 2 p 2 Question 8 Écrivez une fonction qui pr pour argument un tableau t y asi que eux flottants x m, x max et qui sélectionne ans ce tableau les pots ont l abscisse est comprise entre x m et x max. Le résultat sera ru ans un tableau t z. Notons t z le tableau es pots situé ans la bane, obtenu grâce à un appel à la fonction précéente. Dans chaque tranche e hauteur e cette bane, il ne peut y avoir plus e 7 pots. On en éuit que si eux pots e t z sont à une istance férieure ou égale à alors ils sont situés à au plus sept cases l un e l autre ans le tableau t z. Question 9 Écrivez une fonction plus proches centre qui pr pour argument le tableau t z et retourne le couple e pots les plus proches, tels que ces eux pots soient situés à au plus 7 cases l un e l autre ans le tableau t z. Vous pourrez vous spirer e la fonction plus proches précéente. On éuit e ce qui précèe un algorithme récursif permettant e trouver les eux pots les plus proches à partir es eux tableaux t x et t y : 1. Découper le tableau t x en eux tableaux t x,1 et t x,2 e longueur moitié. 2. Détermer p 1 = (x 1, y 1 ), p 1 = (x 1, y 1), p 2 = (x 2, y 2 ) et p 2 = (x 2, y 2) asi que la istance. 3. Calculer t z. S il contient au mos eux pots, appliquer la fonction plus proches centre à t z pour obtenir p = (x, y) et p = (x, y ). 2
4. Retourner le résultat, c est à ire la paire e pots à istance mimale parmi p 1, p 1 ; p 2, p 2 et p, p. Question 10 Écrivez en appliquant ce procéé une nouvelle fonction plus proches. Évaluez sa complexité en fonction u nombre e pots. 3
MPSI Option Informatique Année 2001, Deuxième TP Caml Vcent Simonet (http://cristal.ria.fr/~simonet/) Les eux pots les plus proches Un corrigé Question 1 On utilise la fonction sqrt e Caml qui permet e «calculer» la race carrée un flottant et l opérateur. exponentiation. l e t i s t ( x, y ) ( x, y ) = s q r t ( ( x. x ). 2. 0 +. ( y. y ). 2. 0 ) l e t s e l t a b = l e t r = r e f a for i = a + 1 to b o i f t. ( i ) < t. (! r ) then r := i! r Question 2 Notre fonction se contente envisager tous les couples entiers (i, j) avec 0 i < j n 1 à l aie e eux boucles for imbriquées. La référence contient à chaque stant la plus petite istance trouvée et les références s i et s j les ices es eux pots la réalisant. Question 4 l e t plus proches t = l e t n = vect length t an = r e f ( i s t t. ( 0 ) t. ( 1 ) ) an s i = r e f 0 an s j = r e f 1 for j = i + 1 to ( n 1) o i f i s t t. ( i ) t. ( j ) <! then := i s t t. ( i ) t. ( j ) ; s i := i ; s j := j ( t. (! s i ), t. (! s j )) l e t swap t a b = l e t x = t. ( a ) t. ( a) < t. ( b ) ; t. ( b) < x ; Question 5 La référence r contient à chaque itération l ice e la case contenant le plus petit élément parmi t.(a)... t.(i). Question 6 Question 7 Question 8 l e t t r i t = l e t n = vect length t l e t k = s e l t i ( n 1) swap t i k l e t s e l comp t a b = l e t r = r e f a for i = a + 1 to b o i f comp t. ( i ) t. (! r ) then r := i! r l e t t r i comp t = l e t n = vect length t l e t k = s e l comp t i ( n 1) swap t i k l e t selectionne ty x m x max = l e t n = vect length ty l e t r e s u l t a t = r e f [ ] for i = n 1 ownto 0 o i f x m <= f s t ty. ( i ) && f s t ty. ( i ) <= x max then r e s u l t a t := ty. ( i ) : : (! r e s u l t a t ) v e c t o f l i s t (! r e s u l t a t )
Question 9 Notre fonction plus proches centre est très semblable à la fonction plus proches. La seule ifférence résie ans la borne supérieure e la boucle exée par j : il n est plus nécessaire e poursuivre jusqu à j = n 1 mais on peut se limiter à j = m(n 1, i + 7). l e t plus proches centre t = l e t n = vect length t an = r e f ( i s t t. ( 0 ) t. ( 1 ) ) an s o l u t i o n i = r e f 0 an s o l u t i o n j = r e f 1 for j = i + 1 to m ( n 1) ( i + 7) o i f i s t t. ( i ) t. ( j ) <! then := i s t t. ( i ) t. ( j ) ; s o l u t i o n i := i ; s o l u t i o n j := j ( t. (! s o l u t i o n i ), t. (! s o l u t i o n j )) Question 10 l e t rec plus proches tx ty = l e t n = vect length tx i f n <= 3 then ( plus proches tx ) e l s e l e t tx1 = sub vect t ( n/2) an tx2 = sub vect tx ( n /2) ( n n/2) an x0 = f s t tx. ( n/2 1) l e t p1, p1 = plus proches tx1 ty an p2, p2 = plus proches tx2 ty l e t p12, p12 = i f ( i s t p1 p1 ) < ( i s t p2 p2 ) then ( p1, p1 ) e l s e ( p2, p2 ) l e t = i s t p12 p12 l e t tz = s e l e c t i o n n e ty (max ( x0. ) ( f s t tx. ( 0 ) ) ) (m ( x0 +. ) ( f s t tx. ( n 1))) i f vect length tz <= 1 then ( p12, p12 ) e l s e l e t p, p = plus proches centre tz i f i s t p p < then ( p, p ) e l s e ( p12, p12 ) 2