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
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.
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 ;-);
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:
İ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.
list
'uunordered_map
ile paralel olarak sürdürmek için fazladan bellek ve zaman alabilir miyim?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ış
burada https://stackoverflow.com/a/25027750/1085128 unordered_map vektörü arasındaki partway ve yineleme için harita. Haritadan çok daha hızlıdır.
_ "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? –
"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
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