¿Cuál es el algoritmo de clasificación menos eficiente?

Bogosort es solo la punta del iceberg. Hagamos un viaje mucho más profundo hacia el abismo.

Peor

es un algoritmo de ordenación pesimista que se garantiza que se complete, suponiendo que el universo no se queme antes de completar el algoritmo; sin embargo, no existe un límite computable para la ineficiencia del algoritmo de clasificación y, por lo tanto, es más pesimista que los otros algoritmos descritos aquí. El algoritmo [math] {\ displaystyle {\ text {worstsort}}} [/ math] se basa en un algoritmo de clasificación incorrecto, [math] {\ displaystyle {\ text {badsort}}} [/ math]. El algoritmo badsort acepta dos parámetros: [math] {\ displaystyle L} [/ math], que es la lista que se va a ordenar, y [math] {\ displaystyle k} [/ math], que es una profundidad de recursión. En el nivel de recursión [math] {\ displaystyle k = 0} [/ math], [math] {\ displaystyle {\ text {badsort}}} [/ math] simplemente usa un algoritmo de ordenación común, como bubbleort, para ordenar su entradas y devolver la lista ordenada. Es decir, [matemáticas] {\ displaystyle {\ text {badsort}} (L, 0) = {\ text {bubblesort}} (L)} [/ math]. Por lo tanto, la complejidad temporal de badsort es [matemática] {\ displaystyle O \ left (n ^ {2} \ right)} [/ math] if [math] {\ displaystyle k = 0} [/ math]. Sin embargo, para cualquier [math] {\ displaystyle k> 0} [/ math], [math] {\ displaystyle {\ text {badsort}} (L, k)} [/ math] genera primero [math] {\ displaystyle P} [/ math], la lista de todas las permutaciones de [math] {\ displaystyle L} [/ math]. Luego, [math] {\ displaystyle {\ text {badsort}}} [/ math] calcula [math] {\ displaystyle {\ text {badsort}} (P, k-1)} [/ math], y devuelve el primer elemento de la ordenada [matemática] {\ displaystyle P} [/ matemática]. Para hacer que [math] {\ displaystyle {\ text {worstsort}}} [/ math] sea realmente pesimista, [math] {\ displaystyle k} [/ math] puede asignarse al valor de una función creciente computable como [math] ] {\ displaystyle f \ colon \ mathbb {N} \ to \ mathbb {N}} [/ math] (por ejemplo, [math] {\ displaystyle f (n) = A (n, n)} [/ math], donde [matemáticas] {\ displaystyle A} [/ matemáticas] es la función de Ackermann). Ergo, para ordenar una lista arbitrariamente mal, ejecutarías [matemáticas] {\ displaystyle {\ text {worstsort}} (L, f) = {\ text {badsort}} (L, f ({\ text {length}} (L)))} [/ math], donde [math] {\ displaystyle {\ text {length}} (L)} [/ math] = número de elementos en [math] {\ displaystyle L} [/ math] . El algoritmo resultante tiene complejidad [matemática] {\ displaystyle \ Omega \ left (\ left (n! ^ {(F (n))} \ right) ^ {2} \ right)} [/ math], donde [math] {\ displaystyle n! ^ {(m)} = (\ dotso ((n!)!)! \ dotso)!} [/ math] = factorial de [math] {\ displaystyle n} [/ math] iterado [math ] {\ displaystyle m} [/ math] veces. Este algoritmo puede hacerse tan ineficiente como lo deseemos eligiendo una función de crecimiento lo suficientemente rápida [matemática] {\ displaystyle f} [/ matemática].

[8]

Citado de Bogosort – Wikipedia

Si bien Sleepsort es increíblemente lindo (vea la respuesta de Vivek Srivastava a ¿Cuál es el algoritmo de clasificación menos eficiente?), Potencialmente fallará (producirá resultados incorrectos) con una gran cantidad de entradas. Mi algoritmo ineficiente favorito (no es mi invención) es:

while (la matriz no está ordenada)
random_shuffle (matriz)

Este algoritmo no tiene límite de tiempo superior para las matrices que contienen más de un valor único, y el tiempo de ejecución esperado es exponencial con el tamaño de la matriz. Es incluso más lento que el tipo de suspensión para muchas matrices (especialmente matrices grandes de números pequeños) y casi seguramente consumirá muchos más recursos informáticos (y energía).

Editar: se señaló útilmente en los comentarios que este algoritmo se llama Bogosort, entre otros nombres. Bogosort – Wikipedia

Recuerdo haber visto un hermoso video en YouTube hace unos años que tiene visualizaciones de varios algoritmos de clasificación. Completo con ruidos que lo hacen sonar como un videojuego de los 80.

Realmente deja en claro cómo cosas como la ordenación rápida, la ordenación por fusión y la ordenación por radix son monstruosamente rápidas. El último en la lista es bogosort, el que se menciona a continuación que genera permutaciones aleatorias de la entrada hasta que ocurre la respuesta correcta.

No es algo que me gustaría ver en producción, pero seguro que es bonito en la visualización. Suena como un calliope.

En realidad, hay una prueba bastante divertida de que no hay límite en lo malo que puede ser un algoritmo de clasificación. Aquí está el documento relevante sobre arXiv: [1406.1077] ¿Cuán ineficiente puede ser un algoritmo de clasificación?

Sin embargo, lo esencial es que no se puede determinar qué tan ineficiente puede llegar a ser un algoritmo de clasificación, porque solo podemos definir un algoritmo de clasificación de forma recursiva y simplemente agregar más llamadas recursivas, haciéndolo cada vez más ineficiente.

Y el premio es para Sleep sort. Sí, lo has escuchado bien. No, no recibirás más detalles sobre este algoritmo de clasificación. Yendo a dormir ahora.

More Interesting

¿Cuáles son los algoritmos y las estructuras de datos que tengo que aprender para competir en Google Code Jam?

Cómo buscar todas las combinaciones posibles en una lista

Cómo ordenar una lista anidada en Python

Cómo calcular el orden de crecimiento para un fragmento de código dado

¿Cuál es el mejor curso de análisis de datos y algoritmos presentado con el lenguaje Python?

En un algoritmo de clasificación de ciencias de la computación, ¿puede lograr un estado ordenado intercambiando continuamente elementos desordenados totalmente al azar, o los elementos fuera de orden deben ser adyacentes en la matriz?

¿Qué algoritmos existen para la reconstrucción de un conjunto de vectores de un diccionario de cardinalidad más pequeña?

¿Cómo funciona LSH, 'hashing local sensible', para calcular el valor de hash?

¿Por qué BFS no puede resolver todos los problemas de ruta más corta de una sola fuente?

¿Hay vida después de un curso de estructuras de datos?

¿Es cierto que si entendemos los algoritmos podemos entender todos los programas difíciles de todos los idiomas?

Cómo aprender estructuras de datos y algoritmos

Cómo almacenar y verificar números primos menores que 10 ^ 12 con el algoritmo sieve ()

Si f (n) es O (g (n)) yf (n) es O (h (n)), entonces cuál de las siguientes afirmaciones debe ser verdadera: f (n) + g (n) es O (h (n)), g (n) + h (n) es O (f (n)), f (n) es O (g (n) + h (n)), o ninguno de los anteriores?

¿Cuál es su proceso de pensamiento cuando selecciona y define nuevas variables cuando escribe código?