Aplicaciones prácticas de clasificación de radix

20

La clasificación por radix es teóricamente muy rápida cuando se sabe que las claves están en un cierto rango limitado, digamos valores en el rango por ejemplo. Si simplemente convierte los valores a base que lleva tiempo , realice una clasificación de base radix y luego vuelva a convertir a su base original para obtener un algoritmo global .[ 0 n k - 1 ] k < lg n n Θ ( n ) n Θ ( n k )norte[0 0...nortek-1]k<lgnortenorteΘ(norte)norteΘ(nortek)

Sin embargo, he leído que, en la práctica, la ordenación de radix suele ser mucho más lenta que hacer, por ejemplo, un ordenamiento rápido aleatorio :

Para matrices grandes, la clasificación de radix tiene el recuento de instrucciones más bajo, pero debido a su rendimiento de caché relativamente pobre, su rendimiento general es peor que las versiones optimizadas de memoria de mergesort y quicksort.

¿Radix sort es solo un buen algoritmo teórico o tiene usos prácticos comunes?

Robert S. Barnes
fuente

Respuestas:

15

Los tipos de radix son a menudo, en la práctica, los tipos más rápidos y útiles en máquinas paralelas.

En cada nodo del multiprocesador, probablemente haga algo como una clasificación rápida, pero la clasificación por radix permite que varios nodos trabajen juntos con menos sincronización que los diversos tipos recursivos.

También hay otras situaciones. Si necesita una ordenación estable (una ordenación en la que cada vez que dos teclas son iguales permanecen en el mismo orden en lugar de reorganizarse), entonces no conozco ninguna versión de quicksort que sea útil. Mergesort también es estable (si se implementa correctamente). Su enlace es la primera vez que escucho a alguien decir que mergesort podría tener un mejor comportamiento de caché que la clasificación por radix.

Lógica Errante
fuente
Patterson y Hennessy hacen el mismo punto que el documento vinculado de Lamarca en su libro, Computer Organization and Design.
Robert S. Barnes
Su mención de Patterson me recordó el importante trabajo que Andrea Arpaci-Dusseau hizo en la clasificación de grupos hace unos 15 años. (Patterson fue coautor). En el artículo de 1997, en realidad decidieron que la ordenación de radix parcial era preferible a la clasificación rápida también en los nodos individuales. (Agregué las referencias a la respuesta).
Wandering Logic
Eso es interesante. En la cuarta edición de 2009 de CompOrg, hacen referencia al trabajo de Lamarca sobre versiones anteriores de Radix sort que no es amigable para la caché (pág. 489), pero luego, en la página 490, en los gráficos que comparan Quicksort y Radix sort dicen: "Debido a tales resultados, nuevas versiones de Se han inventado los tipos de Radix que tienen en cuenta la jerarquía de memoria para recuperar sus ventajas algorítmicas ". Tengo curiosidad por saber cómo funcionan estas nuevas versiones de Radix Sort.
Robert S. Barnes
Mi sospecha es que Lamarca acaba de usar un estúpido tipo radix (uno que mantiene sus cubos como listas vinculadas). Nadie lo haría. Implementaría los cubos utilizando algún tipo de matriz dinámica optimizada (por ejemplo, como un C ++ vector). Pero no lo sé, ya que no he leído los periódicos de Lamarca.
Wandering Logic
@WanderingLogic ¿dónde clasifica la raíz usar cubos? ¿Te refieres a una especie de cubo aquí?
Bar
3

@Robert: Su enlace es bastante sorprendente (en realidad no pude encontrar la oración citada). Mi experiencia personal es de entrada aleatoria, la clasificación de radix es mucho más rápida que la STL std::sort(), que utiliza una variante de quicksort. Solía ​​hacer un algoritmo un 50% más rápido reemplazándolo std::sort()por una ordenación de raíz inestable. No estoy seguro de cuál es la "versión con memoria optimizada" de quicksort, pero dudo que pueda ser el doble de rápido que la versión STL.

Esta publicación de blog evaluó la clasificación de radix junto con varios otros algoritmos de clasificación. Brevemente, en esta evaluación, std::sort()toma 5.1 segundos ordenar 50 millones de enteros, mientras que la clasificación de radios in situ / inestable toma 2.0 segundos. La clasificación estable de radix debería ser aún más rápida.

La clasificación por radix también se usa ampliamente para clasificar cadenas de forma estable. A veces se ven variantes de clasificación de radix para construir matrices de sufijos, BWT, etc.

usuario172818
fuente