SORU
9 Mayıs 2010, Pazar


Garanti çalışma zamanı karmaşıklığı (Büyük-O) SERİ yöntem üzerinde ne var?

Son zamanlarda ETMENİZ oldukça fazla kullanmaya başladım ve gerçekten çalıştırma ETMENİZ yöntemleri herhangi bir karmaşıklık herhangi bir söz görmedim. Açıkçası, rol oynayan pek çok faktör var. IEnumerable SERİ-Nesneleri düz sağlayıcı tartışma kısıtlamak. Ayrıca, hadi Func Herhangi bir seçici / a çevirici etc / olarak geçirilen varsayalım. daha O(1) bir işlemdir.

-Tek geçişli işlemler (Select, Where, , *, *6CountTake/Skip, vb.) aşikardır onlar tek sıra bir kez yürümek gerekir çünkü O(n) olacaktır; bile olsa, bu tembellik tabidir.

İşler biraz daha karmaşık işlemler; set gibi operatörler için giderek(, *, Except, *Distinct7 vb.) iş içten karma bir tablo, bu işlemleri yapmadan kullanıyorlar varsaymak makul gibi görünüyor, yani varsayılan olarak GetHashCode (afaık), kullanarak(n) de, genel olarak. Ne IEqualityComparer kullanan sürümleri hakkında?

OrderBy büyük olasılıkla O(n log n) yani bir tür gerekir. Eğer zaten sıralanmış? OrderBy().ThenBy() diyorum ve her ikisi de aynı anahtar bulunur.

GroupBy (Join) kullanarak ya da sıralama veya karma görebiliyordum. Hangisi?

Contains olurdu O(n) List ama O(1) HashSet - SERİ onay alttaki kabı görmek için olabilir hızlandırmak?

Ve asıl soru şu - şu ana kadar operasyonların ölçülebilir olan inancımızla alıyorum. Ancak, bu banka? STL kapları, örneğin, açıkça her operasyonun karmaşıklığını belirtin. Bu SERİ performans üzerinde benzer bir şeyin garantisi yok .NET kitaplığı belirtimi?

(Yorumlara cevap) soru:
Gerçekten havai aklıma gelmemişti, ama basit Seri-Nesneler için çok olmasını beklemiyordum. CodingHorror sonrası sorgu ayrıştırma ve SQL yapmak maliyet Nesneleri sağlayıcı için benzer bir maliyeti var eklersiniz çok anlayabiliyorum nerede Lınq-to-SQL, bahsediyor? Eğer öyleyse, ya işlevsel sözdizimi Bildirge kullanıyorsanız farklı mı?

CEVAP
9 Mayıs 2010, Pazar


Çok, çok az şeyin garantisi yok, ama bazı iyileştirmeler vardır:

  • Uzatma yöntemleri kullan dizine erişim gibi ElementAt, Skip, Last ya LastOrDefault, onay görmek olsun veya olmasın arka plandaki türünü uygular IList<T>, böylece size olsun Ey(1) erişim yerine O(N).

  • Count yöntemi bu işlemi O(1) yerine O(N) ICollection bir uygulama için kontrol eder.

  • Distinct, GroupBy Join, ve inanıyorum da set-toplama yöntemleri (Union, Intersect Except) kullanın karma, yani öyle olmalılar kapatmak için O(N) yerine O(N2).

  • Contains ICollection bir uygulama, bu yüzden bunu kontrol ederolabilirtemel koleksiyonuna da(1), ** 34, ama bu gerçek veri yapısına bağlı olarak O ve garantili değilse O(1) olur. Karma O yüzden bu Contains yöntem, (1) geçersiz ayarlar.

  • OrderBy yöntemler kararlı bir quicksort kullanın(N günlük N), ortalama durum.

En değilse yerleşik uzatma yöntemleri kapsar bence. Gerçekten çok az performans garantisi yok; verimli veri yapıları yararlanmaya kendisi Seri ama potansiyel olarak verimsiz kod yazmak için ücretsiz bir geçiş değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011