Anahtar ile ImmutableSortedDictionary aralık numaralandırması


11

Ben 'C # hakkında okuma s edildi ImmutableSortedDictionaryiçinde System.Collections.Immutableve benim programda uygulamak konusunda düşünme. C ++ 'ı çok seviyorum lower_boundve upper_bound( buraya bakın ) ve menzil aramaları için bir şey görmeyi bekliyordum. Bununla birlikte, benzer yöntemler dokümantasyonda garip bir şekilde yok gibi görünmektedir . Bir şey mi kaçırıyorum? Yoksa MS, sıralanmış aralıklara etkili bir şekilde erişmeden gerçekten sıralanmış bir sözlük sağlıyor mu? Tam IEnumerableolarak bir uzantı yöntemi söylemek gibi anahtarlar üzerinde bir şey yapabileceği gibi görünmüyor , bu yüzden biraz şaşkınım doğrudan koleksiyon tarafından sağlanan bir şey görmüyorum.


Eric Lippert , 2008 yılında değişmez bir AVL ağacı uygulamasını paylaştı . Yorumlardan, henüz hız veya verimlilik için özellikle optimize edildiğini düşünmüyorum, ancak IBinarySearchTree<K,V>uyguladığı şey beklediğim şeye daha yakın görünüyor. Acaba daha fazla uğraştı mı?
J Trana

ImmutableList<T>Sınıf da AVL ağacı olarak uygulanmaktadır. Gönderen kaynak kodu :/// The root node of the AVL tree that stores this set.
Theodor Zoulias

Listenin değişmezliği uygulamak için true bir AVL kullandığını mı, yoksa AVL ağacının kendisinin değişmez mi olduğunu biliyor musunuz? (belki de ağacı açığa çıkarmadıkları için önemli değil).
J Trana

Belgelere göre ( ImmutableList<T>bir AVL ağacı tarafından desteklenmektedir) ImmutableArray<T>(bir dizi tarafından desteklenmektedir ) üzerindeki avantajları aşağıda verilmiştir . Değişmez listeyi kullanma nedenleri: 1) Verilerin güncellenmesi yaygındır veya öğe sayısının az olması beklenmemektedir. 2) Koleksiyonun güncellenmesi, içeriği yinelemekten daha fazla performans açısından önemlidir.
Theodor Zoulias

Bunun nedeni, büyük bir AVL ağacından bir öğe eklerken veya silerken, düğümlerin çoğunu paylaşarak ve yalnızca birkaç yeni düğüm oluşturarak orijinal olanı yok etmeden yeni bir ağaç elde edebilmenizdir. ( Kalıcı veri yapısı - Ağaçlar )
Theodor Zoulias

Yanıtlar:


9

Mevcut yerleşik koleksiyonların tam bir özellik kümesi ( SortedDictionarybir BinarySearchyöntemden yoksun gibi ) sunmaması, bizi üçüncü taraf çözümleri ( C5 kütüphanesi gibi ) aramaya zorluyor .

Sizin durumunuzda bir yerine ImmutableSortedDictionarybüyük olasılıkla a ImmutableSortedSet, değerleri tuşlara gömmek ve uygun bir karşılaştırıcı kullanarak kullanabilirsiniz. En azından bu sınıfın API özelliklerini içeren Minve Max.


2
Bir yan not olarak, başka bir değişmez sınıf, bir ağaç olarakImmutableList<T> dahili olarak uygulanır . Bu yüzden 10 kat daha yavaştır ve a'dan 12 kat daha fazla bellek ayırır List<T>. ImmutableArray<T>Bunun yerine kullanın .
Theodor Zoulias

1
Hehe, zaten C5 kullanıyorum ama değişmez koleksiyonlar için neyin mevcut olduğunu görmek için arıyorum (anlık görüntülerin ötesinde). Teşekkürler! Başka birinin bunu bir şekilde şekil veya formda çözdüğünü ümit edeceğim, ama şunu aklımda tutacağımImmutableSortedSet
J Trana

@TheodorZoulias Günlük (N) TryGetValue yöntemi çalışırken, SortedDictionary BinarySearch yöntemi sahip olmanın anlamı nedir? buraya bakın
Giorgi Chkhikvadze

2
@GiorgiChkhikvadze the BinarySearch , tam bir eşleşme bulunmaması durumunda, aradığınız öğeden daha büyük bir sonraki öğeyi size verebilir.
Theodor Zoulias

1
@GiorgiChkhikvadze Muhtemelen buradaki en büyük fark, dönüş değerinin koleksiyondaki tek bir değer değil, koleksiyona verimli bir şekilde endeksleme yolu olmasıdır. BinarySearch yöntemi sadece değeri verimli bir şekilde bulduğu için değil, Theodor'un işaret ettiği gibi bir bayan durumunda bile bir indeks bulduğu için özeldir - örneğin bir diziye hızlı erişim sağlar. Yine de bir ağaç söz konusu olduğunda, bir tamsayı dizini yapıya erişmek için etkili bir yol olmayabilir; C ++ bunu bir yineleyici nesnesi (kendi karmaşıklıkları olsa da) kullanarak çözer.
J Trana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.