2010-03-23 20 views
10

Bu konuda herhangi bir bilgi bulamıyorum, bu yüzden stackoverflow'a dönüyorum. C++ std :: tr1 :: unordered_map yineleyicileri ne kadar verimli? Özellikle liste yineleyicileriyle karşılaştır. Verimli yinelemeye izin vermek için listedeki tüm anahtarları da içeren bir sarmalayıcı sınıfının yapılması mantıklı olur mu (kodum unordered_map içindeki tuşlar üzerinde çok fazla yineleme kullanıyor). Güçlendirme önerecekler için kullanamıyorum (her ne sebeple olursa olsun).Yineleyicilerin verimliliği unordered_map (C++)

cevap

8

Unordered_map yineleyicisi temel olarak, hashtable'ın iç ağaç yapısının üzerinden geçmelidir. Bu sadece bir işaretçi yapmak anlamına gelir ve bu yüzden oldukça verimli olmalıdır. Elbette, unordered_map bir çok yürüyorsa, ilk etapta yanlış veri yapısını kullanıyor olabilirsiniz. Her durumda, tüm performans soruları için olduğu gibi, bunun cevabı, özel kodunuzu yeterince hızlı olup olmadığını görmek için zaman ayırmanızdır.

+1

_ "Unordered_map yineleyicisi temelde yalnızca hashtable'ın iç ağaç yapısını geçmek zorunda. Bu sadece bir işaretçi yapmak anlamına geliyor ve bu da oldukça verimli olmalı." _ Bu tam olarak bilimsel değil, değil mi? –

+1

"hashtable'ın iç ağaç yapısı" Bir treemap düşündüğünüze benziyor. Bu bir hashmap ve bir ağaç değil. Genellikle dolu hücrelerin birçoğunda boş hücreler ve birkaç bağlantılı liste içeren bir dizi olurdu. – mako

+0

Bunun en çok vurgulanan cevap olduğuna şaşırıyorum. Bir std :: haritası bir ağaç yapısına sahiptir. Bir std :: unordered_map yapmaz. Haritanın yineleyicisinin neden tüm harita üzerinde doğrusal zamanda çalıştığını görmek kolaydır. Bir unordered_map için, tüm insert/remove işlemleri için ekli bir liste overlay'ı yönetmediği sürece bunu yapmak daha zor olsa da (bu durum, düğüm listesindeki tüm elemanlara karşılık gelen bağlantılı listeden düğümleri "sonraki" operasyonları önemsiz kılar). – codetaku

8

Ben TR1 Kontrol etmedim ama N3035 (C++ 0x taslak) bu diyor ki: Yineleyicilerin ait

Tüm kategoriler sabit belirli bir kategori için gerçekleşebilir yalnızca bu işlevleri gerektiren zaman (itfa edilmiş). Bu nedenle, yineleyicileri için gereksinim tablolarının karmaşıklık sütunu yoktur.

standart karmaşıklık açısından dışında bir verimlilik garantisi vermeyecek, bu yüzden onlar (yani doğrusal zaman hem sabit zaman amorti olduğunuzu dışında hiçbir garanti list karşılaştırılmasını ve unordered_map var kap üzerinde tam bir yineleme).

Uygulamada, bir unordered_map yineleyici sizin HashMap çok seyrek doldurulur sürece, en az list civarında olmasını beklersiniz. Tam yinelemenin karmaşıklığında bir O (kova sayısı) terimi olabilir. Ancak, C++ için özel bir uygulama olan unordered_map'a hiç bakmadım. Bu yüzden, basit bir "bağlantılı liste dizisi" sağlamada hangi süslemelerin beklendiğini bilmiyorum. Eğer "tipik" bir platform test ederseniz, kesinlikle tüm C++ uygulamalarında mümkün olan en hızlı olacak kodu yazmaya çalışıyorsanız, zor şansınız varsa ;-);

5

Ne yazık ki, ' Denediyseniz ve sonuçları ölçmedikçe bir şeyin yeterince verimli olup olmadığını kesin olarak söyleyin. Standart kütüphane, TR1 ve Boost sınıflarının üzerinde tonlarca göz olduğunu söyleyebilirim. Muhtemelen en yaygın kullanım vakalarını alabilecekleri kadar hızlılar. Bir konteynırda yürümek kesinlikle yaygın bir kullanım örneğidir. Bütün söyledi

, kendinize bir kaç soru sormak gerekir:

  1. İstediğimi söylemek en net yolu nedir? Bir sarmalayıcı sınıfının yazılması, kodunuza gereksiz bir karmaşıklık eklemektedir. İlk önce doğru yapın, ardından hızlı yapın.

  2. list'u unordered_map ile paralel olarak sürdürmek için fazladan bellek ve zaman alabilir miyim?

  3. unordered_map gerçekten doğru veri yapısı mıdır? En yaygın kullanım durumunuz baştan sona geçiyorsa, vector ile daha iyi durumda olabilirsiniz, çünkü belleğin bitişik olması garanti edilir.kriterler tarafından Yanıtlanmış

İlgili konular