2010-10-20 8 views
18

Olası Çoğalt:
Why should hash functions use a prime number modulus?Karma tablo: neden boyut birincil olmalı?

Neden karma tablonun (veri yapısı) için gerekli olan boyutu asal olmak?

Anladığım kadarıyla, daha eşit bir dağılımı garanti eder, ancak başka bir nedeni var mı?

+3

Bu, "Karma işlevleri neden asal sayı modülü kullanmalı?" Nın bir kopyasıdır (http://stackoverflow.com/questions/1145217/why-should-hash-functions-use-a-prime-number-modulus) - kenar çubuğunun "İlgili" bölümündeki ilk bağlantı - ve bence [kabul edilen cevap] (http://stackoverflow.com/questions/1145217/why-should-hash-functions-use-a-prime- sayı modülü/1147232 # 1147232) çok iyi. –

+0

Bir yanıtı kabul etmelisiniz. – gwg

cevap

26

Değerlerin az sayıda kümeye kümelenmesini önlemek (evet, dağıtım). Daha da dağıtılmış bir hashtab daha tutarlı bir performans sergileyecek. http://srinvis.blogspot.com/2006/07/hash-table-lengths-and-prime-numbers.html

den

{x, 2x, 3x, 4x, 5x, 6x ...}, daha sonra bütün bu kümelenmiş olacak diğerleri arasında aşağıdaki hashCodes içinde hashCode işlevi sonuçlarını kabul edersek sadece m sayısı, m = table_length/GreatestCommonFactor (table_length, x). (Bunu doğrulamak/türetmek önemsizdir). Şimdi birini yapabilirsiniz Kümeleme önlemek için aşağıdaki

  1. emin {x, 2x, 3x, 4x, 5x, 6x gibi başka hashCode katları olan çok fazla hashCodes üretemeyen olun. ..} Ancak, hashTable'ın milyonlarca girişe sahip olması gerekiyorsa bu zor olabilir. Veya GreatestCommonFactor (table_length, x) değerini 1'e eşit yaparak, yani x ile table_length coprime yaparak, tablo_length ile eşittir. Ve eğer x hemen hemen herhangi bir sayı olabilirse, o zaman table_length'in asal sayı olduğundan emin olun.

+1

Sanırım benim anlayışım doğruydu: Kümelenmekten kaçının <=> Daha iyi bir dağıtım alın. Sağ? Referans için teşekkürler. –

+6

@Olivier Lalonde, eğer bu soruya cevap verdiyse, lütfen cevap olarak işaretleyin. –

-5

Eğer bir tamsayı olsun kullanmak ne olursa olsun hashfunction. Bunu hashtable ile eşleştirmek için genellikle eşleştiriciyi mod tamsayısı ile eşleştirin, bu değeri haritalamak için tablonun boyutundan daha küçük olacak şekilde hashtable.

dönüş hashVal% tableSize

Ben itibaren ama tableSize bile eğer IIRC, tüm girişler bile olacak bu noktadan kayıp biraz değilim. Hasarının yarısı asla doldurulmayacak.

+1

Bu başka bir iyi nokta. Ve bir asalın nedeninin kalıpların riskini azalttığı (örneğin, 10, 20, 30, 40'lık tüm eğer tabloSize = 10 ise 0 verir) ve @Sam tarafından belirtildiği gibi eşit olmayan bir dağılımla sonuçlanabileceğine inanıyorum. . –

+3

% 347% 20 7, ki bu bile değil. –