+\layout Standard
+
+La técnica de Block Sorting
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+desde ahora lo llamaremos BS, para minimizar la notación.
+\end_inset
+
+ tiene su principal desventaja en que es un algoritmo que consume muchos
+ recursos, y para ser una solución práctica debe ser trabajada para dar
+ resultados coherentes.
+\layout Standard
+
+En una implementación simple, el BS debe crear una matriz y crear todos
+ los desplazamientos sobre ella.
+ Esto hace que se necesito O(n^2) en memoria, donde n es la longitud del
+ vector sobre el cual se quiere operar.
+ Claramente es un problema, ya que para una página pequeña, digamos 1kb,
+ se necesita una matriz de 1Mb.
+\layout Standard
+
+El otro problema es el tiempo de ordenamiento de los desplazamientos, que
+ debe ser lo menor posible.
+ Una posibiliad es utilizar un método de ordenamiento de bajo órden, como
+ el Quick Sort
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+Se ha optado por utilizar el qsort de la libc por ser ANSI-C y tener una
+ técnica de selección del pivot aceptable.
+\end_inset
+
+ utilizado en esta implementación.
+ Otra posible opción hubiera sido el Heap Sort, pero dada la complejidad
+ de su implementación no se creyó que diera una mejora factible y suficiente
+ apreciable como para implementarlo.
+\layout Standard
+
+Como última opción se estudió el Radix Sort, ya que justamente nuestro dato
+ a ordenar es de longitud fija n y se cuenta con un conjunto de L=255 elementos
+ posibles a aparecer en el dato.
+ El orden de éste método sería O(n*L), pero para que realmente el Radix
+ Sort sea efectivo, se requiere que L < log2(n) = 15, por lo que no convenía
+ tampoco.
+\layout Standard
+
+Para solucionar el problema del consumo de memoria se plateó un esquema
+ como el que se indica a continuación :
+\layout LyX-Code
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+\layout LyX-Code
+
+Dato | | | | | | | | | | | | | | | | | | | | | | | | | |
+\layout LyX-Code
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+\layout LyX-Code
+
+ ^ ^ ^
+\layout LyX-Code
+
+Desplazamientos | | |
+\layout LyX-Code
+
+ +-+ | | |
+\layout LyX-Code
+
+ | |---------+ | |
+\layout LyX-Code
+
+ +-+ | |
+\layout LyX-Code
+
+ | |-----------+ |
+\layout LyX-Code
+
+ +-+ |
+\layout LyX-Code
+
+
+\backslash
+/
+\backslash
+ |
+\layout LyX-Code
+
+ +-+ |
+\layout LyX-Code
+
+ | |---------------------------------------------------------+
+\layout LyX-Code
+
+ +-+
+\layout Standard
+
+El vector desplazamiento es una estructura de control que almacena :
+\layout Itemize
+
+La posición inicial de la palabra desplazada i en el Dato
+\layout Itemize
+
+La posición final de la palabra desplazada en el Dato ( se calcula como
+ (pos_inicial+n-1)%n)
+\layout Standard
+
+La ganancia de este método es que se utilizan 2*n bytes de memoria solamente,
+ es decir, que se bajo a O(n) el orden en memoria del algoritmo.
+\layout Standard
+
+Luego de inicializar el vector Desplazamiento (esta parte es O(n) en tiempo)
+ se ordena el vector utilizando el qsort, que es del orden de O(n*log(n))
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+En realidad es del orden de O(1.44*n*log2(n)), para el caso promedio.
+\end_inset
+
+.
+ Y como último paso se obtiene la salida recurriendo el vector Desplazamiento
+ ordenado y emitiendo el último byte de cada posición.
+ Si se detecta la posición donde la posición inicial sea 0, se obtiene el
+ k para retornar.
+\layout Standard
+
+Se debe aclara que los órdenes estimados más arriba se basan en la suposición
+ de que el orden de una comparación en O(1).
+ En el caso de tener que comprimir archivos donde los desplazamientos queden
+ iguales o solo cambien sobre el final, los órdenes se ven muy afectados.
+ Sin embargo, para el caso promedio no se comporta tan mal.