Algorithme de Chan

Exemple d'une enveloppe convexe d'un ensemble de n = 10 points. L'enveloppe contient k = 5 points.

En géométrie algorithmique, l'algorithme de Chan[1] nommé d'après son inventeur Timothy M. Chan (en), est un algorithme sensible à la sortie qui calcule l'enveloppe convexe d'un ensemble P {\displaystyle P} de n {\displaystyle n} points, en dimension 2 ou 3. La complexité temporelle est O ( n log h ) {\displaystyle {\mathcal {O}}(n\log h)} h {\displaystyle h} est le nombre de points dans l'enveloppe convexe. En dimension 2, l'algorithme combine un algorithme en O ( n log n ) {\displaystyle {\mathcal {O}}(n\log n)} (par exemple le parcours de Graham) et la marche de Jarvis afin d'obtenir un algorithme en O ( n log h ) {\displaystyle {\mathcal {O}}(n\log h)} . L'algorithme de Chan est important car il est plus simple que l'algorithme de Kirkpatrick-Seidel et s'étend facilement à la dimension 3. Le paradigme utilisé dans l'algorithme s'appuie sur les travaux de Frank Nielsen[2],[3].

Algorithme

Version où le nombre de points h dans l'enveloppe convexe est connu

Dans un premier temps, nous présentons un algorithme qui utilise la valeur de h {\displaystyle h} et nous appelons ce paramètre m = h {\displaystyle m=h} . Cette hypothèse n'est pas réaliste et nous allons la supprimer plus tard. L'algorithme est divisé en deux phases.

Phase 1 : pré-calcul d'enveloppes convexes pour des sous-ensembles

L'algorithme commence par partitionner P {\displaystyle P} en au plus 1 + n / m {\displaystyle 1+n/m} sous-ensembles Q {\displaystyle Q} avec au plus m {\displaystyle m} points dans chaque sous-ensemble. Puis, on calcule l'enveloppe convexe de chacun des sous-ensembles Q {\displaystyle Q} en utilisant un algorithme en O ( n log n ) {\displaystyle {\mathcal {O}}(n\log n)} (par exemple le parcours de Graham). Remarquons que, comme il y a O ( n / m ) {\displaystyle {\mathcal {O}}(n/m)} sous-ensembles de O ( m ) {\displaystyle {\mathcal {O}}(m)} points chacun, cette phase prend O ( n / m ) O ( m log m ) = O ( n log m ) {\displaystyle {\mathcal {O}}(n/m){\mathcal {O}}(m\log m)={\mathcal {O}}(n\log m)} opérations.

Phase 2 : calcul de l'enveloppe convexe

La seconde phase consiste à exécuter une marche de Jarvis en utilisant les enveloppes convexes précalculées dans la phase 1 pour accélérer le calcul. À chaque étape de la marche de Jarvis, on considère un point p i {\displaystyle p_{i}} de l'enveloppe convexe et on cherche à calculer le point p i + 1 = f ( p i , P ) {\displaystyle p_{i+1}=f(p_{i},P)} tel que tous les autres points de P {\displaystyle P} sont à droite de la ligne p i p i + 1 {\displaystyle p_{i}p_{i+1}} . Si l'on connait l'enveloppe convexe Q {\displaystyle Q} de m {\displaystyle m} points, alors on peut calculer f ( p i , Q ) {\displaystyle f(p_{i},Q)} en O ( log m ) {\displaystyle {\mathcal {O}}(\log m)} en utilisant la recherche dichotomique. On calcule f ( p i , Q ) {\displaystyle f(p_{i},Q)} pour tous les O ( n / m ) {\displaystyle {\mathcal {O}}(n/m)} sous-ensembles Q {\displaystyle Q} de la phase 1 en O ( n / m log m ) {\displaystyle {\mathcal {O}}(n/m\log m)} . Puis, on détermine f ( p i , P ) {\displaystyle f(p_{i},P)} en utilisant la même technique que celle de la marche de Jarvis, mais en ne considérant que les points f ( p i , Q ) {\displaystyle f(p_{i},Q)} Q {\displaystyle Q} est un sous-ensemble de la phase 1. Comme la marche de Jarvis répète le calcul d'un f ( p i , P ) {\displaystyle f(p_{i},P)} O ( h ) {\displaystyle {\mathcal {O}}(h)} fois, la seconde phase prend O ( n log m ) {\displaystyle {\mathcal {O}}(n\log m)} opérations. Si m = h {\displaystyle m=h} , elle prend O ( n log h ) {\displaystyle {\mathcal {O}}(n\log h)} opérations.

Algorithme où h n'est pas connu

L'algorithme décrit précédemment utilise m = h {\displaystyle m=h} . Si m < h {\displaystyle m<h} , nous nous en rendons compte dans la marche de Jarvis au bout de m + 1 {\displaystyle m+1} étapes. Ainsi, si m < h {\displaystyle m<h} , on prend O ( n log m ) {\displaystyle {\mathcal {O}}(n\log m)} pour s'en rendre compte (et on ne calcule pas l'enveloppe convexe jusqu'au bout). Si m > h {\displaystyle m>h} , on s'en rend compte aussi puisque l'algorithme s'arrête et calcule l'enveloppe convexe.

