Solo quiero seguir el método de Ryan Beltran. Creo que mucha gente en este hilo ya habló sobre la siguiente observación:
- Si 3 puntos no están en una línea, entonces puedes decidir un círculo.
- Una forma de describir un círculo es un centro y un radio, por lo tanto (x, y, r).
Por lo tanto, el esquema de este algoritmo sería:
- Haga una lista de todas las combinaciones posibles de 3 puntos y encuentre todos los círculos potenciales, que requieren O (N ^ 3). Siempre que encontremos un centro, tírelo a un mapa hash, es decir, la clave es un círculo o una tupla 3 (x, y, r), y el valor es un recuento, o cuántos de esos círculos hasta ahora. Dado que la inserción hash toma O (1), este paso lleva totalmente O (N ^ 3).
- Ahora iteramos sobre todo el par clave-valor en el mapa hash, pero lo que enfocamos ahora es el conteo. Pensemos una pregunta: si hay k puntos en el mismo círculo, a través del paso 1, ¿cuántos círculos generan estos k puntos? Sería C (k, 3) = k * (k-1) * (k-2) / 6. Ahora, pensemos al revés: si obtenemos el conteo denotado como D, ¿cómo obtenemos k ? La respuesta corta es (piso ((D * 6) ^ (1/3)) + 2), pero dejaré la carta de prueba. Para cada par clave-valor, el tiempo de procesamiento es constante.
Por lo tanto, la complejidad total sería O (N ^ 3).
Espero poder reducir aún más la complejidad a O (N ^ 2) u O (N ^ 2 logN), pero hasta ahora no tengo ni idea.
- ¿Por qué es interesante el triángulo de Sierpinski?
- ¿Dónde se usa más la geometría diferencial en física teórica, además de GR / astrofísica?
- Cómo encontrar el circuncentro de un triángulo en un espacio tridimensional
- ¿Cómo se divide un círculo en 60 grados? ¿Cómo se determinó esa medida?
- ¿Por qué se considera importante la geometría?
Todos pueden examinar la exactitud de este algoritmo.
–
Probar:
¿Cómo podemos calcular k dado D?
Primero, demostramos que (k-1) ^ 3> k * (k-1) * (k-2) = C (k, 3) * 6 = D * 6> (k-2) ^ 3 dado k> = 1.
Luego llegamos a la conclusión de que k = piso ((D * 6) ^ (1/3)) + 2