2012-05-31 11 views
5

Tengo una cola de actividades compartidas entre clientes, capturando la actividad del usuario y ejecutada por un robot en el otro sitio. Un ejemplo de actividades podría ser:¿Algoritmo de reducción de cola?

CREATE FOLDER /docs 
CREATE FILE /docs/journal.txt 
DELETE FILE /docs/blog.txt 
MOVE FOLDER /docs/images /docs/photos 
... 

A menudo hay actividades que se pueden reducir a una sola, o ninguna. Por ejemplo:

CREATE FOLDER /docs 
RENAME FOLDER /docs /documents 

¿Se puede cambiar simplemente:

CREATE FOLDER /documents 

Y algo como:

CREATE FOLDER /docs 
RENAME FOLDER /documents 
DELETE FOLDER /documents 

Puede ser quitado por completo de la cola.

Este tipo de reducción/optimización parece ser un problema muy genérico, y antes de atacar quiero probar una solución genérica. Parece un problema de optimización de ruta de acceso.

¿Alguna idea?

Respuesta

2

No conozco ninguna biblioteca o marco que pueda hacer esto por usted. Por otro lado, tendrías que especificar la lógica detrás de ti mismo, y como yo lo veo, esa sería la mayor parte del trabajo de todos modos.

Aquí es el enfoque me gustaría tener:

  1. Haz una ordenación topológica de las acciones (cambiar el nombre de la carpeta "depende de" crear carpeta y así sucesivamente ...)

  2. Cada comando sin dependencias representa una "raíz" en un árbol de dependencias.

  3. Contraiga estos árboles de forma recursiva desde cada raíz.

+0

Realmente no estoy buscando una biblioteca, pero si hubiera una, estaría feliz. ¿Puedes aclarar a qué te refieres con "colapsar los árboles"? –

1

Una opción (aunque sea un poco pesado) sería caminar a través de los registros de cola y simular las operaciones que se realizan en el sistema de archivos en un árbol de representación que se crea dentro del programa. Puede rastrear, para cada directorio al que se hace referencia, qué operaciones netas se realizan en él. Una vez que haya terminado, podrá recorrer la estructura de árbol modificada y generar una serie de comandos que representen la transformación de red aplicada a cada directorio y subdirectorio.

Espero que esto ayude!

0
  1. Definir todas sus operaciones (crear, renombrar, mover)
  2. definir una clase de comandos que contiene los parámetros de funcionamiento + para la operación.
  3. Implementa algo que te dirá si se pueden combinar dos comandos y cuál es el resultado de esa combinación.

Debo asumir que solo puede combinar comandos que se siguen inmediatamente o de lo contrario podría introducir efectos secundarios no deseados. Entonces, cuando vaya a ejecutar un comando fuera de su cola, comience a leer/abrir/construir un comando hasta que encuentre un comando que no se pueda combinar.

+0

Gracias por las buenas intenciones, pero creo que no entiendes el problema. Primero, los detalles de implementación no son relevantes, solo estoy buscando un algoritmo. En segundo lugar, los comandos pueden no ser necesariamente adyacentes, por lo que lo que usted propone o no funcionaría, o exigiría una búsqueda n * n. Hay mejores soluciones obvias si estoy dispuesto a pagar eso. –

+0

Estaré extremadamente sorprendido si encuentra una forma O (n) u O (1) para unir n elementos por el resultado de una operación sobre ellos (donde op = areTheyCombinable?) En cuanto a la primera parte de su respuesta, puede saca el algoritmo de mis detalles de implementación. Proporcioné la instantánea del código como un intento de ayudarlo. Buena suerte y espero que encuentres esta solución mágica. Me encantaría verla también. – csauve

+1

También explique cómo cree que puede reordenar elementos en su cola sin la posibilidad de introducir efectos secundarios no deseados. ej .: 1 = CreateFile (A, "hey you!"), 2 = SendEmail ([email protected], ContentsOf (A)), 3 = DeleteFile (A). Si realmente desea que se combinen los n. ° 1 y n. ° 3 (por definición, pueden serlo), romperá el n. ° 2. – csauve