¿Cuáles son los algoritmos de geometría computacional que aparecen en los concursos de programación? ¿Cuál de ellos es más frecuente que los demás? ¿Qué estructuras de datos geométricos aparecen en los concursos de programación?

De ninguna manera es una lista completa, y tampoco es una clasificación verdaderamente correcta o completa. Solo trataré de mencionar un montón de problemas que tienden a ocurrir, y los incluiré en algunas categorías para que sea más legible.


Primero, casi todos los problemas de geometría en los concursos de programación son sobre geometría euclidiana bidimensional. Los problemas tridimensionales (o más) son raros. Parte de la razón es su dificultad: tienden a ser fáciles (y solo hay algunos de esos), o casi imposiblemente difíciles.

Otra razón es la maldición de la dimensionalidad: para los datos de muchas dimensiones, a menudo la mejor solución es la fuerza bruta. Esto se debe a que la complejidad temporal de un algoritmo a menudo crece rápidamente con el número de dimensiones. Ejemplo: para algunos problemas en los que la entrada es un conjunto de [matemática] n [/ matemática] puntos en [matemática] d [/ matemática] -dimensional hay algoritmos con complejidades temporales como [matemática] O (n2 ^ d) [ / math] o [math] O (n \ log ^ dn) [/ math]. En los concursos de programación, generalmente hay que usar conjuntos de datos de entrada que se pueden resolver en unos segundos. Y cualquier cosa que el algoritmo eficiente pueda resolver en unos segundos también puede resolverse mediante una solución directa [matemática] O (n ^ 2) [/ matemática] o [matemática] O (n ^ 2d) [/ matemática] que intenta rápidamente todo posibilidades El algoritmo asintóticamente mejor (en términos de [matemática] n [/ matemática]) solo se vuelve mejor para valores imprácticamente grandes de [matemática] n [/ matemática].

Dentro de la geometría 2D, existe una clase popular de problemas que se puede resolver exactamente: las entradas son puntos y estructuras lineales (como segmentos, líneas, cuadrados, etc.), las coordenadas de todos los puntos son enteros y la pregunta que se nos permite hacer todos los cálculos en enteros. Para tales problemas, esta suele ser una buena idea, ya que evita problemas de precisión. Ejemplos notables:

  • conceptos básicos de ubicación relativa, como la colinealidad / dirección de rotación para puntos y vectores
  • casco convexo y su doble: la envoltura de líneas superior / inferior
  • muchos algoritmos de barrido, por ejemplo, área y perímetro de la unión de ejes-rectángulos paralelos
  • Algoritmos elementales relacionados con polígonos: pruebas de punto en polígono (ya sea una vez, o preprocesamiento + muchas consultas), área de polígono, triangulación de polígono

Además, a veces podemos calcular todo exactamente, y solo usamos números de punto flotante al final para calcular el resultado:

  • centro de masa de un polígono
  • varias distancias de objetos lineales: punto-punto, punto-línea, punto-segmento, segmento-segmento, par más cercano entre n puntos, distancia entre dos polígonos
    (Tenga en cuenta que si todos los puntos tienen coordenadas enteras, los cuadrados de sus distancias son todos enteros).

En otros problemas aún podemos calcular todo exactamente, pero ya tenemos que lidiar con números racionales. Para estos problemas, a menudo es más fácil usar números de punto flotante en sus cálculos e incluir medidas apropiadas para lidiar con imprecisiones numéricas. Ejemplos:

  • Intersecciones de objetos lineales: dos líneas, dos segmentos de línea, n segmentos de línea, dos polígonos convexos, polígonos generales, etc.

El objeto no lineal más común que aparece en los problemas del concurso de programación es el círculo. Los puntos definidos usando círculos no tienen que tener coordenadas racionales, por lo que, por lo general, la única forma razonable de resolver tales problemas es usar variables de punto flotante y tratar los errores de redondeo. (Técnicamente, las coordenadas son a menudo números algebraicos y a veces es posible hacer el cálculo exactamente representándolos usando sus polinomios mínimos, pero esto es demasiado doloroso y tedioso para hacer en un concurso. Simplemente ignore la oración anterior 🙂)
Ejemplos:

  • intersecciones círculo-línea y círculo-círculo
  • tangentes de punto y círculo y círculo y círculo
  • áreas de sectores circulares y segmentos circulares y objetos más complicados que se pueden componer usando esos: área de intersección para un círculo y un objeto lineal; También área de intersección para dos círculos
  • Una excepción notable: la longitud convexa del casco para n círculos idénticos se puede calcular sorprendentemente fácilmente 🙂

