¿Cuál es el algoritmo de clasificación más rápido para una matriz de números grandes (hasta 1,000,000,000,000)?

Estos no son números técnicamente grandes (<1e12) porque caben fácilmente en un entero largo, que tiene 64 bits de largo.

Al ordenar objetos que provienen de un dominio limitado y discreto, los algoritmos basados ​​en la comparación, como Quick, Merge o Heap sort, se quedan cortos con los algoritmos que aprovechan el hecho de que sus datos provienen de un conjunto limitado de valores para su ventaja.

Para los enteros, la respuesta típica que encontrará en casi cualquier recurso que se ocupe de la ordenación de enteros es usar la ordenación Radix. En pocas palabras, y específicamente para los enteros de 64 bits: los trataría como números de 4 dígitos, donde cada “dígito” es un número de 16 bits, luego se ordenaría en función de cada dígito usando el orden de conteo.

La idea detrás del ordenamiento de conteo es simple: si sabe que todos sus elementos provienen de un pequeño conjunto de valores (como enteros delimitados), simplemente puede asignar un contador para cada uno de los valores, recorrer la matriz, incrementar los contadores de los valores que encuentre, luego vacíe los valores repitiéndolos tantas veces como hayan aparecido. El algoritmo se ejecuta en tiempo lineal.

En la clasificación de Radix, clasifica su matriz en función de los valores de los dígitos de sus números, desde el menos significativo hasta el más significativo. Los dígitos pueden ser dígitos decimales, de hecho, pero como estamos usando una computadora, tiene más sentido tratar nuestros números como si estuvieran representados en algún otro sistema numérico. Dado que la ordenación de conteo requiere memoria adicional que es proporcional al número de valores que puede tener el dígito de Radix, equilibramos la velocidad de ejecución y nos conformamos con un dígito de 16 bits. Esto requeriría 65536 * sizeof (int) = 256 KB de memoria adicional para los recuentos. Si desea tener poca memoria, puede conformarse con un dígito de 8 bits.

Recuerdo haber visto una respuesta interesante a una pregunta muy similar, que también presenta la respuesta de Obama y algo de codificación inteligente: la respuesta de Anders Kaseorg a ¿Cuál es la forma más eficiente de clasificar un millón de enteros de 32 bits?

Orso, estás confundiendo una gran variedad de números grandes con una gran variedad de números. El OP pregunta por lo primero. MergeSort sería bueno para este último cuando la matriz es demasiado grande para caber en la memoria. Pero, en cualquier caso, la pregunta planteada es irrelevante. No importa si los números son grandes; Todos los algoritmos de clasificación pagarán el mismo costo de comparación para números grandes.

Con respecto a su declaración sobre QuickSort, sí, es cierto que su peor tiempo de ejecución teórico es O (n ^ 2). Pero lo que importa es el tiempo de ejecución promedio , que estoy seguro de que sabe que es O ( n log n ) para QuickSort. Y en la práctica, no encontrará ninguna instancia en la que un QuickSort optimizado no sea más rápido que MergeSort (o cualquier otro algoritmo de clasificación) para la clasificación en memoria.

Tome el dígito más significativo (MSD) de cada elemento.

  • haga una matriz para ese dígito y ponga todos los elementos que comiencen con ese dígito en esa matriz y para los 10 dígitos si están todos presentes.
  • para cada una de las 10 matrices, haga lo mismo según el segundo MSD en una llamada recursiva.
  • Cuando todo esté hecho, concatene todas las matrices en una gran matriz ordenada.

Otra forma, para números binarios.

  • Haga otra matriz vacía del mismo tamaño que la primera.
  • mover todos los valores de MSB 1 a la segunda matriz
  • mover todos los valores MSB 0 hasta el comienzo de la matriz
  • mueva todos los valores MSB1 nuevamente a la matriz original después de todos los 0 msb.
  • Ahora tome todos los elementos MSB0 y mueva los que tienen
    2nd MSB 1 a la segunda matriz, desplazar los MSB 0s hacia arriba y mover los otros hacia atrás.
  • haga esto de forma recursiva para todo el grupo MSB 0
  • luego haga recursivamente la parte MSB 1.

Sin embargo, la clasificación es solo la mitad de la batalla. Muchos algoritmos dependen de mantener un contenedor ordenado ordenado y pasan la mayor parte de su tiempo de procesamiento haciendo eso.
Las matrices son una muy mala idea para ese tipo de tareas: las listas y los árboles vinculados son mucho mejores para mantenerse ordenados a través de muchas inserciones y eliminaciones.
¿Puedes ver cómo 2 conjuntos de listas vinculadas serían más rápidos que dos matrices para el método anterior? Podrías evitar toda esa copia de datos en los turnos y ahorrar memoria al no tener un montón de ubicaciones de memoria vacías.

Los algoritmos tienen diferentes complejidades de tiempo dependiendo del tipo de entrada. Por ejemplo, la ordenación por fusión suele ser muy rápida, pero si la matriz se invierte exactamente, en la práctica la ordenación en montón se ejecutará más rápido. Este gif: ordenar algoritmos muestra un poco más de lo que quiero decir. En la mayoría de los casos, no importa tanto lo que está contenido en la matriz, sino cómo se ordenó originalmente.

More Interesting

¿El aprendizaje por refuerzo está recibiendo actualmente más atención que los algoritmos genéticos?

¿Existe un algoritmo rápido que, dada una cuadrícula de números, encuentre todas las rutas posibles que sumen a un número dado?

Cómo elegir el mejor algoritmo de aprendizaje profundo o paquete R para un conjunto de datos

¿Cómo se puede ser bueno para resolver problemas de algoritmos / programación? Soy un principiante, y me sugirieron que leyera el libro CLRS para aprender sobre algoritmos.

¿Cuál es la forma más fácil de animar el algoritmo de Dijkstra para Power Point Presentation?

¿Qué tan útil es el conocimiento de los algoritmos informáticos tradicionales para escribir códigos CFD?

¿Obtuviste un trabajo de ingeniería de software al aprender algoritmos a través de MOOC?

¿Cuáles son los conceptos básicos de cifrado y criptografía?

¿Cuál es la mejor manera de entender la recursividad, especialmente en los árboles?

¿Cuál es el mejor algoritmo de detección de colisión de vehículos?

¿Qué esfuerzos hará para crear un gráfico de la estructura de datos básicos, que también puede ser entendido por una persona no técnica?

¿Cuáles son algunos algoritmos utilizados por las grandes empresas (como Amazon) para determinar de manera eficiente desde qué almacén se debe cumplir un pedido?

Ahora he leído sobre algoritmos y estructuras de datos como Al Klein me dijo. ¿Qué lenguaje de programación debo aprender?

¿Cómo se puede implementar un algoritmo de ordenación rápida en el cálculo Lambda?

¿Se conoce algún algoritmo general para factorizar números muy grandes?