Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Envolvente convexa Parte 1: Algoritmos
Tema 1 Envolvente convexa Parte 1: Algoritmos
2
Definiciones Un conjunto es convexo si el segmento uniendo cualquiera dos de sus puntos está contenido en él.
3
Definiciones Envolvente convexa de un conjunto: menor convexo que lo contiene. O, equivalentemente, la intersección de todos los convexos que contienen al conjunto.
4
Considere todos los conjuntos convexos que lo contienen y elija el menor de todos ellos.
5
O bien, calculando la intersección de todos ellos.
6
Pero, ningún ordenador puede manejar infinitos conjuntos....
7
Eso se resuelve con puntillas y una goma elástica
8
Observación 1: La envolvente convexa es un polígono convexo con vértices en puntos del conjunto.
Observación 2: Describir la secuencia en orden de los vértices es describir la envolvente. Observación 3: Selección ordenada de subconjuntos.
9
Definiciones Aplicaciones:
Lo interesante suele ocurrir dentro de la envolvente. Es más fácil (rápido) mover un convexo.
10
Algoritmos: Puntos extremos
Sea S un conjunto de n puntos. Punto extremo de S: no está contenido en ningún triángulo con vértices en puntos de S.
11
Algoritmos: Puntos extremos
Sea S un conjunto de n puntos. Punto extremo de S: no está contenido en ningún triángulo con vértices en puntos de S.
12
Algoritmos: Puntos extremos
Los puntos extremos son los vértices de la envolvente convexa. ¿Cuánto nos cuesta encontrar todos los puntos extremos?
13
Algoritmos: Puntos extremos
Para cada punto de S, comprobar si está dentro de algún triángulo con vértices puntos de S: SÍ: No es vértice de la envolvente. NO: Es vértice de la envolvente convexa. Para cada punto de S comprobar si está dentro de algún triángulo. n puntos, O(n3) triángulos, O(n4) operaciones.
14
Algoritmos: Puntos extremos
También podemos buscar las aristas extremas (unen dos puntos de S y dejan a todo el conjunto a un mismo lado de la recta que definen). Para cada par de puntos de S ver si la arista es extrema. O(n2) pares, O(n) por comprobación O(n3) operaciones.
15
Algoritmos: Puntos extremos
Inciso: ¿Cómo sabemos si un punto está dentro de un triángulo, o si un punto está a un lado u otro de una recta? Mediante un determinante
16
Algoritmos: Puntos extremos
Q ¿A qué lado de la recta PQ está R? A partir de sus coordenadas construimos el determinante p1 p2 1 |A|= q1 q2 1 r1 r2 1 P R Interpretación geométrica: Vamos de P a Q, y luego de Q a R. Si: |A|>0: Giro a la izquierda. |A|<0: Giro a la derecha.
17
Algoritmos: Puntos extremos
Q ¿M está dentro o fuera del triángulo? M Si al recorrer el triángulo (en el sentido de las agujas del reloj) hacemos 3 giros a la derecha, entonces M está en el interior. P R ¡Ojo! esto sólo vale para convexos .
18
Algoritmos: Quickhull
Punto Norte (mayor coordenada y) Este Oeste Sur
19
Algoritmos: Quickhull
Los puntos en el rectángulo definido por estos cuatro puntos no son vértices de la envolvente.
20
Algoritmos: Quickhull
Buscamos el punto más alejado a cada uno de los segmentos y lo incorporamos.
21
Algoritmos: Quickhull
Buscamos el punto más alejado a cada uno de los segmentos y lo incorporamos.
22
Algoritmos: Quickhull
Repetimos el proceso en cada nuevo segmento hasta completar la envolvente.
23
Algoritmos: Quickhull
En el peor de los casos necesitaremos O(n2) operaciones.
24
Algoritmos: Marcha de Jarvis
Buscamos el punto Sur y a partir de él giramos una semirrecta
25
Algoritmos: Marcha de Jarvis
Buscamos el punto Sur y a partir de él giramos una semirrecta hasta encontrar el siguiente punto de la envolvente.
26
Algoritmos: Marcha de Jarvis
Repetimos el proceso hasta volver al punto de partida.
27
Algoritmos: Marcha de Jarvis
Repetimos el proceso hasta volver al punto de partida.
28
Algoritmos: Marcha de Jarvis
Coste: Buscar el siguiente punto: O(n) Hay que repetirlo n veces en el peor de los casos. Número de operaciones: O(n2)
29
Algoritmos: Marcha de Jarvis
En realidad el tiempo de ejecución es: O(nh), siendo h el número de puntos de la envolvente. Es un algoritmo output sensitive.
30
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera.
31
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera.
32
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera Ordenamos los demás puntos angularmente con respecto a dicho punto.
33
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera Ordenamos los demás puntos angularmente con respecto a dicho punto:L 1 2 3 4 5 6 7 8 9 10 11 12 13
34
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 1 2 3 4 5 6 7 8 9 10 11 12 13
35
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F M 1 2 3 4 5 6 7 8 9 10 11 12 13 I F
36
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) M 1 2 3 4 5 6 7 8 9 10 11 12 13 I F
37
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) I 1 2 3 4 5 6 7 8 9 10 11 12 13 F M
38
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F I 2 F M 1 4 3 5 13 6 11 10 7 9 12 8
39
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F M 2 F I 1 4 3 5 13 6 11 10 7 9 12 8
40
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F I 2 M 1 4 3 F 5 13 6 11 10 7 9 12 8
41
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 I 1 4 3 M F 5 13 6 11 10 7 9 12 8
42
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 I M 5 13 6 11 F 10 7 9 12 8
43
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 I M 5 13 6 11 F 10 7 9 12 8
44
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 I 1 4 3 M 5 13 6 11 F 10 7 9 12 8
45
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 I 5 13 6 11 M 10 7 9 12 F 8
46
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 I F 10 7 9 12 M 8
47
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 M F 10 7 9 12 I 8
48
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 M F 10 7 9 12 I 8
49
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 I F 10 7 9 12 M 8
50
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 F 13 6 11 M 10 7 9 12 I 8
51
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 M 5 13 6 11 F I 10 7 9 12 8
52
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 M 5 13 6 11 F I 10 7 9 12 8
53
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 M F 10 7 9 12 I 8
54
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 M F 10 7 9 12 I 8
55
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 5 13 6 11 F I 10 7 9 12 M 8
56
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 F 5 13 6 11 M 10 7 9 12 I 8
57
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 1 4 3 F 5 13 6 11 M 10 7 9 12 I 8
58
Algoritmos: Scan de Graham
1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F 2 F 1 4 3 M 5 13 6 11 I 10 7 9 12 8
59
Algoritmos: Scan de Graham
Teorema: El Scan de Graham computa la envolvente convexa de n puntos en un tiempo óptimo O(n log n). 1.- Escogemos un punto cualquiera. 2.- Ordenamos los demás puntos angularmente con respecto a dicho punto:L 3.- A los tres primeros puntos les ponemos las etiquetas I M F 4.- Si el ángulo IMF es positivo I=siguiente(I) M=siguiente(M) F=siguiente(F) Si IMF es negativo: borramos M de L I=anterior(I) M=I F=F O(n log n) F 2 M 1 4 3 I O(n) 5 13 6 11 10 7 9 12 8
60
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño.
61
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño.
62
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos.
63
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos.
64
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original.
65
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original.
66
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original.
67
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original.
68
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original.
69
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original. No es necesario que las envolventes sean disjuntas (conjuntos separados linealmente).
70
Algoritmos: Otros Divide y vencerás:
Dividimos el conjunto en dos subconjuntos de aproximadamente el mismo tamaño. En cada uno de ellos repetimos la división hasta llegar a un tener uno o dos puntos. Construimos las envolventes en cada subconjunto y vamos uniéndolas hasta hallar la del conjunto original. La unión de dos convexos requiere O(n), luego el algoritmo corre en tiempo O(n log n).
71
Algoritmos: Divide y vencerás
Unión de dos convexos disjuntos Tangente superior B A Tangente inferior
72
Algoritmos: Divide y vencerás
Unión de dos convexos disjuntos 2 Tangente superior 1 7 3 6 8 4 5 B A 5 10 4 3 2 1 6 9 7 8 Tangente inferior
73
Algoritmos: Divide y vencerás
Unión de dos convexos disjuntos TANGENTE INFERIOR 2 1 a=punto de A más a la dcha b=punto de B más a la izda 7 3 6 While T=ab no sea tangente a A y a B do { 8 4 5 While T=ab no sea tangente a A do a=a-1; (mód |A|) B A 5 b 10 4 a While T=ab no sea tangente a B do b=b+1; (mód |B|) 3 2 1 6 9 } 7 8
74
Algoritmos: Divide y vencerás
Unión de dos convexos disjuntos TANGENTE INFERIOR 2 1 a=punto de A más a la dcha b=punto de B más a la izda 7 3 6 While T=ab no sea tangente a A y a B do { 8 4 5 While T=ab no sea tangente a A do a=a-1; (mód |A|) B A 5 10 4 While T=ab no sea tangente a B do b=b+1; (mód |B|) 3 2 1 6 9 } 7 8
75
Algoritmos: Divide y vencerás
Unión de dos convexos disjuntos TANGENTE SUPERIOR 2 1 a=punto de A más a la dcha b=punto de B más a la izda 7 3 6 While T=ab no sea tangente a A y a B do { 8 4 5 While T=ab no sea tangente a A do a=a+1; (mód |A|) B A 5 10 4 While T=ab no sea tangente a B do b=b-1; (mód |B|) 3 2 1 6 9 } 7 8 Si los convexos no son disjuntos el algoritmo es ligeramente más complicado (ver libro de Preparata y Shamos)
76
Algoritmos: Otros Incremental: Añadimos los puntos uno a uno.
En cada paso comprobamos si el nuevo punto está en el interior de la envolvente: SÍ: Lo ignoramos. NO: Lo incorporamos a la envolvente.
77
Algoritmos: Otros Incremental: Añadimos los puntos uno a uno.
En cada paso comprobamos si el nuevo punto está en el interior de la envolvente: SÍ: Lo ignoramos. NO: Lo incorporamos a la envolvente.
78
Algoritmos: Otros Incremental: Añadimos los puntos uno a uno.
En cada paso comprobamos si el nuevo punto está en el interior de la envolvente: SÍ: Lo ignoramos. NO: Lo incorporamos a la envolvente.
79
Algoritmos: Otros Incremental: Añadimos los puntos uno a uno.
En cada paso comprobamos si el nuevo punto está en el interior de la envolvente: SÍ: Lo ignoramos. NO: Lo incorporamos a la envolvente. Al añadir un nuevo punto puede que tengamos que eliminar alguno de la envolvente.
80
Algoritmos: Otros Incremental: Añadimos los puntos uno a uno.
En cada paso comprobamos si el nuevo punto está en el interior de la envolvente: SÍ: Lo ignoramos. NO: Lo incorporamos a la envolvente. Al añadir un nuevo punto puede que tengamos que eliminar alguno de la envolvente.
81
Algoritmos: Otros Incremental:
Añadimos los puntos uno a uno. En cada paso comprobamos si el nuevo punto está en el interior de la envolvente: SÍ: Lo ignoramos. NO: Lo incorporamos a la envolvente. Al añadir un nuevo punto puede que tengamos que eliminar alguno de la envolvente. Cada inserción a lo bruto requiere O(n), por lo que serían necesarias O(n2) operaciones, pero puede mejorarse a O(log n), obteniendo O(n log n).
82
Algoritmos: Cota inferior
Construir la envolvente convexa de n puntos requiere, al menos, (n log n) operaciones, ya que es equivalente a ordenar n números. x -3 4 -1 5 3 (x,x2) (-3,9) (4,16) (-1,1) (5,25) (3,9) (-3,9) (-1,1) (3,9) (4,16) (5,25)
83
Algoritmos: Cota inferior
Construir la envolvente convexa de n puntos requiere, al menos, (n log n) operaciones, ya que es equivalente a ordenar n números. x -3 4 -1 5 3 (x,x2) (-3,9) (4,16) (-1,1) (5,25) (3,9) (-3,9) (-1,1) (3,9) (4,16) (5,25)
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.