Luego está el conjunto de tareas relacionadas con la localidad que son bastante difíciles de implementar de manera eficiente, y todas más o menos equivalentes: diagrama de Voronoi, triangulación de Delaunay, árbol de expansión mínima euclidiana, vecino más cercano para cada uno de los n puntos dados, etc. .

Y muchos otros temas. El libro de de Berg et al. es una de las referencias de geometría computacional estándar. Consulte su tabla de contenido para obtener más información: Geometría computacional, Algoritmos y Aplicaciones

La pregunta también se refiere a las estructuras de datos. Personalmente, no creo que alguna vez haya usado algo demasiado elegante en un concurso, solo su BST equilibrado estándar para almacenar cosas a las que necesita acceder rápidamente, por ejemplo, eventos y / o estado de línea de barrido durante el barrido.

Aquí hay una lista de problemas que vi en los concursos de programación (esto se traduce de comunitate informatica, concursuri de programare Training path):

  • Intersección de 2 segmentos
  • 2 puntos más cercanos en el avión
  • triángulo perimetral más pequeño de un conjunto de n puntos
  • punto en el problema de polígono O (n) consulta / O (n ^ 2) procesamiento O (log n) consulta
  • punto en polígono convexo, punto en polígono en forma de estrella O (log n) consulta
  • Teorema de Pick
  • área poligonal
  • centro de gravedad poligonal
  • triangulación de polígono en O (n ^ 2)
  • Intersección de 2 círculos
  • círculo de cierre mínimo
  • casco convexo
  • pelado de cebolla
  • pinzas giratorias
  • intersección poligonal convexa
  • barrido vertical de línea radial
  • intersección de medio plano

Algunos conceptos comunes que necesita saber con respecto a la Geometría Computacional son

  1. Producto cruzado
  2. Producto de punto
  3. CCW (función en sentido antihorario)
  4. Línea
  5. Segmento

Este artículo (Geometría computacional – I por Arjit Srivastava) cubre todos estos conceptos, de ninguna manera es un artículo completo, pero lo ayudará a comprender los conceptos básicos.

Esta fuente cubre casi todos los temas de geometría necesarios para la programación de concursos.
Algoritmos de geometría TOC

Debe haber muchos, aquí hay algunos que recuerdo.

1. Problema de par más cercano en la lista de puntos dada en el plano.
2. Encuentra si apunta dentro del polígono.
3. Compruebe si dos polígonos se cruzan.
4. Encuentra no. de puntos colineales en un conjunto de puntos.
5. Fórmula Euler.

Intersección de líneas, puntos colineales, casco convexo.

More Interesting

¿Cuál es la mejor manera de ingresar al último proceso de aprendizaje de algoritmos de reconocimiento facial?

¿Cuál es la ecuación general para calcular la probabilidad de encontrar una cadena de longitud N en una cadena M más larga de caracteres aleatorios, cada uno elegido de {AZ}?

¿Algún algoritmo de aprendizaje profundo quedará obsoleto algún día con los algoritmos tradicionales? ¿O los algoritmos de aprendizaje profundo solo son adecuados para problemas específicos?

¿Cuáles son las opciones de carrera en ingeniería informática?

¿Qué tipo de algoritmo utiliza Google para clasificar los correos?

¿Se utiliza el algoritmo VWAP (precio promedio ponderado por volumen) en HFT?

¿Cómo clasifica Quora las preguntas? ¿Qué algoritmos usan?

Si U = {todos los enteros positivos menores o iguales a 30} y N = {todos los números impares menores o iguales a 19}, ¿qué es N 'y n (N')?

Cómo implementar un algoritmo de programación de disco C-SCAN para encontrar su tiempo de búsqueda

¿Cuáles son los mejores libros para aprender el comercio algorítmico con Python?

Cómo resolver este problema de matrices en programación en C

¿Por qué no todos simplemente compran algoritmos comerciales y se enriquecen con ellos?

¿Qué algoritmo usa Google Knowledge Graph? ¿Con qué precisión funciona?

Cómo mejorar mi solución Java para el problema 'nodo de hoja izquierda más profundo en un árbol binario'

¿Qué es lo más importante para las empresas de software: código abierto, proyectos extracurriculares o habilidades algorítmicas (habilidades de programación competitiva)?