Me he encontrado con muchos algoritmos de clasificación durante mis estudios de secundaria. Sin embargo, nunca sé cuál es el más rápido (para una matriz aleatoria de enteros). Entonces mis preguntas son:
- ¿Cuál es el algoritmo de clasificación más rápido conocido actualmente?
- Teóricamente, ¿es posible que haya incluso más rápidos? Entonces, ¿cuál es la menor complejidad para la clasificación?
Respuestas:
En términos generales, existen los algoritmos de ordenación , como la ordenación por inserción, la ordenación por burbujas y la ordenación por selección, que normalmente debe usar solo en circunstancias especiales; Quicksort, que es el peor de los casos pero con bastante frecuencia con buenas constantes y propiedades y que puede usarse como un procedimiento de clasificación de propósito general; los algoritmos , como merge-sort y heap-sort, que también son buenos algoritmos de clasificación de propósito general; y los algoritmos de clasificación , o lineales, para listas de enteros, como radix, cubetas y tipos de conteo, que pueden ser adecuados dependiendo de la naturaleza de los enteros en sus listas.O ( n 2 ) O ( n log n ) O ( n log n ) O ( n )O ( n2) O ( n2) O ( n logn ) O ( n logn ) O ( n )
Si los elementos en su lista son tales que todo lo que sabe sobre ellos es la relación de orden total entre ellos, entonces los algoritmos de clasificación óptimos tendrán complejidad . Este es un resultado bastante bueno y uno para el que debería poder encontrar fácilmente los detalles en línea. Los algoritmos de ordenación lineal explotan más información sobre la estructura de los elementos que se ordenarán, en lugar de solo la relación de orden total entre los elementos.Ω ( n logn )
Aún más en general, la optimización de un algoritmo de clasificación depende íntimamente de los supuestos que puede hacer sobre el tipo de listas que va a ordenar (así como el modelo de máquina en el que se ejecutará el algoritmo, lo que puede hacer una clasificación deficiente) los algoritmos son la mejor opción; considere la posibilidad de clasificar burbujas en máquinas con una cinta para almacenamiento). Cuanto más fuertes sean sus suposiciones, más esquinas podrá cortar su algoritmo. Bajo suposiciones muy débiles acerca de cuán eficientemente puede determinar la "clasificación" de una lista, la complejidad óptima en el peor de los casos puede ser incluso .Ω ( n ! )
Esta respuesta solo trata las complejidades. Los tiempos de ejecución reales de las implementaciones de algoritmos dependerán de una gran cantidad de factores que son difíciles de explicar en una sola respuesta.
fuente
La respuesta, como suele ser el caso para tales preguntas, es "depende". Depende de cosas como (a) qué tan grandes son los enteros, (b) si la matriz de entrada contiene enteros en un orden aleatorio o en un orden casi ordenado, (c) si necesita que el algoritmo de ordenación sea estable o no, así como otros factores, (d) si la lista completa de números cabe en la memoria (clasificación en memoria frente a clasificación externa), y (e) la máquina en la que lo ejecuta.
En la práctica, el algoritmo de clasificación en la biblioteca estándar de su idioma probablemente será bastante bueno (bastante cercano al óptimo), si necesita una clasificación en memoria. Por lo tanto, en la práctica, simplemente use la función de ordenación proporcionada por la biblioteca estándar y mida el tiempo de ejecución. Solo si encuentra que (i) la clasificación es una gran fracción del tiempo de ejecución general, y (ii) el tiempo de ejecución es inaceptable, debería molestarse en perder el tiempo con el algoritmo de clasificación. Si estas dos condiciones hacen bodega, a continuación, se puede ver en los aspectos específicos de su dominio y experimento en particular con otros algoritmos de ordenación rápida.
Pero de manera realista, en la práctica, el algoritmo de clasificación rara vez es un gran cuello de botella en el rendimiento.
fuente
Además, respondiendo tu segunda pregunta
Para la clasificación de propósito general, la complejidad del problema de clasificación basada en la comparación es Ω (n log n) . Hay algunos algoritmos que realizan la clasificación en O (n), pero todos se basan en hacer suposiciones sobre la entrada y no son algoritmos de clasificación de propósito general.
Básicamente, la complejidad está dada por el número mínimo de comparaciones necesarias para ordenar la matriz (log n representa la altura máxima de un árbol de decisión binario construido al comparar cada elemento de la matriz).
Puede encontrar la prueba formal para ordenar la complejidad del límite inferior aquí :
fuente
El algoritmo de clasificación de enteros más rápido en términos del peor de los casos que he encontrado es el de Andersson et al. Tiene el peor de los casos de , que por supuesto es más rápido que O ( n log n ) .O ( n logIniciar sesiónn ) O ( n logn )
fuente
Leí las otras dos respuestas al momento de escribir esto y no pensé que ninguna respondiera su pregunta de manera apropiada. Otras respuestas consideraron ideas extrañas sobre distribuciones aleatorias y complejidad espacial que probablemente están fuera del alcance de los estudios de secundaria. Así que aquí está mi opinión.
fuente
fuente
fuente
Como no menciona ninguna restricción en el hardware y dado que está buscando "el más rápido", diría que debe elegir uno de los algoritmos de clasificación paralela en función del hardware disponible y el tipo de entrada que tiene.
En teoría, por ejemplo,
quick_sort
esO(n log n)
. Con losp
procesadores, idealmente esto debería reducirseO(n/p log n)
si lo ejecutamos en paralelo.Para citar Wikipedia: la complejidad del tiempo de ...
En la práctica, para tamaños de entrada masivos sería imposible de lograr
O(log n)
debido a problemas de escalabilidad.Aquí está el pseudocódigo para ordenar en paralelo . La implementación de
merge()
puede ser la misma que en el tipo de fusión normal:Ver también:
fuente