ALGORITHMIQUE AVANCÉE COURS 6 1. Deux points les plus

Transcription

ALGORITHMIQUE AVANCÉE COURS 6 1. Deux points les plus
ALGORITHMIQUE AVANCÉE
COURS 6
OLIVIER BODINI
Résumé. La recherche de deux points les plus éloignés dans un nuage de n points dans le plan
peut se faire en temps O(n ln(n), ceci est obtenu grace à une compréhension géométrique précise
du problème. Dans le deuxième problème, maintenance d’une enveloppe convexe après ajout ou
suppression de points, la “bonne” complexité algorithmique obtenue (O(n ln(n)2 ) vient du choix
judicieux de la structure de données utilisée.
1. Deux points les plus éloignés
Etant donné S, un ensemble de n points dans le plan, nous cherchons à déterminer le diamètre
de S. En d’autres termes, le problème consiste à trouver la distance maximum possible entre deux
points
de S. Là encore, nous travaillerons avec la distance euclidienne (dist((x1 , y1 ), (x2 , y2 )) =
p
(x1 − x2 )2 + (y1 − y2 )2 ).
Un algorithme naı̈f consisterait à calculer la distance entre toutes les paires possibles de points
dans S et extraire le maximum. Mais il y a Cn2 possibilités, ce qui donne un algorithme en Θ(n2 ).
On va montrer qu’il existe un algorithme utilisant les résultats obtenus pour calculer l’enveloppe
convexe qui permet de trouver deux points les plus éloignés en O(n ln(n)).
Premièrement, il est bon de remarquer que le diamètre d’un nuage fini de points S est égal au
diamètre de l’enveloppe convexe de S. En fait, supposons que le diamètre soit réalisé par deux points
p1 et p2 dont l’un au moins, disons p1 n’est pas un sommet de l’enveloppe convexe. Ce point p1 est à
l’intérieur d’un segment ]p, q[ où p, q sont dans l’enveloppe convexe. Mais dans ce cas dist(p, p2 ) ou
dist(q, p2 ) est strictement plus grande que dist(p1 , p2 ). Ceci contredit le fait que p1 et p2 réalisent
le diamètre de S.
En conséquence, pour calculer le diamètre d’un ensemble de points dans le plan, nous n’avons
besoin que de considérer les sommets qui font partie de l’enveloppe convexe. Ceci veut dire qu’il
faut en premier lieu étudier le problème du diamètre pour les polygones convexes.
Soit P un polygone. Une droite de support de P est une droite d passant par un sommet de P
telle que l’intérieur de P se trouve exclusivement à droite ou exclusivement à gauche de d.
Deux points admettant deux droites de support parallèles distinctes sont dits antipodaux.
Théorème 1. Le diamètre d’un polygone convexe P est égal à la plus grande distance entre deux
points antipodaux de P .
Démonstration. Supposons que le diamètre soit réalisé par deux points non antipodaux p et q.
→
Prenons d1 la droite passant par p et perpendiculaire à −
pq et d2 la droite parallèle à d1 passant par q
−
→
(elle est perpendiculaire à pq aussi). Comme p et q ne sont pas antipodaux, il existe un point r de P
qui n’est pas dans la bande entre d1 et d2 . Clairement, dist(p, r) > dist(p, q) ou dist(q, r) > dist(p, q)
ce qui contredit l’hypothèse.
¤
Par le théorème précédent, le problème peut être réduit à trouver tous les couples de points
antipodaux et sélectionner parmi eux un couple de points les plus éloignés. Nous allons montrer
que ceci peut se faire en O(n) opérations élémentaires où n est le nombre de sommets du polygone
convexe (ceci est clairement optimal). Soit p1 , p2 , ..., pm les sommets décrivant le contour positif du
polygone convexe. Soit k le plus petit entier tel que pk est le plus éloigné de la droite (pi−1 pi ) et l le
plus grand entier tel que pl est le plus éloigné de la droite (pi pi+1 ). Alors les points antipodaux à pi
sont exactement les points pk , pk+1 , ..., pl . En effet, soit D(pi pi+1 ) le demi-plan fermé à droite de la
1
2
french
Algorithmique Avancée Cours 6
−−−−→
droite orientée (pi pi+1 ). On remarque que (pi , ps ) est antipodal si et seulement s’il est possible de
→ (D(ps−1 ps ) ∪ D(ps ps+1 )) où δ→
−
dessiner une droite dans (D(pi−1 pi ) ∪ D(pi pi+1 )) ∩ δp−−
u (S) désigne
s pi
→
le translaté de S suivant le vecteur −
u . Or, pk , pk+1 , ..., pl sont exactement les points qui vérifient
cela.
Tout d’abord, voici le pseudo-code qui permet de trouver toutes les paires de points antipodaux.
Structure de données : On va utiliser une liste chaı̂née circulaire pour stocker le contour positif
du polygone convexe. On va retourner une liste contenant tous les couples de points antipodaux.
Algorithme 1 : ANTIPODAL
Entrées : Une liste chaı̂née circulaire l contenant le contour positif du polygone convexe.
Sorties : Une liste L de toutes les paires antipodales.
1 ANTIPODAL(l)
2 L := liste vide;
3 pN := position courante dans la liste l;
4 p := pN ;
5 p0 := succ(p);
6 q := p0 ;
7 tant que Aire(p, p0 , succ(q))>Aire(p, p0 , q) faire
8
q := succ(q);
9
10
11
12
13
14
15
16
17
18
19
20
q0 := q;
tant que q 6= p0 faire
p := succ(p);
rajouter (p, q) à L;
tant que Aire(p, succ(p), succ(q))>Aire(p, succ(p), q) faire
q := succ(q);
si (p, q) 6= (q0 , p0 ) alors
rajouter (p, q) à L
si Aire(p, succ(p), succ(q))=Aire(p, succ(p), q) alors
si (p, q) 6= (q0 , pN ) alors
rajouter (p, succ(q)) à L
retourner L
Analyse du pseudo-code ANTIPODAL
Preuve de Terminaison :
Le tant que ligne 7 s’arête dès que l’on a trouvé le point le plus éloigné de la droite (pN p0 ). Pour
la terminaison de la boucle tant que ligne 10, il faut comprendre ce que fait l’algorithme, elle est
une conséquence de la preuve de validité.
Preuve de Validité :
Le tant que ligne 7 permet de trouver le premier point (noté q0 ) le plus éloigné de la droite
(pN p0 ) quand l’on parcourt le polygone dans le sens trigonométrique depuis p0 . En effet, d’une
part l’aire du triangle ABC est proportionnelle à la distance de A à (BC) ; d’autre part quand l’on
parcourt le contour positif p1 , ...pN d’un polygone convexe les aires a3 , ...aN respectives des triangles
p1 p2 p3 , ..., p1 p2 pN forment une suite croissante puis décroissante.
La boucle tant que de la ligne 10 permet de trouver tous les points antipodaux. Pour cela on
utilise deux pointeurs p et q qui parcourent les points du contour positif. Plus précisément p varie
de pN à q0 et q varie de q0 à pN . Une paire antipodale est générée à chaque fois que :
– l’un des deux pointeurs est avancé (ligne 12 et 16)
– l’on rencontre une paire d’arêtes parallèle (ligne 19)
frenchUPMC Année 07/08
3
Ceci jusqu’à ce que (p, q) = (q0 , p0 ). Donc, chaque paire antipodal est rajoutée une fois.
Analyse de la Complexité en nombre de comparaisons et calcul d’aire :
La première boucle tant que ligne 7 se fait en O(N ) comparaisons et calcul d’aire. Dans la boucle
tant que de la ligne 10, on fait varier p de pN à q0 et q de q0 à pN donc on fait N “mouvements”.
A chaque mouvement, on doit calculer au plus 2 aires et 2 comparaisons. Ceci se fait donc en O(N ).
L’algorithme est donc en O(N ).
Remarque importante : l’analyse de l’algorithme nous permet de montrer la propriété importante
suivante : Dans un polygone convexe à N sommets, il y a au plus 2N points antipodaux. Ceci est
une borne supérieure qui nous suffira par la suite.
Nous sommes maintenant en mesure de donner un pseudo-code pour trouver 2 points les plus
éloignés dans un nuages de points :
Algorithme 2 : DIAMETRE
Entrées : Une liste de points l de taille n.
Sorties : deux points diamétralement opposés.
1 DIAMETRE(l)
2 envconv :=GRAHAM(l) ; renvoie un contour positif de l’enveloppe convexe de l.
L :=ANTIPODAL(envconv);
3 (p, q, dist) := trouver parmi les couples de L un qui a une distance maximum et la distance;
4 retourner (p, q, dist);
Analyse du pseudo-code ANTIPODAL
Preuve de Terminaison :
Immédiat.
Preuve de Validité :
Immédiat.
Analyse de la Complexité en nombre d’opérations arithmétiques élémentaires :
L’appel de GRAHAM prend un temps en O(n ln(n)). L’appel d’ANTIPODAL prend un temps en
O(N ) où N est la taille de l’enveloppe convexe. Donc à fortiori ANTIPODAL est en O(n). Enfin,
trouver le maximum dans un ensemble d’au plus 2N couples se fait en temps linéraire. Donc on
dispose ainsi d’un algorithme en O(n ln(n)) pour trouver 2 points les plus éloignés dans un nuage
de n points.
2. Enveloppe convexe dynamique
On s’intéresse maintenant au problème où l’ensemble de points dont on veut l’enveloppe convexe
évolue dans le temps, soit des points lui sont rajoutés, soit des points peuvent lui être retirés. On
aimerait une structure de données qui nous permette de faire ces opérations de maintenance le plus
économiquement possible sans avoir à relancer à chaque modification tout l’algorithme en O(n ln(n))
pour retrouver la nouvelle enveloppe convexe. La notion d’arbre de recherche ne peut que nous venir
à l’esprit.
Les bons algorithmes statiques calculent l’enveloppe convexe d’un ensemble S de n points en
temps O(n ln n). L’idéal serait d’obtenir un algorithme de même complexité pour la gestion dynamique. Pour cela, il faudrait que la mise à jour de l’enveloppe après adjonction ou suppression d’un
point de S prenne toujours un temps O(log n). Ceci est possible (voir thèse de Jacob Riko 2002)
bien que techniquement hors gabarit pour un cours d’algorithmique avancée de M1. L’algorithme
proposé ici demande, s’il est bien programmé, un temps de mise à jour en O(log2 n) et un espace de
stockage linéaire, ce qui donne un temps global de calcul de EC(S) en O(n log2 n).
On va commencer par définir l’enveloppe convexe supérieure, notée ECS(E), d’un ensemble de
points E comme étant l’enveloppe convexe de E ∪ (0, −∞). De même l’enveloppe convexe inférieure,
4
french
Algorithmique Avancée Cours 6
notée ECI(E), est l’enveloppe convexe de E ∪ (0, ∞) (voir Fig. 2). Evidement, l’enveloppe convexe
de E est exactement l’intersection de ECS(E) et ECI(E). Donc, convenablement concaténés, les
contours de ces deux enveloppes ECI(E) et ECS(E) définissent le contour positif de EC(E). On
peut donc se limiter à l’étude de l’enveloppe convexe inférieure.
Fig.1 enveloppes convexes inférieures et supérieures.
La structure de données utilisée sera un arbre binaire de recherche T équilibré (appelé arbre des
enveloppes.) dont les feuilles vont stocker les points de E. Plus précisement, de gauche à droite
les feuilles stockent les points classés par ordre lexicographique (celui d’abscisse minimum à celui
d’abscisse maximum et s’il y a égalité des abscisses, on regarde les ordonnées). De plus, intuitivement,
on aimerait que chaque nœud interne s puisse représenter l’enveloppe convexe inférieure, notée
ECI(v), des points rangés dans les feuilles de son sous-arbre. Mais, ceci serait trop couteux en
place. De fait, on va n’y conserver que l’information nécessaire pour pouvoir la reconstruire :
Soient F ilsG(s) et F ilsD(s) les fils gauches et fils droits du nœud s. Il existe un unique point p1 de
ECI(F ilsG(s)) et un unique point p2 de ECI(F ilsD(s)) tels que le segment [p1 , p2 ] soit un côté de
ECI(s). On appelle pont ce segment, et piliers les deux points p1 et p2 .
– Un pointeur vers une ligne polygonale Q(s) stockée sous forme appropriée, représentant la
partie de ECI(s) qui n’appartient pas à ECI(père(s)) (si s est la racine, Q(s) = ECI(s)).
– Un couple (p1 (s), p2 (s)) représentant les piliers gauche et droit du pont de ECI(s).
La figure (Fig.1) montre comment calculer ECI(s) à partir des enveloppes I1 = ECI(F ilsG(s))
et I2 = ECI(F ilsD(s)) : soient p1 et p2 les deux piliers de s. Le sommet p1 scinde I1 en deux lignes
polygonales I11 et I12 (dans l’ordre), p1 étant rangé dans I11 , et de même p2 scinde I2 en deux
lignes polygonales I21 et I22 , p2 étant affecté à I22 . L’enveloppe ECI(s) est alors la concaténation
de I11 et I22 . Le fait de stocker en chaque sommet s la partie Q(v) de l’enveloppe convexe inférieure
ECI(s) qui n’appartient pas à ECI(père(v)) est suffisant pour reconstruire ECI(s).
Fig.1 Calcul de ECI(s) à partir des enveloppes convexes inférieures I1 = ECI(F ilsG(s)) et
I2 = ECI(F ilsD(s)).
Réciproquement, pour fabriquer I1 = ECI(F ilsG(s)) et I2 = ECI(F ilsD(s)) à partir de l’enveloppe convexe inférieure ECI(s), il suffit de connaı̂tre les extrémités du pont [p1 (s), p2 (s)] entre les
enveloppes I1 et I2 . En utilisant, p1 (v), on scinde ECI(s) en deux lignes polygonales qui, concaténées
respectivement avec Q(F ilsG(s)) et Q(F ilsG(s)) deviennent les enveloppes ECI(F ilsG(s)) et
ECI(F ilsD(s)) cherchées.
frenchUPMC Année 07/08
5
Nous allons maintenant décrire un algorithme, noté P ON T (I1 , I2 ), et qui calcule de manière
efficace (I11 , I12 , I21 , I22 , p1 , p2 ).
Fig.2 Les trois régions (I),(II),(III).
Pour cela, soit p un sommet d’une enveloppe convexe inférieure H = ECI(S) et v un point (Fig.2).
Le point p est dit concave (relativement au segment [p, v] et H) si v est dans la région (I), tangent si
le point v est dans la région (II), enfin réflexe si le point v est dans la région (III). Par convention,
la région (I) est ouverte et la région (III) est fermée. Avec la représentation précédemment définie,
il est possible de calculer la fonction P ON T (I1 , I2 ) en temps O(log N ) où N est le nombre total de
points. Soient en effet deux enveloppes convexes inférieures I1 et I2 disjointes (donc séparées par
une droite verticale d). Le pont [p1 , p2 ] entre I1 et I2 est l’unique segment [p1 , p2 ] reliant un sommet
de I1 à un sommet de I2 et tel que p1 soit un point tangent relativement à [p1 , p2 ] et I2 , et p2 soit
aussi un point tangent relativement à [p1 , p2 ] et I1 . Soit q1 un sommet de I1 et q2 un sommet de
I2 . Il y a 9 cas à envisager (figure 6.a) selon la nature respective des points q1 et q2 relativement au
segment [q1 , q2 ] et relativement à I2 et I1 . Sont hachurées les parties de I1 et I2 non candidates à
contenir les piliers du pont. La figure (Fig.3) est suffisamment explicite ; seul le cas où q1 et q2 sont
tous les deux concaves est un peu plus complexe.
Fig.3 Les 9 cas de figures et le cas concave-concave détaillé.
Il faut pour cela considérer la droite (q1 , q10 ) où q10 est le successeur de q1 sur I1 et la droite (q2 , q20 )
où q20 est le prédécesseur de q2 sur I2 (figure 3.b). Soit d une droite verticale séparant I1 et I2 . La
6
french
Algorithmique Avancée Cours 6
droite (q1 , q10 ) (resp. (q2 , q20 )) coupe d en m (resp. n). Si m est au-dessus au sens large de n (resp.
au dessous au sens large) alors on peut hachurer la partie de I2 à droite de q2 (resp. la partie de
I1 à gauche de q1 ). En effet pour tout point q 00 de I2 situé à droite de q2 et tout point q 0 de I1 ,
le segment [q 0 , q 00 ] est situé dans l’ensemble convexe limité par la partie de I1 à gauche de q1 , les
segments [q1 , m], [m, q2 ] et la partie de I2 à droite de q2 . Donc q 00 est concave relativement à [q 0 , q 00 ]
et I2 , car [q 0 , q 00 ] coupe d au-dessus de m alors que [q2 , q20 ] coupe d en n qui est en-dessous de m.
Dans tous les cas, une partie d’au moins une des deux enveloppes convexes est éliminée. Donc
à chaque étape, on peut faire l’hypothèse que le nombre de prétendants au pont est divisé par
deux dans l’une des enveloppes au moins. Ceci “prouve” que PONT peut être calculé en O(ln(n))
opérations élémentaires.
2.1. Cas d’une insertion. L’insertion demande la mise à jour des informations contenues dans les
sommets de l’arbre des enveloppes, en plus d’éventuelles opérations de rééquilibrage. On procède en
deux temps. Lors de la descente dans l’arbre pour insérer une nouvelle feuille, on calcule l’enveloppe
ECI(v) et ECI(F ils(v)) inductivement grâce aux points p1 (v), p2 (v) pour chaque sommet v situé
sur le chemin c de descente, et on transmet aux fils de v les lignes polygonales respectives qui leur
manquent pour former l’enveloppe convexe qui leur est associée. Ainsi, au moment de l’insertion
du nouveau point, on dispose pour chaque sommet v du chemin c ainsi que pour ses frères, de
l’enveloppe convexe correspondante :
Algorithme 3 : DESCENDRE
Entrées : deux points p et v, un l’est le point à insérer, d’autre la position actuelle dans
l’arbre.
Sorties : Un arbre modifié.
1 DESCENDRE((p, v))
2 si v n’est pas une feuille alors
3
(QG , QD ) :=SCINDER(ECI(v), p1 (v), p2 (v));
4
ECI(F ilsG(v)) :=CONCATENER(QG , Q(F ilsG(v)));
5
ECI(F ilsD(v)) :=CONCATENER(Q(F ilsD(v)), QD );
6
si p <lex cle(v) alors
7
DESCENDRE((p, F ilsG(v)))
8
sinon
9
DESCENDRE((p, F ilsD(v)))
10
11
sinon
INSERER(p)
Après insertion, la remontée à la racine (c’est ici que se situe un éventuel rééquilibrage) permet
de recalculer inductivement Q(v) pour les sommets v du chemin c, et les piliers p1 (v), p2 (v) pour
les sommets v de c ainsi que pour leurs frères. L’opération de montée est décrite plus précisément
dans la procédure MONTER, sans toutefois prendre en compte le rééquilibrage :
frenchUPMC Année 07/08
7
Algorithme 4 : MONTER
Entrées : un point v, position dans l’arbre depuis laquelle on veut remonter.
Sorties : Un arbre modifié.
1 MONTER(v)
2 si v n’est pas la racine alors
3
(Q1 , Q2 , Q3 , Q4 , J1 , J2 ) :=PONT(ECI(v), ECI(f rere(v)));
4
Q(v) := Q2 ;
5
Q(f rere(v)) := Q3 ;
6
ECI(pere(v)) :=CONCATENER(Q1 , Q4 );
7
p1 (pere(v)) := J1 ;
8
p2 (pere(v)) := J2 ;
9
MONTER(pere(v))
10 sinon
11
Q(v) := ECI(v)
On voit que l’algorithme d’insertion est en O((logN )2 ). On peut en effet faire les opération
CONCATENER et SCINDER en temps O(ln(k) si k est la longueur de la chaı̂ne et PONT en
O(ln(n)). Puisque k ≤ N , on a un coût en O(ln(N ) pour chaque nœud sur le chemin c. Et comme
l’arbre est équilibré, la longueur de c est en ln(n), ce qui nous permet de conclure.
Le procédé d’insertion est illustré par l’exemple donné dans les figures 4 et 5. La figure 4 représente
l’arbre binaire équilibré dont les feuilles contiennent les points dont on doit calculer l’enveloppe
convexe inférieure. On a représenté les points par des entiers qui correspondent à l’ordre dans lequel
on a inséré les points dans l’arbre. En chaque nœud v sont indiqués Q(v) et p1 (v). La figure 8
représente l’insertion d’un nouveau point. Les informations qui ont été recalculées au cours de cette
insertion sont indiquées en gras et soulignées.
Fig.4 Arbre avant insertion de p13 .
E-mail address: [email protected]
8
french
Algorithmique Avancée Cours 6
Fig.5 Arbre après insertion de p13 .

Documents pareils