Cómo ordenar la lista de números dada en orden de registro (n)

Vea la respuesta de Pritam Kumar Paul para la prueba de por qué cualquier algoritmo de clasificación basado en comparación nunca puede ordenar una lista de números en menos de O (n log n).

Sin embargo, la clasificación en O (n log n) es posible con algunos algoritmos como la clasificación por radix [1] , la clasificación por recuento [2] y otros algoritmos de clasificación no basados ​​en comparación [3] que solo tomarían un tiempo lineal, es decir, O (n) para ordenar una lista de n números.

¿Significa esto que la prueba es incorrecta? ¡Definitivamente no! Los algoritmos no basados ​​en comparación solo aprovechan las estructuras y operaciones de datos más “poderosas” (que pueden depender también de la naturaleza de los datos de entrada) que las simples comparaciones. Es posible que estos algoritmos no sean prácticos para todo tipo de datos, pero cuando solo ordena listas de números simples, tiene algunas buenas opciones.

¿Pero podemos ir incluso más bajo que O (n)? No se conocen algoritmos de clasificación de propósito general que tengan complejidad sub-lineal . Por propósito general , quiero decir que deberían poder ordenar cualquier tipo de lista, sin ninguna suposición sobre el orden existente (como ordenar una lista “casi ordenada”), etc.

Una forma intuitiva de explicar este límite sería que, en el caso general, cualquier algoritmo de clasificación necesitaría al menos examinar todos los elementos de la lista, lo que a su vez resultaría en una complejidad O (n).

Por otro lado, se podría hacer un argumento similar en el sentido de que la búsqueda lineal (con complejidad O (n)) es óptima para buscar en una lista general desordenada.

[1] Clasificación de radix, estructuras de datos y algoritmos: clasificación de radix

[2] Tipo de conteo

[3] Algoritmos de clasificación no comparativos

Un algoritmo de ordenación se basa en la comparación si usa operadores de comparación para encontrar el orden entre dos números. Los tipos de comparación se pueden ver de manera abstracta en términos de árboles de decisión. Un árbol de decisión es un árbol binario completo que representa las comparaciones entre elementos que realiza un algoritmo de ordenación particular que opera en una entrada de un tamaño determinado. La ejecución del algoritmo de ordenamiento corresponde al trazado de una ruta desde la raíz del árbol de decisión a una hoja. En cada nodo interno, se realiza una comparación ai <= aj . El subárbol izquierdo dicta las comparaciones posteriores para ai <= aj , y el subárbol derecho dicta las comparaciones posteriores para ai > aj . Cuando llegamos a una hoja, el algoritmo de clasificación ha establecido el orden. Entonces podemos decir lo siguiente sobre el árbol de decisión.

1) Cada una de las n ! las permutaciones en n elementos deben aparecer como una de las hojas del árbol de decisión para que el algoritmo de clasificación se clasifique correctamente.

2) Sea x el número máximo de comparaciones en un algoritmo de clasificación. La altura máxima del árbol de decisión sería x. Un árbol con altura máxima x tiene como máximo 2 ^ x hojas.

Después de combinar los dos hechos anteriores, obtenemos la siguiente relación.

[matemáticas] n! \ le 2 ^ x [/ matemáticas]

[matemáticas] \ text {Tomando el registro a la base 2 en ambos lados} [/ matemáticas]

[matemáticas] \ log [2] {n!} \ le x [/ matemáticas]

[math] \ text {Since} \ log [2] {n!} = \ Theta (n \ log [2] {n}), \ text {podemos decir que} [/ math]

[matemáticas] x = \ Omega (n \ log [2] {n}) [/ matemáticas]

Por lo tanto, cualquier algoritmo de ordenación basado en la comparación debe hacer al menos nLog2n comparaciones para ordenar la matriz de entrada, y Heapsort y merge sort son clasificaciones de comparación asintóticamente óptimas.

Moraleja de la historia: no puede ordenar una lista de números en log n.

No puede ordenar una lista de números en orden menor que O (nlog n), prueba de lo cual se proporciona en la respuesta de Pritam Kumar Paul a la pregunta.

no puede utilizar un algoritmo de ordenación basado en la comparación, como quicksort o mergesort, ya que sus tiempos de ejecución son del orden de [math] Big-Theta (n * log (n)) [/ math]

Puede usar (clasificación de Radix – Wikipedia) para hacerlo mejor.

Pero, no creo que haya un método general para ordenar mejor que Big-Theta (n) porque, se necesita al menos 1 paso a través de toda la entrada para conocer la entrada; haciendo el algoritmo [matemática] Big-Theta (n) [/ matemática].

¡Me impresionaría si existiera un algoritmo de clasificación de este tipo y definitivamente me gustaría saberlo!

More Interesting

¿Cómo explicaría el Control de concurrencia de versiones múltiples en términos simples?

¿Cuándo puede el paralelismo hacer que sus algoritmos se ejecuten más rápido? ¿Cuándo podría hacer que sus algoritmos funcionen más lentamente?

Lo que algunos deben saber son punteros para la optimización del código fundamental en Java

¿Cuál es un ejemplo de un buen algoritmo que se puede usar para unir a diferentes usuarios dentro de un determinado radio en cualquier ubicación según sus preferencias?

¿Cuál es la diferencia entre la descomposición de raíz cuadrada y el algoritmo de MO?

¿Podemos implementar una estructura de datos de pila usando una estructura de datos de cola?

Cómo encontrar la ruta más corta en un gráfico no ponderado en lenguaje C

¿Cuál es el mejor algoritmo de compresión de imágenes y cuál es el algoritmo de compresión de Facebook?

¿Por qué no necesito conocer algoritmos para lenguajes de programación modernos como Java o Python?

¿Qué es mejor para eliminar números específicos de una matriz, Java o C ++?

¿Cómo puedo encontrar la ruta más larga de un gráfico bidireccional utilizando el algoritmo BFS?

Cómo mantener una matriz, admitir inserción y asignación aleatorias, y consultar el kth elemento más grande en un intervalo dado

¿Cuáles son las aplicaciones de la lista de enlaces simple, doble, circular y de encabezado en la estructura de datos?

Cómo garantizar un resultado devuelto de la función que llamamos (en sí mismo) es correcto en la recursividad

¿Cuál era el objetivo de Pedro Domingos al escribir 'El algoritmo maestro'?