2012-05-31 24 views
5

İstemciler arasında paylaşılan, kullanıcı etkinliğini yakalayan ve diğer sitede bir robot tarafından yürütülen bir faaliyetler kuyruğum var.Kuyruk azaltma algoritması?

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

Genellikle tek tek veya hiçbiri azaltılabilir aktiviteler vardır: gibi aktiviteler bir örnek olabilir. Örneğin:

CREATE FOLDER /docs 
RENAME FOLDER /docs /documents 

basitçe için Değiştirilebilir:

CREATE FOLDER /documents 

Ve bir şey gibi:

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

kuyruğundan tamamen kaldırılabilir.

Bu tür bir azaltma/optimizasyon çok genel bir sorun gibi görünüyor ve ona saldırmadan önce bazı genel çözümleri denemek istiyorum. Bir yol bulma optimizasyon problemine benziyor.

Herhangi bir fikrin var mı?

cevap

2

Bunu sizin için yapacak herhangi bir kitaplık veya çerçeve bilmiyorum. Diğer yandan, arkasındaki mantığı kendiniz belirtmek zorunda kalacaksınız, ve gördüğüm gibi, bu zaten işin büyük kısmı olacaktır.

  1. eylemlerin topolojik sıralama yapın (klasörü yeniden adlandırmak vb klasör ve oluşturmak "bağlıdır" ...)

  2. Her komut hiçbir ile: Burada

    ben alacağını yaklaşım Bağımlılıklar bağımlılık ağacında bir "kök" temsil eder. Bu kökleri her bir kökten başlayarak yinelemeli olarak daraltınız. (Biraz ağır bir de olsa)

+0

Gerçekten bir kütüphane arıyorum, ama bir tane olsaydı mutlu olurdum. "Ağaçları yıkmak" ile tam olarak ne demek istediğini açıklayabilir misin? –

1

Seçeneklerden biri kuyruğu kayıtları üzerinde yürümek ve programın içinde oluşturmak bir ağaç temsil dosya sistemi üzerinde gerçekleştirilen işlemleri simüle etmek olacaktır. Başvurulan her bir dizin için, üzerinde hangi net işlemlerin gerçekleştirildiğini izleyebilirsiniz. İşiniz bittiğinde, değiştirilmiş ağaç yapısına geçip, her bir dizine ve alt dizine uygulanan net dönüşümü temsil eden bir dizi komut verebilirsiniz.

Bu yardımcı olur umarız!

0
  1. işlemlerinize (, taşıyabilir, oluşturmak adlandırmak)
  2. işlem için operasyon + parametreleri içeren bir komut sınıfını tanımlamak tüm tanımlayın.
  3. İki komutun birleştirilip birleştirilemeyeceğini ve bu kombinasyonun sonucunun ne olduğunu birlikte söyleyecektir.

Sadece birbirini takip eden komutları birleştirebileceğinizi ya da potansiyel olarak istenmeyen yan etkiler ortaya çıkarabileceğini varsayalım. Böylece, yoru kuyruğuna bir komut yürütmeye gittiğinizde, kombine edilemeyen bir komutla karşılaşıncaya kadar bir komutu gözetlemeye/patlamaya/oluşturmaya başlayın.

+0

İyi niyetleriniz için teşekkürler, ama sanırım sorunu anlamıyorsunuz. İlk olarak, uygulama ayrıntıları uygun değil, sadece bir algoritma arıyorum. İkincisi, komutlar mutlaka bitişik olmayabilir, bu yüzden ya önerdiğiniz şey işe yaramıyor ya da n * n araması gerektiriyordu. Bunu karşılamaya razıysam daha iyi açık çözümler var. –

+0

Eğer n (veya op = areTheyCombinable?) N bir öğenin n öğelerine eşleşmesi için bir O (n) veya O (1) yolu bulursanız çok şaşıracaksınız. Cevabınızın ilk bölümüne gelince, Algoritmamı uygulama bilgilerimden çıkarın. Kod anlık görüntüsünü size yardımcı olmaya çalıştım. İyi şanslar ve umarım bu sihirli çözümü bulursanız onu da görmeyi çok isterim. – csauve

+1

Ayrıca, istenmeyen yan etkileri ortaya çıkarmadan sıradaki öğeleri nasıl yeniden sıralayabileceğinizi de lütfen açıklayınız. Örneğin: 1 = CreateFile (A, "hey!"), 2 = SendEmail ([email protected], ContentsOf (A)), 3 = DeleteFile (A). Eğer gerçekten # 1 ve # 3'ün birleştirilmesini istiyorsanız (tanım olarak olabilirler), # 2'yi kıracaksınız. – csauve