Proporcione una función para encontrar los dos puntos más cercanos entre un conjunto de puntos dados en dos dimensiones, es decir, para resolver el problema del par de puntos más cercano en el caso plano.
La solución directa es un algoritmo O (n 2 ) (que podemos llamar algoritmo de fuerza bruta); El pseudocódigo (utilizando índices) podría ser simplemente:
bruteForceClosestPair de P (1), P (2), ... P (N)
si N <2 entonces
volver ∞
más
minDistance ← | P (1) - P (2) |
minPuntos ← {P (1), P (2)}
foreach i ∈ [1, N-1]
foreach j ∈ [i + 1, N]
si | P (i) - P (j) | <minDistance entonces
MinDistance ← | P (i) - P (j) |
minPuntos ← {P (i), P (j)}
terminara si
endfor
endfor
volver minDistance, minPoints
terminara si
Un mejor algoritmo se basa en el enfoque recursivo de divide y vencerás, como se explica también en el problema del par de puntos más cercanos de Wikipedia , que es O (n log n); Un pseudocódigo podría ser:
closestPair de (xP, yP)
donde xP es P (1) ... P (N) ordenada por la coordenada x, y
yP es P (1). P (N) ordenado por coordenada y (orden ascendente)
si N ≤ 3 entonces
devolver los puntos más cercanos de xP utilizando el algoritmo de fuerza bruta
más
xL ← puntos de xP de 1 a ⌈N / 2⌉
xR ← puntos de xP de ⌈N / 2⌉ + 1 a N
xm ← xP (⌈N / 2⌉) x
yL ← {p ∈ yP: p x ≤ xm}
yR ← {p ∈ yP: p x > xm}
(dL, pairL) ← closestPair de (xL, yL)
(dR, pairR) ← closestPara de (xR, yR)
(dmin, pairMin) ← (dR, pairR)
si dL <dR entonces
(dmin, pairMin) ← (dL, pairL)
terminara si
yS ← {p ∈ yP: | xm - p x | <dmin}
nS ← número de puntos en yS
(el más cercano, el par más cercano) ← (dmin, pairMin)
para i de 1 a nS - 1
k ← i + 1
mientras que k ≤ nS y yS (k) y - yS (i) y <dmin
si | yS (k) - yS (i) | <más cercano entonces
(más cercano, par más cercano) ← (| yS (k) - yS (i) |, {yS (k), yS (i)})
terminara si
k ← k + 1
al final
endfor
volver mas cercano, mas cercano par
terminara si
Referencias y lecturas adicionales: Par de problemas más cercano Par más cercano (McGill) Par más cercano (UCSB) Par más cercano (WUStL) Par más cercano (IUPUI) Para la entrada, espere que el argumento sea una matriz de objetos (puntos) con los miembros x e y establecidos en números. Para la salida, devuelva un objeto que contenga los pares clave: valor para la distance y el pair (es decir, el par de dos puntos más cercanos).
getClosestPair es una función.
testString: 'assert(typeof getClosestPair === "function", "getClosestPair is a function.");'
- text: La distancia debe ser la siguiente.
testString: 'assert.equal(getClosestPair(points1).distance, answer1.distance, "Distance should be the following.");'
- text: Los puntos deben ser los siguientes.
testString: 'assert.deepEqual(JSON.parse(JSON.stringify(getClosestPair(points1))).pair, answer1.pair, "Points should be the following.");'
- text: La distancia debe ser la siguiente.
testString: 'assert.equal(getClosestPair(points2).distance, answer2.distance, "Distance should be the following.");'
- text: Los puntos deben ser los siguientes.
testString: 'assert.deepEqual(JSON.parse(JSON.stringify(getClosestPair(points2))).pair, answer2.pair, "Points should be the following.");'
```