Red de ordenamiento
From Wikipedia, the free encyclopedia

En ciencias de la computación, una red de ordenamiento (en inglés: sorting network) es un algoritmo que ordena un número fijo de valores mediante el uso de una secuencia fija de comparaciones. Esta puede ser imaginada como una red de hilos y módulos comparadores. Los valores (de cualquier tipo ordenable) fluyen a través de los hilos (no se debe confundir con hilo de ejecución). Cada comparador conecta dos hilos, compara los valores introducidos por los hilos, y los ordena obteniendo el menor como salida a un hilo, y el mayor a otro.
Las redes de ordenamiento se diferencian del más general ordenamiento por comparación en el hecho de que no son capaces de manejar cantidades arbitrariamente grandes de entrada, y que su secuencia de comparaciones se conoce de antemano, independientemente del resultado de las comparaciones previas. Esta independencia de la secuencia de comparaciones es útil para la ejecución paralela y para su implementación en hardware. A pesar de la simplicidad de las redes de ordenamiento, su teoría es sorprendentemente profunda y compleja. Las redes de ordenamiento fueron primero estudiadas circa 1954 por Armstrong, Nelson y O'Connor,[1] quienes subsecuentemente patentaron la idea.[2]
Las redes de ordenamiento pueden ser implementadas tanto en hardware como en software. Donald Knuth describe como los comparadores para los enteros binarios pueden ser implementados como sencillos dispositivos electrónicos de tres estados.[1] Batcher, en 1968, sugirió usarlos para construir redes de interruptores para hardware de computadora, reemplazando a ambos: los buses de computadora y el más rápido pero más caro conmutador de barras cruzadas.[3] Desde la década del 2000, las redes de ordenamiento (especialmente del ordenamiento bitónico) son usadas por la comunidad GPGPU para construir algoritmos de ordenamiento para correr en unidades de procesamiento gráfico.[4]

Una red de ordenamiento consiste en dos tipos de elementos: comparadores e hilos. Se supone que los hilos operan de izquierda a derecha, transportando valores (uno por hilo) que atraviesan la red al unísono. Cada comparador conecta dos hilos. Cuando un par de valores, que viaja a través de un par de hilos, encuentra un comparador, el comparador intercambia los valores si y sólo si el valor del hilo superior (i.e. el valor que viaja por el hilo superior) es mayor que el valor del hilo inferior.
Visto en fórmula, si el hilo superior trasporta y el hilo inferior transporta , entonces tras pasar por un comparador los hilos portan y , de forma que el par de valores está ordenado.[5]: 635 Una red de hilos y comparadores que es capaz de ordenar correctamente todas las posibles entradas en orden ascendente es llamada una red de ordenamiento.
La operación completa de una red de ordenamiento sencilla puede ser vista más abajo. Es fácil comprobar por qué esta red de ordenamiento puede correctamente ordenar las entradas; note que los primeros cuatro comparadores "hundirán" los valores mayores al fondo y "harán flotar" los valores menores hacia la parte superior. El comparador final sencillamente ordena los dos hilos intermedios.
Profundidad y eficiencia
La eficiencia de una red de ordenamiento puede ser medida por su tamaño total, el número de comparadores usados, o por su profundidad, definida (informalmente) como el mayor número de comparadores que cualquier valor de entrada puede encontrar en su paso a través de la red. Notando que las redes de ordenamiento pueden realizar ciertas comparaciones en paralelo (representado en la notación gráfica como comparadores que yacen en la misma línea vertical), y asumiendo que todas las comparaciones toman una unidad de tiempo, la profundidad de la red puede ser vista igual al número de unidades de tiempo requeridas para ejecutarla.[5]: 636–637
Redes de inserción y selección
Podemos fácilmente construir una red de cualquier tamaño recursivamente usando el principio de inserción y selección. Asumiendo que tenemos una red de ordenamiento de tamaño , podemos construir una red de tamaño insertando un número adicional en la subred ya ordenada (usando el principio detrás de insertion sort). Podemos también conseguir el mismo resultado primeramente "seleccionando" el menor valor de las entradas y posteriormente ordenando los valores restantes recursivamente (mediante el uso del principio detrás del ordenamiento de burbuja).
Las estructuras de estas dos redes de ordenamiento son muy similares. Una construcción de las dos variantes diferentes, que comprime conjuntamente comparadores que pueden correr simultáneamente indica que, de hecho, son idénticas.[1]
La red de inserción tiene una profundidad de ,[1] haciéndola poco práctica. Mejores construcciones son discutidas más abajo.
Principio cero-uno
Aunque es fácil demostrar la corrección de algunas redes de ordenamiento (como las correspondientes a los ordenamientos insertion y bubble sort), no siempre es tan fácil. Existen permutaciones de números en una red de hilos, y probarlos todos tomaría una cantidad significativa de tiempo, especialmente cuando el valor de es grande. El número de casos de prueba puede ser reducido significativamente, hasta , usando el llamado principio cero-uno. Incluso manteniéndose exponencial, esto es menor que para todo , y la diferencia crece rápidamente cuando se incrementa.
El principio cero-uno afirma que, si una red de ordenamiento puede correctamente ordenar todos las secuencias de ceros y unos, entonces es también válida para entradas arbitrariamente ordenadas. Esto no sólo drásticamente reduce el número de casos de pruebas necesarios para acertar la corrección de una red, sino que también es de gran utilidad al crear muchas construcciones de redes de ordenamiento.
El principio puede ser demostrado primeramente observando los siguientes hechos acerca de los comparadores: cuando una función monótona es aplicada a las entradas, i.e., y son reemplazados por y , entonces el comparador produce
y
- .
Por inducción en la profundidad de la red, este resultado puede extenderse a un lema enunciando que si la red transforma la secuencia en , entonces va a transformar en . La demostración ahora procede por contradicción: suponga que cierta entrada contiene dos elementos , y la red incorrectamente intercambia estos valores a la salida. Entonces también incorrectamente ordenará para la función
Esta función es monótona, así que tenemos el principio cero-uno como la contraposición.[5]: 640–641




