Samplesort es un algoritmo de ordenación de divide y vencerás que se utiliza frecuentemente en sistemas de procesamiento paralelo. [ 1 ] Los algoritmos convencionales de ordenación de divide y vencerás dividen el array en subintervalos o cubetas. Estas cubetas se ordenan individualmente y luego se concatenan. Sin embargo, si el array no está distribuido uniformemente, el rendimiento de estos algoritmos de ordenación puede verse significativamente afectado. Samplesort resuelve este problema seleccionando una muestra de tamaño s de la secuencia de n elementos y determinando el rango de las cubetas ordenando la muestra y eligiendo p −1 < s elementos del resultado. Estos elementos (llamados divisores) dividen el array en p cubetas de tamaño aproximadamente igual. [ 2 ] Samplesort se describe en el artículo de 1970, "Samplesort: A Sampling Approach to Minimal Storage Tree Sorting", de WD Frazer y AC McKellar. [ 3 ]
Algoritmo
Samplesort es una generalización de Quicksort . Mientras que Quicksort divide su entrada en dos partes en cada paso, basándose en un único valor llamado pivote, Samplesort toma una muestra más grande de su entrada y divide sus datos en grupos según corresponda. Al igual que Quicksort, luego ordena recursivamente los grupos.
Para diseñar una implementación de ordenación por muestras, es necesario decidir el número de cubetas p . Una vez hecho esto, el algoritmo real opera en tres fases: [ 4 ]
- Muestre p −1 elementos de la entrada (los divisores ). Ordénelos; cada par de divisores adyacentes define un cubo .
- Recorre los datos en un bucle, colocando cada elemento en el contenedor correspondiente. (Esto puede significar: enviarlo a un procesador, en un sistema multiprocesador ).
- Clasifica cada uno de los cubos.
El resultado final ordenado es la concatenación de los cubos.
Una estrategia común consiste en establecer p igual al número de procesadores disponibles. Los datos se distribuyen entre los procesadores, que realizan la clasificación de los grupos utilizando algún otro algoritmo de clasificación secuencial.
Pseudocódigo
El siguiente listado muestra el algoritmo de tres pasos mencionado anteriormente como pseudocódigo y muestra cómo funciona el algoritmo en principio. [ 5 ] A continuación, A son los datos sin ordenar, k es el factor de sobremuestreo, que se analizará más adelante, y p es el número de divisores.
función sampleSort(A[1..n], k , p ) // Si el tamaño promedio del cubo está por debajo de un umbral, cambia a, por ejemplo, ordenación rápida Si n / k < umbral , entonces smallSort(A) /* Paso 1 */ seleccionar S = [ S 1 , ..., S ( p −1) k ] aleatoriamente de // seleccionar muestras ordenar S // ordenar muestra [ s 0 , s 1 , ..., s p −1 , s p ] <- [-∞, S k , S 2 k , ..., S ( p −1) k , ∞] // seleccionar divisores /* Paso 2 */ Para cada a en A, encuentra j tal que s j −1 < a <= s j coloca a en el cubo b j /* Paso 3 y concatenación */ return concatenar(sampleSort( b 1 ), ..., sampleSort( b k ))
El pseudocódigo difiere del algoritmo original de Frazer y McKellar. [ 3 ] En el pseudocódigo, se llama a samplesort de forma recursiva. Frazer y McKellar llamaron a samplesort solo una vez y utilizaron quicksort en todas las iteraciones siguientes.
Complejidad
La complejidad, dada en notación Big O , para una implementación paralela conprocesadores:
Encuentra los divisores.
Enviar a los contenedores.
- para leer todos los nodos
- para radiodifusión
- para búsqueda binaria para todas las claves
- enviar claves al bucket
Clasificar los cubos.
- dóndees la complejidad del método de ordenación secuencial subyacente. [ 1 ] A menudo.
El número de comparaciones realizadas por este algoritmo se aproxima al óptimo teórico de la información.para secuencias de entrada grandes. En experimentos realizados por Frazer y McKellar, el algoritmo necesitó un 15 % menos de comparaciones que quicksort.
Muestreo de los datos
Los datos pueden muestrearse mediante diferentes métodos. Algunos de estos métodos incluyen:
- Seleccione muestras espaciadas uniformemente.
- Seleccione muestras al azar.
sobremuestreo
La relación de sobremuestreo determina cuántas veces más elementos de datos se extraen como muestras, antes de determinar los divisores. El objetivo es obtener una buena representación de la distribución de los datos. Si los valores de los datos están ampliamente distribuidos, es decir, no hay muchos valores duplicados, entonces una relación de muestreo pequeña es suficiente. En otros casos donde hay muchos duplicados en la distribución, será necesaria una relación de sobremuestreo mayor. En el caso ideal, después del paso 2, cada cubo contieneelementos. En este caso, ningún cubo tarda más en ordenarse que los demás, porque todos los cubos tienen el mismo tamaño.
Después de tirarveces más muestras de las necesarias, las muestras se clasifican. Posteriormente, los divisores utilizados como límites de cubeta son las muestras en la posiciónde la secuencia de muestras (junto conycomo límites izquierdo y derecho para los cubos más a la izquierda y más a la derecha respectivamente). Esto proporciona una mejor heurística para buenos divisores que simplemente seleccionardivisores aleatoriamente.
Estimación del tamaño del cubo
Con el tamaño de muestra resultante, se puede estimar el tamaño esperado del cubo y, especialmente, la probabilidad de que un cubo supere un cierto tamaño. A continuación se mostrará que para un factor de sobremuestreo dela probabilidad de que ningún cubo tenga más deelementos es mayor que.
Para demostrar esto, dejemos quesea la entrada como una secuencia ordenada. Para que un procesador obtenga más deelementos, debe existir una subsecuencia de la entrada de longitudde las cuales se selecciona un máximo de S muestras. Estos casos constituyen la probabilidadEsto puede representarse como la variable aleatoria:
Para el valor esperado decontiene:
Esto se utilizará para estimar:
Utilizando ahora la cota de Chernoff , se puede demostrar que:
Muchas llaves idénticas
En caso de muchas claves idénticas, el algoritmo pasa por muchos niveles de recursión donde se ordenan las secuencias, porque toda la secuencia consta de claves idénticas. Esto se puede contrarrestar introduciendo cubetas de igualdad. Los elementos iguales a un pivote se ordenan en su respectiva cubeta de igualdad, lo que se puede implementar con solo una rama condicional adicional. Las cubetas de igualdad no se ordenan más. Esto funciona, ya que las claves que aparecen más deEs probable que estos momentos se conviertan en puntos de inflexión.
Usos en sistemas paralelos

Samplesort se usa frecuentemente en sistemas paralelos, incluyendo sistemas distribuidos como máquinas paralelas síncronas masivas . [ 6 ] [ 4 ] [ 7 ] Debido a la cantidad variable de divisores (a diferencia de Quicksort , que solo tiene un pivote ), Samplesort es muy adecuado e intuitivo para la paralelización y la escalabilidad. Además, Samplesort también es más eficiente en el uso de caché que implementaciones de, por ejemplo, Quicksort.
La paralelización se implementa dividiendo la ordenación para cada procesador o nodo, donde el número de cubetas es igual al número de procesadores.El algoritmo Samplesort es eficiente en sistemas paralelos porque cada procesador recibe aproximadamente el mismo tamaño de cubeta.Dado que los cubos se ordenan simultáneamente, los procesadores completarán la ordenación aproximadamente al mismo tiempo, evitando así que un procesador tenga que esperar a los demás.
En los sistemas distribuidos , los divisores se eligen tomandoelementos en cada procesador, ordenando el resultadoelementos con un algoritmo de ordenación distribuida, tomando cada-ésimo elemento y transmitir el resultado a todos los procesadores. Esto cuestapara clasificar elelementos enprocesadores, así como para distribuir eldivisores elegidos paraprocesadores.
Con los divisores resultantes, cada procesador coloca sus propios datos de entrada en depósitos locales. Esto llevacon búsqueda binaria . Posteriormente, los cubos locales se redistribuyen a los procesadores. Procesadorconsigue los cubos localesde todos los demás procesadores y los ordena localmente. La distribución tomatiempo, dondees el tamaño del cubo más grande. La clasificación local toma.
Los experimentos realizados a principios de la década de 1990 en supercomputadoras Connection Machine demostraron que samplesort era particularmente eficaz para ordenar grandes conjuntos de datos en estas máquinas, debido a que genera poca sobrecarga de comunicación entre procesadores. [ 8 ] En las GPU más recientes , el algoritmo puede ser menos eficaz que sus alternativas. [ 9 ]
Implementación eficiente de Samplesort

Como se describió anteriormente, el algoritmo de ordenación por muestreo divide los elementos según los divisores seleccionados. En el artículo "Super Scalar Sample Sort" se propone una estrategia de implementación eficiente. [ 5 ] La implementación propuesta en el artículo utiliza dos matrices de tamaño(el array original que contiene los datos de entrada y uno temporal) para una implementación eficiente. Por lo tanto, esta versión de la implementación no es un algoritmo in situ.
En cada paso de la recursión, los datos se copian al otro array de forma particionada. Si los datos se encuentran en el array temporal en el último paso de la recursión, se copian de nuevo al array original.
Determinación de los cubos
En un algoritmo de ordenación basado en comparaciones, la operación de comparación es la parte más crítica en términos de rendimiento. En Samplesort, esto corresponde a determinar el cubo para cada elemento. Esto requieretiempo para cada elemento.
El algoritmo Super Scalar Sample Sort utiliza un árbol de búsqueda equilibrado que se almacena implícitamente en una matriz t . La raíz se almacena en 0, el sucesor izquierdo dese almacena eny el sucesor correcto se almacena enDado el árbol de búsqueda t , el algoritmo calcula el número de cubeta j del elementode la siguiente manera (suponiendose evalúa como 1 si es verdadero y 0 en caso contrario):
j := 1 repetir log 2 ( p ) veces j := 2 j + ( a > t j ) j := j − p + 1
Dado que el número de cubetas k se conoce en tiempo de compilación, el compilador puede desenrollar este bucle. La operación de comparación se implementa con instrucciones predicadas . Por lo tanto, no se producen predicciones erróneas de bifurcación , lo que ralentizaría significativamente la operación de comparación.
Particionamiento
Para una partición eficiente de los elementos, el algoritmo necesita conocer de antemano el tamaño de los cubos. Para particionar los elementos de la secuencia e insertarlos en el array, necesitamos conocer el tamaño de los cubos con anticipación. Un algoritmo simple podría contar el número de elementos de cada cubo. Luego, los elementos podrían insertarse en el otro array en el lugar correcto. De esta manera, es necesario determinar el cubo para cada elemento dos veces (una vez para contar el número de elementos en un cubo y otra para insertarlos).
Para evitar esta duplicación de comparaciones, Super Scalar Sample Sort utiliza una matriz adicional.(llamado oráculo) que asigna cada índice de los elementos a un cubo. Primero, el algoritmo determina el contenido dedeterminando el cubo para cada elemento y los tamaños de los cubos, y luego colocando los elementos en el cubo determinado por. La matriztambién genera costos de almacenamiento, pero como solo necesita almacenarbits, estos costos son pequeños en comparación con el espacio del arreglo de entrada.
ordenación de muestras in situ
Una desventaja clave de la implementación eficiente de Samplesort mostrada anteriormente es que no es in situ y requiere un segundo arreglo temporal del mismo tamaño que la secuencia de entrada durante la ordenación. Las implementaciones eficientes de, por ejemplo, quicksort son in situ y, por lo tanto, más eficientes en cuanto a espacio. Sin embargo, Samplesort también puede implementarse in situ. [ 10 ]
El algoritmo in situ se divide en cuatro fases:
- Muestreo que es equivalente al muestreo en la implementación eficiente mencionada anteriormente.
- La clasificación local en cada procesador agrupa la entrada en bloques de tal manera que todos los elementos de cada bloque pertenecen al mismo grupo, pero los grupos no son necesariamente contiguos en la memoria.
- La permutación de bloques ordena los bloques de forma globalmente correcta.
- La limpieza desplaza algunos elementos que se encuentran en los bordes de los cubos.
Una desventaja evidente de este algoritmo es que lee y escribe cada elemento dos veces: una en la fase de clasificación y otra en la fase de permutación de bloques. Sin embargo, el algoritmo es hasta tres veces más rápido que otros algoritmos in situ de última generación y hasta 1,5 veces más rápido que otros algoritmos secuenciales de última generación. Dado que el muestreo ya se ha tratado anteriormente, las tres etapas posteriores se detallarán más adelante.
Clasificación local
En un primer paso, la matriz de entrada se divide enfranjas de bloques de igual tamaño, una para cada procesador. Cada procesador asigna ademásSe utilizan búferes del mismo tamaño que los bloques, uno para cada cubeta. Posteriormente, cada procesador escanea su franja y mueve los elementos al búfer de la cubeta correspondiente. Si un búfer está lleno, se escribe en la franja del procesador, comenzando desde el principio. Siempre hay al menos un búfer vacío, ya que para que se escriba en un búfer (es decir, que esté lleno), se debe escanear al menos un búfer completo con más elementos que los que se han escrito. Por lo tanto, cada bloque completo contiene elementos de la misma cubeta. Durante el escaneo, se mantiene un registro del tamaño de cada cubeta.
permutación de bloques
En primer lugar, se realiza una operación de suma de prefijos que calcula los límites de los cubos. Sin embargo, dado que solo se mueven bloques completos en esta fase, los límites se redondean a un múltiplo del tamaño del bloque y se asigna un único búfer de desbordamiento. Antes de comenzar la permutación de bloques, es posible que algunos bloques vacíos deban moverse al final de su cubo. Posteriormente, se asigna un puntero de escritura.está configurado al inicio del cubosubmatriz para cada cubo y un puntero de lecturaestá configurado en el último bloque no vacío del cubo.submatriz para cada cubo.
Para limitar la contención de trabajo, a cada procesador se le asigna un depósito primario diferente.y dos búferes de intercambio que pueden contener un bloque cada uno. En cada paso, si ambos búferes de intercambio están vacíos, el procesador decrementa el puntero de lectura.de su cubo principal y lee el bloque eny lo coloca en uno de sus búferes de intercambio. Después de determinar el cubo de destinodel bloque al clasificar el primer elemento del bloque, incrementa el puntero de escritura, lee el bloque enen el otro búfer de intercambio y escribe el bloque en su cubo de destino. SiLos búferes de intercambio vuelven a estar vacíos. De lo contrario, el bloque que queda en los búferes de intercambio debe insertarse en su depósito de destino.
Si todos los bloques del subconjunto del cubo principal de un procesador se encuentran en el cubo correcto, se elige el siguiente cubo como cubo principal. Si un procesador ya ha elegido todos los cubos como cubo principal una vez, el procesador ha finalizado.
Limpieza
Dado que en la fase de permutación de bloques solo se movieron bloques completos, es posible que algunos elementos aún se encuentren mal ubicados cerca de los límites de los cubos. Como debe haber suficiente espacio en el arreglo para cada elemento, estos elementos mal ubicados se pueden mover a espacios vacíos de izquierda a derecha, considerando finalmente el búfer de desbordamiento.
Véase también
Referencias
- 1 2 "Samplesort usando la biblioteca paralela adaptativa de plantillas estándar" (PDF) (Informe técnico). Universidad de Texas A&M.
- ↑ Grama, Ananth; Karypis, George; Kumar, Vipin (2003). "9.5 Bucket and Sample Sort" . Introducción a la computación paralela (2.ª ed.). Addison-Wesley. ISBN 0-201-64865-2Archivado del original el 13/12/2016 . Consultado el 28/10/2014 .
- 1 2 Frazer, WD; McKellar, AC (1970-07-01). "Samplesort: Un enfoque de muestreo para la clasificación de árboles de almacenamiento mínimo" . Journal of the ACM . 17 (3): 496– 507. doi : 10.1145/321592.321600 . S2CID 16958223 .
- 1 2 Hill, Jonathan MD; McColl, Bill; Stefanescu, Dan C.; Goudreau, Mark W.; Lang, Kevin; Rao, Satish B.; Suel, Torsten; Tsantilas, Thanasis; Bisseling, Rob H. (1998). "BSPlib: La biblioteca de programación BSP". Computación paralela . 24 (14): 1947– 1980. CiteSeerX 10.1.1.48.1862 . doi : 10.1016/S0167-8191(98)00093-3 .
- 1 2 Sanders, Peter; Winkel, Sebastian (14 de septiembre de 2004). "Super Scalar Sample Sort". Algorithms – ESA 2004. Lecture Notes in Computer Science. Vol. 3221. pp. 784–796 . CiteSeerX 10.1.1.68.9881 . doi : 10.1007/978-3-540-30140-0_69 . ISBN 978-3-540-23025-0.
- ↑ Gerbessiotis, Alexandros V.; Valiant, Leslie G. (1992). "Algoritmos paralelos directos síncronos en masa". J. Parallel and Distributed Computing . 22 : 22– 251. CiteSeerX 10.1.1.51.9332 .
- ↑ Hightower, William L.; Prins, Jan F.; Reif, John H. (1992). Implementaciones de ordenación aleatoria en grandes máquinas paralelas (PDF) . Simposio de la ACM sobre algoritmos y arquitecturas paralelas.
- ↑ Blelloch, Guy E. ; Leiserson, Charles E. ; Maggs, Bruce M.; Plaxton, C. Gregory; Smith, Stephen J.; Zagha, Marco (1991). Una comparación de algoritmos de ordenación para la Connection Machine CM-2 . Simposio ACM sobre algoritmos y arquitecturas paralelas. CiteSeerX 10.1.1.131.1835 .
- ↑ Satish, Nadathur; Harris, Mark; Garland, Michael. Diseño de algoritmos de ordenación eficientes para GPU multinúcleo . Actas del Simposio Internacional de Procesamiento Paralelo y Distribuido de la IEEE. CiteSeerX 10.1.1.190.9846 .
- ↑ Axtmann, Michael; Witt, Sascha; Ferizovic, Daniel; Sanders, Peter (2017). "In-Place Parallel Super Scalar Samplesort (IPSSSSo)" . 25th Annual European Symposium on Algorithms (ESA 2017) . 87 (Leibniz International Proceedings in Informatics (LIPIcs)): 9:1–9:14. doi : 10.4230/LIPIcs.ESA.2017.9 .
Enlaces externos
El método de clasificación de muestras de Frazer y McKellar y sus derivados:
- El artículo original de Frazer y McKellar
- DOI.org
- DOI.org
Adaptado para su uso en ordenadores paralelos:
- http://citeseer.ist.psu.edu/91922.html
- http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.214
- Algoritmos de ordenación
- Algoritmos distribuidos