¿Cuál sería un algoritmo eficiente para ordenar millones de líneas de cadenas / enteros en un archivo?

Esta no es una respuesta simple. Los enteros suelen ser de tamaño fijo, es decir, se representan con 32 o 64 bits. En este caso, Radix Sort sería el algoritmo de elección si la clasificación se realiza en la memoria. Consulte el efecto de la ordenación local en los algoritmos de ordenación paralela para obtener un análisis detallado sobre esto para los uniprocesadores y la ordenación rápida paralela en memoria de 64 bits para el uso paralelo de la ordenación por radix. Si el conjunto de datos no cabe en la memoria, debe confiar en la ordenación de combinación, utilizando un algoritmo para cada ejecución. En este caso, desea crear las ejecuciones más grandes posibles utilizando la selección Reemplazo o ejecuciones de tamaño fijo utilizando la clasificación Radix como antes. Consulte Selección de reemplazo bidireccional para un análisis detallado de la selección de reemplazo para ordenar las ejecuciones.

Cuando recurre a las cadenas, el gran problema es que son de tamaño variable, por lo que la alineación juega un papel importante. En cualquier caso, debe comenzar a ordenar por los caracteres más significativos de las palabras (de izquierda a derecha), ya que llevan la información del pedido. Por ejemplo, “bandera” e “independencia” primero deben ordenarse por f e i respectivamente. Por lo tanto, la clasificación se vuelve engorrosa y más compleja que para valores de tamaño fijo. Sin embargo, utilizando algún tipo de clasificación de cubetas, tener en cuenta la distribución estadística de cadenas por cubeta sería una buena estrategia. Luego, cuando los datos caben en la memoria, el uso de la clasificación de radix inversa sería más beneficioso.

Aquí hay algunos puntos de referencia en mi computadora:

·

clasificación rápida (codificada a mano): 79 milisegundos

·

introsort (std :: sort): 71 milisegundos

·

ordenar combinación (std :: stable_sort): 62 milisegundos

·

ordenar por fusión (qsort de glibc) 148 milisegundos, más del doble debido a la sobrecarga del puntero de función

·

base-2828 tipo LSD radix (codificado a mano, código a continuación): 14 milisegundos

·

base-2828 LSD clasificación de radix con un pase inicial de MSD (ver el comentario de Gregory Popovitch): 11 milisegundos

More Interesting

¿Por qué el método de ordenación Javascript organiza los números de una matriz en orden ascendente con [código] (a - b) [/ código] y descendente con [código] (b - a) [/ código]?

¿Hay un problema DP estándar similar a SPOJ Farida?

Cómo escribir un algoritmo para un programa complicado que tiene muchos bucles, conmutadores y otros procesos dentro de una instrucción if-then

¿Qué algoritmos de aprendizaje automático son más adecuados para las entradas 1-hot?

¿Las ventajas del arreglo lineal desaparecen si el arreglo es demasiado corto? ¿Por qué veo 4-6 cajas de cajas?

¿Puedo volverme competente en estructuras de datos y algoritmos sin leer el libro CLRS?

¿Cómo pueden los estudiantes de electricidad y electrónica llegar a ser buenos en algoritmos y estructuras de datos?

¿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 las debilidades del descenso de gradiente?

¿Son suficientes los tutoriales del codificador superior de la estructura de datos y los algoritmos para obtener una base sólida en la programación?

Dado un gráfico ponderado de N nodos, ¿existe un algoritmo que calcule la ruta más corta entre todos los nodos?

¿Cuál es tu problema de programación dinámica favorito?

¿Cuáles son las fuentes que pueden proporcionar múltiples metodologías a partir de un nivel básico para resolver problemas algorítmicos?

¿Cuál es el mejor algoritmo para ordenar una pila de 400 exámenes de algoritmos, si tiene 16 TA?

Tenemos una serie de N palabras, ¿cómo podríamos clasificarlas con O (N) complejidad de tiempo?