En geometría computacional , una descomposición de pares bien separados (WSPD) de un conjunto de puntos es una secuencia de pares de conjuntos , de modo que cada par está bien separado y, para cada dos puntos distintos , existe precisamente un par que separa los dos.
El gráfico inducido por una descomposición de pares bien separados puede servir como un k-spanner del gráfico euclidiano completo y es útil para aproximar soluciones a varios problemas relacionados con esto. [1]
Sean dos conjuntos disjuntos de puntos en , denote el cuadro delimitador mínimo alineado al eje para los puntos en , y denote el factor de separación .
Consideramos que y están bien separados , si para cada uno de y existe una bola d de radio que lo contiene, tal que las dos esferas tienen una distancia mínima de al menos . [2]
Consideramos que una secuencia de pares bien separados de subconjuntos de , es una descomposición de pares bien separados (WSPD) de si para dos puntos distintos , existe precisamente un , , tal que
Mediante la construcción de un árbol dividido justo, es posible construir un WSPD de tamaño en el tiempo. [2]
El principio general del árbol de división de un conjunto de puntos S es que cada nodo u del árbol representa un conjunto de puntos S u y que el cuadro delimitador R(S u ) de S u se divide a lo largo de su lado más largo en dos partes iguales que forman los dos hijos de u y su conjunto de puntos. Se hace de forma recursiva hasta que solo queda un punto en el conjunto.
Sea L max (R(X)) el tamaño del intervalo más largo del hiperrectángulo delimitador del conjunto de puntos X y sea L i (R(X)) el tamaño de la i -ésima dimensión del hiperrectángulo delimitador del conjunto de puntos X. A continuación, presentamos un pseudocódigo para el cálculo del árbol de división.
SplitTree(S) Sea u el nodo para S si |S| = 1 R(u) := R(S) // R(S) es un hiperrectángulo cuyo lado tiene una longitud de cero. Almacena en u el único punto en S. de lo contrario Calcula R(S) Sea la dimensión i -ésima aquella donde L max (R(S)) = L i (R(S)) Divide R(S) a lo largo de la dimensión i -ésima en dos hiperrectángulos del mismo tamaño y toma los puntos contenidos en estos hiperrectángulos para formar los dos conjuntos S v y S w . v := SplitTree(S v ) w := SplitTree(S w ) Almacena v y w como, respectivamente, los hijos izquierdo y derecho de u . R(u) := R(S) devuelve u
Este algoritmo se ejecuta en el tiempo.
A continuación, presentamos un algoritmo más eficiente que se ejecuta en el tiempo. El objetivo es recorrer la lista en solo operaciones por paso de la recursión, pero solo invocar la recursión en, como máximo, la mitad de los puntos cada vez.
Sea S i j la i -ésima coordenada del j -ésimo punto en S tal que S i esté ordenado según la i -ésima coordenada y p(S i j ) sea el punto. Además, sea h(R(S)) el hiperplano que divide el lado más largo de R(S) en dos. Aquí está el algoritmo en pseudocódigo:
SplitTree(S, u) si |S| = 1 R(u) := R(S) // R(S) es un hiperrectángulo cuyo lado tiene una longitud de cero. Almacena en u el único punto en S. de lo contrario tamaño := |S| repetir Calcular R(S) R(u) := R(S) j : = 1 k : = |S| Sea la dimensión i -ésima aquella donde L máx (R(S)) = L i (R(S)) S v : = ∅ S w : = ∅ mientras S i j+1 < h(R(S)) y S i k-1 > h(R(S)) tamaño:= tamaño - 1 S v : = S v ∪ {p(S_i^j) } S w : = S w ∪ {p(S_i^k) } j := j + 1 k := k - 1 Sean v y w, respectivamente, los hijos izquierdo y derecho de u . si S i j+1 > h(R(S)) S w := S \ S v u := w S := S w SplitTree(S v ,v) de lo contrario si S i k-1 < h(R(S)) S v := S \ S w u := v S := S v SplitTree(S w ,w) hasta que tamaño ≤ n ⁄ 2 SplitTree(S,u)
Para poder mantener las listas ordenadas para cada nodo, se utilizan listas enlazadas. Se mantienen los puntos de cruce de cada lista con las demás para poder recuperar un punto en tiempo constante. En el algoritmo anterior, en cada iteración del bucle, se realiza una llamada a la recursión. En realidad, para poder reconstruir la lista sin la sobrecarga de volver a ordenar los puntos, es necesario reconstruir las listas ordenadas una vez que todos los puntos se han asignado a sus nodos. Para hacer la reconstrucción, se recorre cada lista para cada dimensión, se añade cada punto a la lista correspondiente de sus nodos y se añaden los puntos de cruce en la lista original para poder añadir los puntos de cruce para las nuevas listas. Por último, se llama a la recursión en cada nodo y su conjunto.
El WSPD se puede extraer de un árbol dividido de este tipo llamando a la función recursiva FindPairs(v,w) en los hijos de cada nodo del árbol dividido. Sea u l / u r los hijos del nodo u . A continuación, proporcionamos un pseudocódigo para la función FindWSPD(T, s) .
FindWSPD(T, s) para cada nodo u que no sea una hoja en el árbol dividido T, haga FindPairs(u l , u r )
A continuación proporcionamos un pseudocódigo para la función FindPairs(v, w) .
FindPairs(v, w) si S v y S w están bien separados con respecto a s informe par(S v , S w ) de lo contrario si ( L max (R(v)) ≤ L max (R(w)) ) Llamar recursivamente a FindPairs(v, w l ) y FindPairs(v, w r ) de lo contrario Llamar recursivamente a FindPairs(v l , w) y FindPairs(v r , w)
La combinación de los pares s -bien separados de todas las llamadas de FindPairs(v,w) proporciona el WSPD para la separación s .
Cada vez que el árbol de recursión se divide en dos, se agrega un par más a la descomposición. Por lo tanto, el tiempo de ejecución del algoritmo se expresa en la cantidad de pares en la descomposición final.
Callahan y Kosaraju demostraron que este algoritmo encuentra una descomposición de pares bien separados (WSPD) de tamaño . [2]
Lema 1 : Sea un par bien separado con respecto a . Sea y . Entonces, .
Demostración : Como y están en el mismo conjunto, tenemos que donde es el radio del círculo que encierra a y . Como y están en dos conjuntos bien separados, tenemos que . Obtenemos que:
Lema 2 : Sea un par bien separado con respecto a . Sea y . Entonces, .
Demostración : Por la desigualdad triangular, tenemos:
Del Lema 1 obtenemos:
La descomposición en pares bien separados tiene aplicación en la solución de diversos problemas. WSPD se puede utilizar para: