Bir asal sayıyı karma fonksiyonunda mod olarak kullanmak neden en iyisidir?


57

1 ile 100 arasında bir anahtar değerler listesine sahipsem ve bunları 11 kova dizisinde düzenlemek istiyorsam mod işlevi oluşturmam öğretildi.

H=kmod 11

Şimdi tüm değerler 9 satırda birbiri ardına yerleştirilecektir. Örneğin, ilk kovada 0,11,22 . İkincisi, 1,12,23 vb. Olacak .

Diyelim ki kötü bir çocuk olmaya karar verdim ve hassastım olarak asal olmayan bir şey kullanmaya başladım.

H=kmod 12

ilk kovada 0, 12, 24 \ nokta , ikincide 1, 13, 25 \ nokta vb. değerlere sahip bir karma tabloyla sonuçlanacaktır .0,12,241,13,25

Esasen onlar aynı şeydir. Çarpışmaları azaltmadım ve asal sayı karma kodunu kullanarak işleri daha iyi yaymadım ve bunun ne kadar yararlı olduğunu göremiyorum.


İlgili soru, neden
xor'u

Yanıtlar:


62

anahtar kümesini ve kova sayısının olduğu bir karma tabloyu düşünün . Yana bir faktördür , katları olan tuşlar katı olan kovalara karma edilecektir :m = 12 3 12 3 3K={0,1,...,100}m=1231233

  • Anahtarlar , kovasına karıştırılır .0{0,12,24,36,...}0
  • Anahtarlar kepçe getirilecektir .3{3,15,27,39,...}3
  • anahtarlarının kova sağlanacaktır .6{6,18,30,42,...}6
  • anahtarlarının kova .9{9,21,33,45,...}9

Eğer düzgün bir şekilde dağılmışsa (yani, her anahtarın eşit olarak olması muhtemeldir), seçimi o kadar kritik değildir. Ancak, düzgün dağılmazsa ne olur ? Ortaya çıkması en muhtemel anahtarların katları olduğunu hayal edin . Bu durumda, katı olmayan tüm kovalar yüksek olasılıkla boş olacaktır (karma tablo performansı açısından gerçekten kötüdür).K m K 3 3KKmK33

Bu durum göründüğü kadar yaygındır. Örneğin, bellekte depolandıkları yere göre nesneleri takip ettiğinizi düşünün. Bilgisayarınızın sözcük boyutu dört bayt ise, o zaman katları olan anahtarlara sahip olacaksınız . Tabii seçme söylemek katları olmak sahip olacaktır: korkunç bir seçim olacaktır tamamen boş kova ve kalan içinde çarpışan bütün anahtarlarınızı kova.m 4 3 m / 4 m / 44m43m/4m/4

Genel olarak:

sayısıyla ortak bir faktörü paylaşan her anahtar , bu faktörün bir katı olan bir kepçeye bağlanacaktır.mKm

Bu nedenle, çarpışmaları en aza indirmek için, ve elementleri arasındaki ortak faktörlerin sayısını azaltmak önemlidir . Bu nasıl başarılabilir? Seçerek a: çok az faktörler vardır bir numara olmaya asal sayı .K mmKm


Sorgunun cevabınıza uyduğunu gördüm . Sorgumdaki hash fonksiyonunun iyi olduğunu düşünüyor musunuz?
aşırı değişim

@overexchange: Sorunuzu cevapladım . Bu cevap sizin için de ilgi çekici olabilir.
Mario Cervera

neden bu kadar m seçiliyorsa, sadece K çarpıksa, bunun önemi nedir? K düzgün bir şekilde dağıtılmış olsa bile, kötü m ile daha kötü performans yaşayacağımız doğru değil mi?
18'de

"Kötü " ile ne demek istediğine bağlı . Eğer "karma tablosundaki element sayısına göre küçük" (yani yüksek yük faktörü ) demek istiyorsan , performans düşük olacaktır. Bununla birlikte, "asal değil" anlamına geliyorsa, o zaman tüm anahtarlar eşit derecede muhtemelse, hash tablosunda eşit olarak dağıtılacaklarsa, bu gerçek o kadar önemli değildir. Sorunun kendisi bir örnek teşkil ediyor. m
Mario Cervera

16

Bir çarpışmanın astarları kullanma olasılığının düşük olup olmadığı tuşlarınızın dağılımına bağlıdır.

Anahtarlarınızı birçok formu varsa ve hash fonksiyonu olan , IFF sonra bu anahtarlar kova küçük bir alt gidin böler . Bu yüzden , bir asal seçerek elde edilebilecek sayısının en aza indirilmesi gerekir ., H ( n ) = n- mod m b , n Ba+kbH(n)=nmodmbnb

Öte yandan ila kovaya sahip olmaktan hoşlanıyorsanız ve katları olan farklılıkların ve katları arasındaki farklardan daha muhtemel olduğunu biliyorsanız, çok özel uygulamanız için seçebilirsiniz .12 11 2 3 121112112312


1
Ama eğer anahtarlarım biçimine sahip değilse, o zaman etmez mi? Bu doğru mu? ma+k×bm
CodyBugstein

1
Anahtarların eşit dağıtılması durumunda @lmray, fark etmez. Eğer böyle değilse, onun için hassas dağılımına bağlı olacaktır önemi ya da olmamak. mmm
AProgrammer

Son düzenlemeyi geri aldım, olduğunu unuttum . 12>11
frafl

3
"İff bölü kovalarının küçük bir alt kümesine git" mi demek istediniz ? mbm
Mikhail Dubov

8

Bunun bir etkisinin olup olmadığı (ayrıca) çarpışmaları nasıl tedavi ettiğinize bağlıdır. Bazı açık karma değişkenler kullanıldığında, primerlerin kullanılması, masa yeterince boş olduğu sürece boş yuvaların bulunduğunu garanti eder.

Örneğin, aşağıdakileri göstermeye çalışın:

ve için sonradan pozisyonlarını deneyerek çarpışmayı giderecek ve çarpışmaları giderecek bir eleman eklemek istediğimizi varsayalım .a + i 2 i = 1 , 2 , aa+i2i=1,2,

Bu prosedürün her zaman boş bir pozisyon verdiğini gösterin, eğer karma tablo boyutundaysa , büyükse ve tüm pozisyonların en az yarısı boşsa .p 3pp3

İpucu Tortu sınıf halka modülo gerçeğini kullanarak , eğer bir alandır asal ve bu nedenle en sahip çözümler.p i 2 = c 2ppi2=c2


2

Eğer hash fonksiyonunuz biçimindeyse , burada asaldır ve rastgele seçilir, o zaman 2 ayrı anahtarın aynı kovaya hash olasılığı . Böylece için , çok azdır.m, bir 1h(k)=a×kmodmma m=1009Pr{h(x)=h(y),xY}=0,000991080271mm=1009Pr{h(x)=h(y),xy}=0.00099108027

Bu şema olarak bilinir: Evrensel Karma.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.