İki std::set
s verildiğinde, her iki sette eşzamanlı olarak yineleme yapabilir ve elemanları karşılaştırabilir ve sonuçta lineer karmaşıklığa neden olabilir. Bu, std::unordered_set
s için çalışmaz, çünkü öğeler herhangi bir sırada saklanabilir. std::unordered_set
için a == b
ne kadar pahalı? operator==
ve operator!=
aitEşitlik için iki sırasız seti karşılaştırmak ne kadar pahallı?
cevap
Karmaşıklık: ortalama durumda
Doğrusal karmaşıklık. N en kötü durumda, burada N kabın büyüklüğüdür. Standart §23.2.5 içinde
Daha fazla bilgi, nokta 11:
unordered_set
için
ve unordered_map
, karmaşıklığı operator==
(yani dönen yüklem için value_type
arasında ==
operatöre aramaların sayısı, key_equal()
ve hash_function()
tarafından döndürülen Hasher) için N
a.size()
en kötü durumda, 2 ortalama durumda ve N için N
orantılıdır.
En kötü durum O (n²).
Ama sıralanmamış setleri aslında hash tarafından emredilmektedir. Bu yüzden karmaları karşılaştırmak mümkündür (eğer bu başarısız olursa setler eşit olamaz) ve aynı karelerin (lineer) aynı değerlere sahip olduğunu doğrulayın (aynı hash ile farklı değerler için O (n²)).
En iyi durumda bu, O (n) dir.
Normalde karma işlevi "iyi" (farklı nesneler -> her zaman farklı karma) ve karma işlevi "kötü" ise O (n²) için karmaşıklık O (n) ye (her şey her zaman aynıdır. hash değeri)
"hash işlevi iyi (farklı nesneler -> her zaman farklı karma)" -> farklı karmalar bile bir karma karma algoritma için doğru olabilir (örneğin, 8 * 128 bitlik bir karma değer döndürerek 128 karaktere kadar karma dizeleri dize), ama kovaların sayısı içine mod ve sonuç çirkin. Çarpışmayı önleyen girişler için özel bir içgörü bulunmadığında, iyi bir karma işlev post modlaması genellikle kullanılmayan kepçelere oranla çarpışmalara sahiptir, bu da hala O (n) ortalamalarına neden olur. –
@TonyDelroy: Bunu işaret ettiğin için teşekkürler! Bir "iyi hash" sadece "farklı değerleri" değil, aynı zamanda kovalara "iyi dağıtılmış" bir saygı göstermelidir (karma alanın, söz konusu etkiyi en aza indirgemek için, kovalara muntazam ve asal düzeyde olması gerekir) –
- 1. ng-tekrarı içinde iki farklı nesneler için karşılaştırmak nasıl
- 2. .bat dosyası, iki metin dosyasını karşılaştırmak ve çıktıyı karşılaştırmak için
- 3. İki dizginin ne kadar olduğunu bulma
- 4. Asp.net karşılaştırmak için validator karşılaştırmak
- 5. Eşitlik için delegelerin test edilmesi
- 6. STL vektörlerini karşılaştırmak için bu iki yol arasındaki fark nedir?
- 7. Karşılaştırmak için iki SVN düzeltmesi karşılaştır: 4
- 8. Eşitlik için Scala işlev değerleri nasıl karşılaştırılır
- 9. Ne kadar akıllıca
- 10. Eşitlik operatörü (==) Eclipse
- 11. İskele ne kadar ölçeklenebilir?
- 12. Pygame Clock - Ne kadar süre için koşabilir?
- 13. mysql saklı yordamında iki sütun değerlerini karşılaştırmak için nasıl
- 14. iki diziyi karşılaştırmak için bir diziden diğerine JavaScript eklemeden önce
- 15. git kullanarak iki dosyayı bir dosyadan karşılaştırmak için
- 16. İki tabloyu karşılaştırmak ve uyumsuzlukları vurgulamak için Excel VBA kodu
- 17. İKİ FARKLI MySQL tablo sorgulamak ve karşılaştırmak için nasıl sonuçlar
- 18. Büyük sayı ne kadar?
- 19. İki kez Moment JS ile karşılaştırmak
- 20. C++ 'da iki string strcat'i karşılaştırmak istiyorum
- 21. LINQ tarihlerini karşılaştırmak için?
- 22. Eşitlik test
- 23. SIFR: Çok fazla ne kadar?
- 24. Seti sınırı array_agg için()
- 25. seti
- 26. Captcha Alternatif, ne kadar güvenli?
- 27. Sırasız resimlerin nasıl sıralanacağı
- 28. Chokidar (Node.js) ne kadar verimli?
- 29. Mondrian ne kadar bellek kullanıyor?
- 30. PHP'nin substr ne kadar verimli?
Küme üyeliğini kontrol etmenin etkili bir yolu var mı (örneğin, hashtables tarafından destekleniyorlar)? – Thilo
Açık, anlaşılır, C++ Standard kelimelerini anlamak ve anlamak kolaydır: "Sıralanmamış iki kapsayıcı a" ve "b" eşitse "a.size() == b.size()" ve eşittir. Eşdeğer anahtar grubu '[Ea1, Ea2]' 'a.equal_range (Ea1)' den elde edilen '' b.equal_range (Ea1 '') 'den elde edilen bir eşdeğer anahtar grubu vardır [Eb1, Eb2], mesafe (Ea1, Ea2) == mesafe (Eb1, Eb2) 've' is_permutasyon (Ea1, Ea2, Eb1) '' true' döndürür.' için 'unordered_set' ... operatörün karmaşıklığı == '... ortalama durumda N ile orantılı ve en kötü durumda 'N'' a.size() '' N^2'ye. –