2010-03-16 15 views
6

Hıza ulaşmak için Linq standardını daha hızlı ve kurban etmeliyim (Sözlük arama gerçekten hızlı mı olduğu varsayılıyor)? Bu yüzden bana ayrıntılı bakalım:Sözlük Lookup (O (1)) vs Linq nerede

Ben şu var:

List<Product> products = GetProductList(); 

Ben örneğin, bazı niteliğe dayalı olarak bir ürüne aramak için ihtiyaç, seri numarası var. Önce bir sözlük oluşturmak ve sonra aşağıdaki gibi doldurmak olabilir:

Dictionary<string, Product> dict = new Dictionary<string, Product>(); 
foreach(Product p in products) 
{ 
    dict.Add(p.serial, p); 
} 

bu bir ürünü bulmak O yararlanmak zamanı

(1) Sözlük görünüm-up tarafından sunulan:

string some_serial = ...; 
try { Product p = dict[some_serial]; } catch(KeyNotFoundException) { } 
Entities kullanarak Alternatif

:

Dict yaklaşımla dezavantajı elbette
Product p = products.Where(p => p.serial.Equals(some_serial)).FirstOrDefault(); 

bu (bu en tartışmalı olsa da) daha vb hafızada, yazmak için daha fazla kod, daha düşük nitelikte bir gerektirir. Faktör dışı olduğunu varsayalım. İlk yaklaşımı almalı mıyım? Sonuç olarak, yukarıdaki Linq yaklaşımının karmaşıklığının gerçekten O (n) olup olmadığını ve bunun nasıl daha iyi olabileceğini görmüyor mu diye onaylamak isterim.

cevap

6

Eğer nesnelerin bir numaralandırma ile başlayan ve sadece bir kez yapıyoruz varsayarsak ...

O onu tekrar arayan ardından Dictionary<TKey,TValue> ekleyerek ve aksine Where yöntemi yapmak daha hızlı olacaktır. Nedeni sözlük yöntemi O değil (1). Bu senaryoda, sözlüğe öğe ekliyorsunuz ve sonra yukarı bakıyorsunuz. Ekleme kısmı, ek bellek yüküne sahip Where yöntemi kadar pahalı olan O (N) 'dir. Dikkat edilmesi gereken diğer bir yan nokta ise, Dictionary<TKey,TValue>'un gerçekten O (1) olmadığıdır. Bunun yerine O (1) 'ye yaklaşır, ancak belirli durumlarda daha az performansa (örneğin bir çok çarpışma anahtarı) dönüşebilir.

+0

Evet, sözlüğe eklemenin ek yükünü dikkate almayı unuttum. Teşekkürler. –

+3

Ancak, sözlüğü birçok kez (yani 100 kez) kullanırsam, sadece bir kez değil? –