L'idée consiste alors à commencer l'algorithme avec une valeur petite pour m {\displaystyle m} (dans l'analyse qui suit on utilise 2, mais des nombres aux alentours de 5 marchent mieux en pratique), puis on augmente la valeur de m {\displaystyle m} jusqu'à ce que m > h {\displaystyle m>h} , et dans ce cas, on obtient l'enveloppe convexe.

Si on augmente la valeur de m {\displaystyle m} trop lentement, on a besoin de répéter les phases 1 et 2 trop de fois et le temps de d'exécution est trop grand. A contrario, si on augmente les valeurs de m {\displaystyle m} trop vite, on risque d'atteindre une valeur de m {\displaystyle m} beaucoup trop grande par rapport à h {\displaystyle h} , et le temps d'exécution est trop grand. À la manière de la stratégie utilisée dans l'algorithme de Chazelle and Matoušek's[4], l'algorithme de Chan élève au carré la valeur de m {\displaystyle m} à chaque itération sans dépasser n {\displaystyle n} . En d'autres termes, m {\displaystyle m} prend les valeurs 2, 4, 16, 256, etc. et à l'itération numéro t {\displaystyle t} (en commençant à 0), on a m = min ( n , 2 2 t ) {\displaystyle m=\min(n,2^{2^{t}})} . Le temps d'exécution total de l'algorithme est

t = 0 log log h O ( n log ( 2 2 t ) ) = O ( n ) t = 0 log log h O ( 2 t ) = O ( n 2 1 + log log h ) = O ( n log h ) . {\displaystyle \sum _{t=0}^{\lceil \log \log h\rceil }{\mathcal {O}}\left(n\log(2^{2^{t}})\right)={\mathcal {O}}(n)\sum _{t=0}^{\lceil \log \log h\rceil }O(2^{t})={\mathcal {O}}\left(n\cdot 2^{1+\lceil \log \log h\rceil }\right)={\mathcal {O}}(n\log h).}

En dimension 3

Pour généraliser l'algorithme en dimension 3, on doit utiliser un autre algorithme en O ( n log n ) {\displaystyle {\mathcal {O}}(n\log n)} à la place du parcours de Graham et on doit utiliser une version 3D de la marche de Jarvis. La complexité temporelle reste en O ( n log h ) {\displaystyle {\mathcal {O}}(n\log h)} .

Améliorations

Dans l'article de Chan, il y a des suggestions qui pourraient améliorer la performance de l'algorithme en pratique :

  • Quand on calcule les enveloppes convexes des sous-ensembles, on peut éliminer les points qui ne sont dans l'enveloppe convexe pour les autres itérations.
  • Quand m {\displaystyle m} augmente, on peut calculer les nouvelles enveloppes convexes en fusionnant les enveloppes convexes précédentes au lieu de les recalculer à partir de zéro.

Extensions

L'article de Chan contient d'autres problèmes que l'on peut rendre sensible à la sortie en utilisant la même technique, par exemple :

  • Calculer la courbe minimum (lower enveloppe) d'un ensemble de n {\displaystyle n} segments. Hershberger[5], donne un algorithme en O ( n log n ) {\displaystyle {\mathcal {O}}(n\log {}n)} qui peut être amélioré en O ( n log h ) {\displaystyle {\mathcal {O}}(n\log {}h)} , où h {\displaystyle h} est le nombre de segments dans la courbe minimum.
  • Calculer une enveloppe convexe en dimension supérieure. On peut maintenir la complexité en O ( n log h ) {\displaystyle {\mathcal {O}}(n\log {}h)} si h {\displaystyle h} reste polynomial en n {\displaystyle n} .

Références

  1. (en) Timothy M. Chan, « Optimal output-sensitive convex hull algorithms in two and three dimensions », Discrete and Computational Geometry, vol. 16,‎ , p. 361–368 (présentation en ligne)
  2. (en) Frank Nielsen, « Grouping and Querying : A Paradigm to Get Output-Sensitive Algorithms », Discrete and Computational Geometry, vol. 1763,‎ , p. 250–257 (présentation en ligne).
  3. Frank Nielsen, « Algorithmes géométriques adaptatifs », sur INRIA, , thèse de doctorat.
  4. B. Chazelle et Jiří Matoušek, « Derandomizing an output-sensitive convex hull algorithm in three dimensions », Computational Geometry, vol. 5,‎ , p. 27–32 (présentation en ligne).
  5. (en) J. Hershberger, « Finding the upper envelope of n line segments in O(n log n) time », Information Processing Letters, vol. 33,‎ , p. 169–174 (présentation en ligne).
  • icône décorative Portail de la géométrie
  • icône décorative Portail de l'informatique théorique