2012-04-12 19 views
8

İ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ı?

+0

Küme üyeliğini kontrol etmenin etkili bir yolu var mı (örneğin, hashtables tarafından destekleniyorlar)? – Thilo

+2

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. –

cevap

3

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 Na.size() en kötü durumda, 2 ortalama durumda ve N için N orantılıdır.

9

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)

+3

"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. –

+0

@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) –

İlgili konular