2012-05-31 18 views
5

Ho una coda di attività condivisa tra i client, che acquisisce attività dell'utente ed eseguita da un robot sull'altro sito. Un esempio di attività potrebbe essere:Algoritmo di riduzione della coda?

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

Spesso ci sono attività che possono essere ridotte a una singola o nessuna. Per esempio:

CREATE FOLDER /docs 
RENAME FOLDER /docs /documents 

può essere semplicemente modificato in:

CREATE FOLDER /documents 

E qualcosa di simile:

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

può eliminare dalla coda.

Questo tipo di riduzione/ottimizzazione sembra un problema molto generico e prima di attaccarlo vorrei provare qualche soluzione generica. Sembra un problema di ottimizzazione del pathfinder.

Qualche idea?

risposta

2

Non conosco alcuna libreria o framework che possa fare questo per voi. D'altra parte, dovresti specificare la logica dietro di te e, a mio avviso, quella sarebbe comunque la maggior parte del lavoro.

Ecco l'approccio vorrei prendere:

  1. fare una sorta topologica delle azioni (rinominare la cartella "dipende da" creare la cartella e così via ...)

  2. Ogni comando senza le dipendenze rappresentano una "radice" in un albero delle dipendenze.

  3. Comprimi questi alberi in modo ricorsivo a partire da ogni radice.

+0

Non sto davvero cercando una biblioteca, ma se ce ne fosse una sarei felice. Puoi chiarire cosa intendi per "collassare gli alberi"? –

1

Una possibilità (anche se un po 'un peso massimo) sarebbe quella di camminare sopra i record di coda e simulare le operazioni che vengono eseguite sul file system su una rappresentazione ad albero che si crea all'interno del programma. È possibile tenere traccia, per ciascuna directory a cui viene fatto riferimento, di quali operazioni finali vengono eseguite su di essa. Una volta terminato, è possibile passare sulla struttura ad albero modificata e generare una serie di comandi che rappresentano la trasformazione netta applicata a ciascuna directory e sottodirectory.

Spero che questo aiuti!

0
  1. definire tutte le operazioni (creare, rinominare, spostare)
  2. definire una classe di comando che contiene l'operazione + parametri per l'operazione.
  3. Implementare qualcosa che indichi se è possibile combinare due comandi e quale sarà il risultato di tale combinazione.

Devo supporre che si possano combinare solo comandi che si susseguono immediatamente oppure si potrebbero introdurre effetti collaterali indesiderati. Quindi, quando si va ad eseguire un comando dalla coda yoru, iniziare a fare il peeking/popping/costruire un comando finché non si incontra un comando che non può essere combinato in esso.

+0

Grazie per le buone intenzioni, ma penso che tu non capisca il problema. Innanzitutto, i dettagli di implementazione non sono rilevanti, sto solo cercando un algoritmo. In secondo luogo, i comandi potrebbero non essere necessariamente adiacenti, quindi ciò che si propone non funzionerebbe o richiederebbe una ricerca n * n. Ci sono soluzioni più ovvie se sono disposto a permettermelo. –

+0

Sarò estremamente sorpreso se trovi un modo O (n) o O (1) per abbinare n elementi dal risultato di un op su di essi (dove op = areTheyCombinable?) Per quanto riguarda la prima parte della tua risposta, puoi togliere l'algoritmo dai dettagli di implementazione. Ho fornito l'istantanea del codice come tentativo di aiutarti. Buona fortuna e spero che trovi questa soluzione magica che mi piacerebbe vederlo anche io. – csauve

+1

Inoltre, si prega di spiegare come si pensa di poter riordinare gli elementi nella coda senza che sia possibile introdurre effetti collaterali indesiderati. es: 1 = CreateFile (A, "hey you!"), 2 = SendEmail ([email protected], ContentsOf (A)), 3 = DeleteFile (A). Se vuoi davvero combinare il n. 1 e il n. 3 (per definizione possono essere), interromper il n. – csauve

Problemi correlati