SORU
17 Temmuz 2009, Cuma


Neden karma fonksiyonları bir asal sayı modülü kullanmalıyım?

Uzun zaman önce, $1.25 için pazarlık masadan veri yapıları bir kitap aldım. Bu, bir karma fonksiyon için bir açıklama sonuçta çünkü bir asal sayı ile mod gerektiğini söyledi "matematik ve doğa".

Dolar 1.25 bir kitaptan ne bekliyorsunuz?

Her neyse, yıl matematik doğası hakkında düşünme fırsatım oldu ve hala çözemedim.

Sayı dağılımı gerçekten kova asal sayı var daha? Ya bu herkes çünkü herkes kabul eden eski bir programcı hikayesibaşkakabul eder mi?

CEVAP
18 Temmuz 2009, CUMARTESİ


Genellikle basit bir hash fonksiyonu çalışır ederek "parçalar" giriş (karakter olarak davanın bir dize) ve çarparak onları güçlerin bazı sabit ve ekleme onlarla birlikte bazı tamsayı yazın. Örneğin bir dize, özellikle de tipik bir karma olabilir:

(first char)   k * (second char)   k^2 * (third char)   ...

Sonra dizeleri hepsi aynı ilk char olan bir grup fed, sonuçları en az bir tamsayı türü taşmaları kadar aynı modül k olacak.

[Bir örnek olarak, Java dize hashCode bu ürkütücü benzer karakterleri ters sırada, k=31 yapar. Sonuna dışında aynı dizeleri arasında aynı şekilde biten dizeler ve çarpıcı ilişkiler arasında çarpıcı ilişkiler bölümünden kalan 31 mod 2^32. Bu kadar ciddiye karma tablosu davranış uğraşmayı sevmez.]

Karma tablo bir kova sayısı üzerinde karma modülü alarak çalışır.

Bir karma tablo içinde önemli.

Şimdi, birisi aynı ilk karakter olması gibi öğeler arasında bir ilişki ve bir karma tablo değerleri içine bir sürü koyar sanırım. Bu oldukça öngörülebilir kullanım desen, derim, çok fazla çarpışma üretmek istemiyoruz.

"Matematik ve doğa" Sürekli Karma kullanılan ve kova sayısı, coprime vardır, o zaman çarpışmalar sık karşılaşılan bazı durumlarda en aza indirilir. çünkü o çıkıyor Eğer coprime onlar değilse, o zaman çarpışmaları minimize değildir girişler arasında oldukça basit bazı ilişkiler vardır. Tüm bu karma değeri ortak faktör var bunların uygulama ile ilişkisi olan kova 1/n th içine düşecekler bu da demek oluyor ki ortak faktör, eşit modül çıkıyor. N ortak faktör olduğu birçok çarpışmalar, n kez olsun. N bu yana en az 2, kullanımı oldukça basit bir dava için kabul edilemez, normal olarak en az iki kat daha fazla çarpışma oluşturmak için olduğunu söyleyebilirim. Eğer bazı kullanıcı kovalarda bizim dağıtım kıracak olursa, bu bir kaza, bazı basit ve öngörülebilir kullanım olmak istiyoruz.

Şimdi, karma tablo uygulamaları belli öğeleri onları içine koymak üzerinde hiçbir kontrole sahip. Onlarla ilgili engel olamazlar. Yapacak o kadar şey sabit ve demet sayar coprime sağlamaktır. Güvenerek değil mi bu "son" bazı küçük ortak faktör açısından kova modülü belirlemek için bileşen yalnız. Bunu başarmak için Başbakan olmak, sadece coprime yok bildiğim kadarıyla.

Ama eğer karma işlevi ve karma tablosu bağımsız olarak yazılmış, daha sonra karma tablo karma işlevi nasıl çalıştığını bilmiyor. Küçük faktörler ile bir sabit kullanarak olabilir. Eğer şanslıysan tamamen farklı ve doğrusal olmayan olabilir. Eğer karma yeterince iyi değilse, o zaman herhangi bir kova sayısı gayet iyi. Ama paranoyak bir karma tablo iyi bir karma işlev, bu yüzden kova asal sayı kullanmanız gerekir varsayalım. Aynı şekilde paranoyak bir karma işlev bir largeish biri sabit ile ortak bir faktör var olur kovalar bir dizi kullanır olasılığını azaltmak için Başbakan sürekli kullanmanız gerekir.

Uygulamada, oldukça normal kova sayısı 2 güç kullanmak olduğunu düşünüyorum. Bu rahat ve etrafında aramak zorunda kaydeder veya önceden seçim doğru büyüklükte bir asal sayı. Genellikle güvenli bir varsayım olan hash fonksiyonu kullanmak için değil hatta çarpanları, güveniyor. Ama hala bir karma işlevlerine göre zaman zaman kötü karma davranışları yukarıda ve Başbakan kovaları daha fazla yardımcı olabilir.

Koyarak, "her şeyi Başbakan olması" yeterli ama hashtables iyi dağıtım için gerekli bir şart değil bildiğim kadarıyla. bu konuda prensibi Herkes diğerleriyle aynı kuralı takip varsayalım gerek kalmadan birlikte sağlar.

[Edit: başka, eğer lineer prob ile çarpışmaları tanıtıcı bir kova, bir asal sayı kullanmak için daha özel bir sebep yok O zaman sen hesapla bir adım gelen hashcode, ve eğer bu adım çıkar bir faktör kovaları sonra tek yapmak (bucket_count / adım) problar önce başladığımız yerdeyiz. Bu durumda en çok istediğiniz için kaçının. adım = 0, tabii ki, bir özel kasalı, ama önlemek için de özel kasa bucket_count / adım eşit küçük bir tamsayı, sadece yapmak bucket_count Başbakan değil, önemli olan adım verilir değil mi 0.]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013
  • RiverCityGraphix

    RiverCityGra

    6 Ocak 2012
  • Tome Rodrigo

    Tome Rodrigo

    9 Temmuz 2006