2009-02-25 33 views
4

Bir arama ağacını sınırlı düzenli ifadeleri işlemek için nasıl uyarlayacağını bilen var mı? Görev, bir dosya adı verildiğinde, bu dosya adıyla eşleşen tüm düğümleri bulur. Düğümler normal dosya adı globs (* ve?) Içerebilir. Açıkçası, bu bir arama ağacı olduğundan, hızın özüdür.Düzenli ifade (glob) arama ağacı

DÜZENLEME: Hız için en önemli durumun, bir eşleşmeyi dışlamak için geçen ortalama süre olduğunu eklemeliyim. Yani çoğu durumda eşleşme başarısız olur.

bir örneği: *, çubuk, foo 1 ve 3 bar arama düğümleri dönmek Besin arama

bar

foo, çubuk, foo: ağaç aşağıdaki düğümleri içerdiği ki 2 ve 4 numaralı düğümleri döndürür. Fob aranması hiçbir düğüm döndürmez. fooxbar aranıyor dönecekti düğüm 5. fatura uyabilecek düğümleri 3. ve 4.

+0

Bu bir ters sorun mu (regex): bir dize Düzenli Dil'e ait mi, yoksa eşleşmiyor mu? – dirkgently

+0

Bize örnek bir örnek verebilir misiniz? – dirkgently

+0

Bir örnek: ağaç aşağıdaki düğümleri içerdiği Say: *, * Bar, foo foo, bar, foo (örn foo, filanca, fooxbar, fob, vs.) herhangi bir dize Verilen bar, çabuk düğümü bulmak (ler) varsa, bu dizeyle eşleşen. –

cevap

9

Bir aho-corasick arama ağacı dönecekti filanca aranıyor. Aho-Corasick şey Tries bu tür hakkında çok iyi bir makale ve Etrie

Düzen arama regex yerine Evrim kullanılan uygulama: Çok hat verilerini tarayarak eğer bütün dize eşleme yapmak için,, başlangıç ​​ve bitiş çapa durumlarını ekleyebilir , yeni satırı başlayıp sonuna ekleyebilirsin. Ayrıca, farklı eşleşmeyi başlatan kısmi eşleme için çapraz bağlamayı eklediğiniz parçayı da kaldırabilirsiniz, bu da daha hızlı dışlama sağlar.

Dize kümesinde üyelik denetimi için başka bir algoritma CritBit. Bu Regex'e sahip değil, ancak basit ve tam dizeleri test edin.

+0

Bu çok umut verici görünüyor, ancak tüm giriş dizgisini, alt dizeleri değil, eşleştirmek istiyorum. Linkleri okuyacağım ve faturaya uyduğunu onaylayacağım. –

+0

Yeni bir ön dingil kenarı ekleyebilir veya çok satırlı haystacks tararsanız ve iğnenin ön tarafına kadar uzanan satırı ekleyebilirsiniz. örneğin "\ nsearch dizesi". – sfossen