¿Cuál es la mejor manera de ordenar un terabyte de matriz de datos, cuando tiene RAM limitada (500k), y cada elemento de la matriz tiene un par de elementos de datos, de aproximadamente 1-10k cada uno?

Ordenar algoritmo

Paso 1. Clasifique 50 (*) elementos a la vez (es decir, clasifique los elementos 1-50, luego 51-100, y así sucesivamente). Me referiré a cada uno de estos segmentos ordenados como bloques.
Paso 2. Haz una fusión k-way de los primeros 50 bloques en un bloque grande. Si hay más bloques más allá de los primeros 50, repita esto para los bloques 51-100, 101-150, y así sucesivamente; de lo contrario, hemos terminado.
Paso 3. Repita el paso 2.

algoritmo de fusión k-way

Paso 1. Elija el elemento mínimo de cada bloque ordenado y agregue un par que contenga el elemento y un índice que identifique de qué bloque proviene a un montón mínimo.
Paso 2. Explota el montón. El elemento debe estar en su orden final ordenado, para que podamos escribirlo en el disco. Use el índice para elegir un bloque y empuje el siguiente elemento en ese bloque al montón. De esta manera, mantenemos la invariante de que el siguiente elemento emergente es el mínimo global que aún no hemos verificado.
Paso 3. Repita el paso 2 hasta que el montón esté vacío.

* Probablemente sería más seguro hacer 40 elementos / bloques a la vez, por lo que permitimos un poco de memoria extra para cosas menores como variables que ocupan un poco de espacio extra.

Desearía utilizar alguna versión de un algoritmo de ordenación externo, como la ordenación de fusión externa. Los parámetros exactos para ajustarlo dependen en gran medida de los parámetros físicos de su memoria principal y disco.

Una optimización particular que podría hacer con gran efecto sería, en cambio, ordenar los punteros a los datos donde cada puntero almacena adicionalmente algunos de los bytes más significativos del elemento. (Cuando esos bytes no son suficientes para distinguir elementos, deberá seguir los punteros a los elementos mismos). Esta optimización le permite almacenar muchos más elementos en la memoria principal a la vez, por lo que se necesitan menos pases para ordenarlos.

More Interesting

¿Qué nivel de estadísticas y algoritmos necesito saber para ser bueno en el aprendizaje automático de estadísticas?

¿Cuál sería su selección de 20 problemas en algoritmos de clasificación (6 problemas de nivel básico, 6 problemas de nivel medio y 8 difíciles) para que resolver esos 20 le daría la máxima comprensión sobre la clasificación?

¿El uso de algoritmos en una clave de contraseña típica de 256 bits que siempre está cambiando pero que aún se muestra al usuario (como en un teléfono, por ejemplo) para crear código requeriría supercomputadoras más rápidas disponibles para superarlo?

¿Hay alguna aplicación práctica de algoritmos que calculen los equilibrios de Nash?

¿Existe un mejor patrón para aprender algoritmos de programación?

¿Qué es un código de clasificación?

¿Cómo están sucediendo los campos de entrenamiento de algoritmos?

¿Podemos implementar un algoritmo genético sin usar mutación?

¿Cuáles son las mejores prácticas para implementar la paginación en un sitio web con una gran cantidad de datos?

¿Qué es un algoritmo de descubrimiento de ruta de ataque cibernético?

Cómo calcular (n!) Mod p y nCr mod m, como se requiere en varias preguntas algorítmicas

¿Cuál es el mejor algoritmo de eliminación para un árbol de búsqueda binario sin usar un nodo padre adicional?

Suponiendo que todos estos algoritmos resuelven el mismo tipo de problema, ¿cuál se recomienda? ¿Y por qué?

¿HackerRank es un buen entrenamiento para el IOI?

¿Cuáles son las situaciones en las que uno puede usar ArrayList y otras situaciones para usar solo LinkedList?