Funnelsort es un algoritmo de ordenación basado en comparaciones . Es similar a mergesort , pero es un algoritmo independiente de la caché , diseñado para entornos donde el número de elementos a ordenar es demasiado grande para caber en la caché donde se realizan las operaciones. Fue introducido por Matteo Frigo, Charles Leiserson , Harald Prokop y Sridhar Ramachandran en 1999 en el contexto del modelo independiente de la caché . [ 1 ] [ 2 ]
Propiedades matemáticas
En el modelo de memoria externa , el número de transferencias de memoria que necesita para realizar una especie deelementos en una máquina con caché de tamañoy líneas de caché de longitudes, bajo el supuesto de caché alto queSe ha demostrado que este número de transferencias de memoria es asintóticamente óptimo para los algoritmos de ordenación por comparación. Funnelsort también alcanza la complejidad de tiempo de ejecución asintóticamente óptima de.
Algoritmo
Descripción general básica
Funnelsort opera en una matriz contigua deelementos. Para ordenar los elementos, realiza lo siguiente:
- Dividir la entrada enmatrices de tamañoy ordenar los arreglos recursivamente.
- Fusionar elsecuencias ordenadas usando una-fusión. (Este proceso se describirá con más detalle).
El algoritmo Funnelsort es similar al Merge Sort en que ordena recursivamente varios subconjuntos, tras lo cual un paso de fusión los combina en un único arreglo ordenado. La fusión se realiza mediante un dispositivo llamado k-merger, que se describe en la sección siguiente.
k -fusiones
Una k -merge tomasecuencias ordenadas. Tras una invocación de un k-merger, produce la primeraelementos de la secuencia ordenada obtenida al fusionar las k secuencias de entrada.
En el nivel superior, Funnelsort utiliza un-fusión ensecuencias de longitudy realiza esta fusión una sola vez.
La k -merger se construye recursivamente a partir de-fusiones. Consiste enaporte-fusionesy una única salida-fusión. Las k entradas se separan enconjuntos deentradas cada uno. Cada uno de estos conjuntos es una entrada para uno de los fusionadores de entrada. La salida de cada fusionador de entrada está conectada a un búfer, una cola FIFO que puede contenerelementos. Los buffers se implementan como colas circulares . Las salidas de losLos búferes están conectados a las entradas del combinador de salida.. Finalmente, la salida dees el resultado de toda la fusión k.
En esta construcción, cualquier fusión de entrada solo produceelementos a la vez, pero el búfer al que envía tiene el doble de espacio. Esto se hace para que un fusionador de entrada se pueda llamar solo cuando su búfer no tenga suficientes elementos, pero que cuando se llama, envíe muchos elementos a la vez (a saber,de ellos).
Un k -merger funciona recursivamente de la siguiente manera. Para generarelementos, invoca recursivamente su fusión de salidaveces. Sin embargo, antes de que haga una llamada a, comprueba todos sus búferes, llenando cada uno de ellos que estén a menos de la mitad de su capacidad. Para llenar el i-ésimo búfer, invoca recursivamente la fusión de entrada correspondiente.una vez. Si esto no se puede hacer (debido a que la fusión se queda sin entradas), este paso se omite. Dado que esta llamada produceelementos, el búfer contiene al menoselementos. Al final de todas estas operaciones, el k -merger ha producido el primerode sus elementos de entrada, en orden ordenado.
Análisis
La mayor parte del análisis de este algoritmo gira en torno al análisis del espacio y la complejidad de los fallos de caché del algoritmo k-merger.
El primer límite importante es que una k-merger se puede ajustar enespacio. Para ver esto, dejamosdenota el espacio necesario para una k-fusión. Para ajustar elbúferes de tamañoaceptaespacio. Para que quepa elLos búferes más pequeños tardanespacio. Por lo tanto, el espacio satisface la recurrencia.Esta recurrencia tiene solución..
De ello se deduce que existe una constante positiva.de tal manera que un problema de tamaño como máximoCabe completamente en la caché, lo que significa que no se producen fallos de caché adicionales.
Alquilerdenotemos el número de fallos de caché incurridos por una llamada a un k-merger, se puede demostrar queEsto se hace mediante un argumento de inducción.como caso base. Para k más grande, podemos acotar el número de veces que-merger es llamado. El fusionador de salida es llamado exactamenteveces. El número total de llamadas en fusiones de entrada es como máximoEsto da un límite total dellamadas recursivas. Además, el algoritmo comprueba cada búfer para ver si necesita ser llenado. Esto se hace enalmacena en búfer cada paso parapasos, que conducen a un máximo deFallos de caché para todas las comprobaciones.
Esto conduce a la recurrencia, que puede demostrarse que tiene la solución dada anteriormente.
Finalmente, el total de fallos de cachépara todo el tipo se puede analizar. Satisface la recurrenciaSe puede demostrar que esto tiene solución.
Clasificación por embudo perezosa
Lazy funnelsort es una modificación del funnelsort, introducido por Gerth Stølting Brodal y Rolf Fagerberg en 2002. [ 3 ] La modificación consiste en que, al invocar una fusión, no es necesario llenar todos sus búferes. En cambio, llena un búfer de forma diferida solo cuando está vacío. Esta modificación tiene el mismo tiempo de ejecución asintótico y transferencias de memoria que el funnelsort original, pero tiene aplicaciones en algoritmos que no dependen de la caché para problemas de geometría computacional en un método conocido como barrido de distribución.
Véase también
Referencias
- ↑ M. Frigo, CE Leiserson, H. Prokop y S. Ramachandran. Algoritmos ajenos a la caché. En Actas del 40.º Simposio IEEE sobre Fundamentos de la Informática (FOCS 99), págs. 285-297. 1999. Resumen extendido en IEEE , en Citeseer .
- ↑ Harald Prokop. Algoritmos que ignoran la caché . Tesis de maestría, MIT. 1999.
- ↑ Brodal, Gerth Stølting ; Fagerberg, Rolf (25 de junio de 2002). "Cache Oblivious Distribution Sweeping". Autómatas, lenguajes y programación . Lecture Notes in Computer Science . Vol. 2380. Springer . págs. 426–438 . CiteSeerX 10.1.1.117.6837 . doi : 10.1007/3-540-45465-9_37 . ISBN 978-3-540-43864-9.Véase también el informe técnico más extenso .
- Clasificación por comparación
- Algoritmos de memoria externa
- Análisis de algoritmos
- Caché (informática)
- Modelos de computación