Pensemos en los algoritmos [matemática] o (n) [/ matemática] en general. Debe ser obvio desde el principio que tal algoritmo es posible solo si no tiene que leer o examinar todos los datos. De lo contrario, el paso de lectura ya sería [math] \ Omega (n) [/ math]. Para poder calcular algo en un conjunto de datos sin leerlo todo, debe confiar en una propiedad estadística o estructural del mismo. Entonces, por ejemplo, calcular el promedio aproximado de un conjunto de datos grande podría ser [matemática] o (n) [/ matemática] ya que podría leer una muestra aleatoria de los datos para hacerlo.
Dejemos a un lado los métodos estadísticos por ahora y analicemos la estructuración de los datos para permitir cálculos [matemáticos] o (n) [/ matemáticos]. Por ejemplo, sabemos que la búsqueda binaria en un conjunto de datos ordenado es [math] \ mathcal {O} (\ log n) [/ math]. Tenemos que ignorar la clasificación inicial de los datos para llegar a este límite de complejidad.
Entonces, ¿existen algoritmos efectivos, razonables y prácticos que se basen en la estructura de los datos para lograr un límite [matemático] \ matemático {O} (\ sqrt {\ log n}) [/ matemático]? ¡Si! El algoritmo de búsqueda rápida de unión con compresión de ruta le permitirá probar si dos elementos pertenecen al mismo conjunto en [math] \ mathcal {O} (\ log ^ {*} n) [/ math] una vez que haya organizado los datos en camino poco profundo árboles comprimidos. Los detalles de cómo hacer la compresión de ruta se encuentran en el enlace PDF [1] a continuación.
- ¿Cuál es la mejor estructura y algoritmo de datos para encontrar un valor máximo dentro de un subconjunto de una población de datos que satisfaga alguna condición de rango?
- ¿Cuáles son los mejores métodos para el análisis competitivo?
- ¿Es normal tener un título en CS y no ser capaz de implementar algoritmos simples?
- ¿Cómo visualizo el laberinto que estoy creando?
- ¿Qué algoritmo usar para encontrar una ganancia l1 óptima?
Aquí, [math] \ log ^ {*} [/ math] es la función de logaritmo iterado [2], que es [math] o (\ sqrt {\ log n}) = \ mathcal {O} (\ sqrt {\ log n}) [/ math].
Editar: Después de pensar en esto un poco más, encontré un problema con cualquier cosa que sea [matemática] o (\ log n) [/ matemática]. El problema es que si intenta colocar elementos de datos [matemáticos] n [/ matemáticos] en la memoria, entonces los punteros, el índice o lo que necesite para acceder a ellos deben ser de tamaño [matemático] \ Omega (\ log n) [/matemáticas]. El análisis habitual de la búsqueda binaria o este algoritmo de búsqueda de unión supone que cada acceso a la memoria es [matemática] O (1) [/ matemática], pero desde un punto de vista de la teoría de la complejidad pura, debe considerarse [matemática] \ Omega (\ log n) [/ math] si involucra indirección a través de un índice o puntero. Por lo tanto, la búsqueda binaria es realmente [math] \ mathcal {O} (\ log ^ {2} n) [/ math] y la parte find de union-find es realmente [math] \ mathcal {O} (\ log ^ { *} n \ log n) [/ math].
Notas al pie
[1] https://www.cs.princeton.edu/~rs…
[2] Logaritmo iterado – Wikipedia