Cómo ordenar las ejecuciones en la clasificación externa mediante la clasificación por fusión

Estoy tratando de implementar (en C) un algoritmo de clasificación externo de una base de datos utilizando la clasificación por combinación para una tarea universitaria. La memoria disponible es buffSize bloques Encontré este enlace muy útil:

http://web.eecs.utk.edu/~huangj/CS302S04/notes/external-sorting2.html

pero mi problema es sobre esta línea del pseudocódigo, en la fase uno del algoritmo:

sort array a using an in-memory algorithm like quicksort

Si no tengo derecho a usar ninguna memoria que no sea mi buffSize espacio, por lo que no puedo asignar el a matriz del enlace, ¿cómo puedo ordenar los registros que están contenidos en esos bloques (y luego almacenarlos en un archivo de ejecución temporal), utilizando un procedimiento de clasificación en memoria (por ejemplo, ordenación rápida). Mis registros en ese caso no estarían en una matriz contigua sino en bloques ubicados en memoria no contigua y no puedo aplicar qsort directamente. ¿Alguna pista?

preguntado el 12 de junio de 12 a las 13:06

Si la matriz que se va a ordenar no es contigua y no se le permite usar una matriz temporal, entonces tiene razón, no puede usar qsort. Tendrá que escribir su propia rutina de clasificación que tenga en cuenta los espacios. -

¿Por qué sería no contiguo? He implementado la ordenación por combinación externa y el búfer en memoria es contiguo. -

1 Respuestas

El enfoque general para una ordenación externa es:

  1. Lea tantos datos como quepan en una memoria de matriz.
  2. Ordénalo.
  3. Escríbalo en un archivo temporal (haciendo un seguimiento del nombre y el tamaño y el registro más grande, etc.).
  4. Vuelva al paso 1 hasta llegar al final de los datos.
  5. Configure un árbol de fusión para los archivos escritos de modo que haga el mínimo de fusiones.
  6. Lea una línea de cada uno de los primeros (¿únicos?) archivos de entrada de la fase de fusión.
  7. Escriba el más pequeño (para un orden ascendente) al siguiente archivo temporal (o al archivo final).
  8. Obtenga un nuevo registro para reemplazar el que acaba de escribir.
  9. Vuelva al paso 7 hasta que no haya más datos para leer.
  10. Vuelva al paso 6 para continuar con la combinación hasta que termine.

No has detallado lo que buffSize bloques de memoria significa, pero hay una matriz a que se pueden ordenar en la memoria. Entonces, lees los datos en la matriz. Ordenas la matriz usando Quicksort. Luego, escribe la matriz en el disco. Repita la lectura, clasificación y escritura hasta que no haya más datos de entrada. Luego haz la fusión...

Respondido 13 Oct 12, 03:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.