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.
- 1. Verimliliği
- 2. hash_map/unordered_map
- 3. C++ unordered_map, bir vektörle birlikte kullanıldığında başarısız
- 4. Anahtarları unordered_map
- 5. foldRight Verimliliği?
- 6. FindViewById Verimliliği
- 7. Neden unordered_map siparişi veriyor?
- 8. fonksiyon işaretçileri :: unordered_map
- 9. Unordered_map dosyasında işaretçi silme
- 10. Java döngü verimliliği
- 11. MSBuild Kopyalama Kompozisyonunun Verimliliği
- 12. ERD Dairesel bağımlılık verimliliği
- 13. Verimliliği.(). FindFirst atlama()
- 14. Python'da yol bulma verimliliği
- 15. Sorgu önbellek verimliliği
- 16. mac C++ derleyici bulamıyor <tr1/unordered_map>
- 17. C++ 11/Boost `unordered_map` silme sırasında neden geri dönmez?
- 18. python verimliliği ve bellekte büyük nesneler
- 19. std :: unordered_map için karma değer
- 20. std :: unordered_map bir std :: çifti ile
- 21. Verimliliği artırmak için tekrarlanan kodun nasıl önleneceği
- 22. Hiçbir şey atılmadığında özel durum verimliliği
- 23. Python sınıf örneği texas holdem verimliliği
- 24. std :: unordered_map <std :: String, myClass *> - std :: unordered_map :: erase() myClass 'DTor'unu çağırır mı?
- 25. Neden çifti unordered_set/unordered_map anahtarı olarak kullanamıyorum?
- 26. jQuery/javascript verimliliği için önbellekleme öğeleri?
- 27. python sözlüğünde uzun (str) tuşların verimliliği
- 28. Java'nın Toplama Yığını veri yapısının verimliliği
- 29. Python: listenin üzerine çıkarak dict öğeleri verimliliği
- 30. boost :: uuids :: ud anahtarında bir anahtar olarak gd :: unordered_map?
_ "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