Para que tres o más puntos sean colineales, tienen que estar en la línea única definida por cualquiera de estos dos puntos. Esto proporciona un algoritmo inmediato [matemático] O (N ^ 3) [/ matemático]: para todos los pares de dos puntos, encuentre la línea que une estos dos y encuentre todos los demás puntos que también se encuentran en la misma línea. Esto debería generar todos los conjuntos de 3 o más puntos colineales. Mismo algoritmo expresado en pseudocódigo:
all_collinear_points: = conjunto vacío para el punto P1 en todos los puntos: para el punto P2 en todos los puntos además de P1: L: = línea única que une P1 y P2 S: = conjunto vacío para el punto P en todos los puntos: si P está en L: agregue P a S si el tamaño de S es> = 3: agregue S a all_collinear_points print all_collinear_points
Pero podemos ser un poco más inteligentes y hacer esto en [matemáticas] O (N ^ 2 log (N)) [/ matemáticas] en su lugar. Elija un punto y llámelo P0. Digamos que queremos encontrar todos los conjuntos de 3 o más puntos colineales que también incluyen P0. Para todos los demás puntos P, calcule la pendiente de la línea que une P y P0. Ahora tiene una lista de pendientes [matemáticas] N-1 [/ matemáticas]. Si clasificamos esta lista, todos los puntos que tienen la misma pendiente estarían contiguos en la lista ordenada. Cualquier número de puntos que tengan la misma pendiente junto con P0, de hecho, son colineales. Si repetimos el mismo proceso con diferentes puntos elegidos como P0, podríamos enumerar todos los conjuntos de tres o más puntos colineales.
Como puede ver, el paso más costoso es la clasificación de este algoritmo. Pero en realidad no necesitamos establecer un orden total, solo necesitamos encontrar grupos de puntos que tengan la misma pendiente y, por lo tanto, ordenar es una exageración. Si puede reemplazar eso con un mapa de hash [matemático] O (1) [/ matemático], este algoritmo tomaría tiempo [matemático] O (N ^ 2) [/ matemático].
- ¿Cómo se traduce o articula la fórmula matemática que define el conjunto de Mandelbrot y otros fractales como datos de píxeles?
- ¿Puede una resta dar un resultado negativo usando un número sin signo?
- ¿Cómo contar el número de todos los tipos topológicos en un DAG dado? ¿Puedes dar algún ejemplo en este gráfico?
- Cómo calcular la función de rango en Excel
- Cómo encontrar un algoritmo para encontrar tanto el mínimo como el máximo de n números usando menos de 3n / 2 comparaciones