2011-11-20 26 views
8

Bu siteden ve diğer sitelerden aynı şeyi isteyen diğer sorulara bakmaya devam etmeden önce bundan bahsetmek isterim. Umarım iyi bir yanıt bulabilirim, çünkü hedefim iki yönlüdür:Bir karma tablosu nasıl oluşturulur

  1. En başta, bir karma tablonun nasıl oluşturulacağını öğrenmek istiyorum. İkinci olarak, Yığın Taşması üzerine birçok yanıtın, özellikle de yeni türler için genellikle orada olmayan bir konuda belirli bir düzeyde bilgi sahibi olma eğiliminde olduğunu görüyorum. Bu söyledikten sonra, ana mesajımı kendim çözdüğümde biraz daha derinlemesine bir açıklama içerecek şekilde düzenlemeyi umuyorum.

    Bugüne kadar onları anlamak gibi

    , bir karma tablo listelerinin bir dizi (veya benzer bir veri yapısı) 'dir, optimal olarak birkaç çarpışmalar umuyor: Ana yemek üstüne


O (1) karmaşıklığı övünmek için mümkün olduğu kadar.

Yani benim ilk adım işaretçiler bir dizi oluşturmaktır::

Elem ** table; 
table = new Elem*[size];//size is the desired size of the array 

Benim ikinci adım, bir karma işlev (çok basit bir) oluşturmaktır şu benim şimdiki süreçtir.

int hashed = 0; 
hashed = (atoi(name.c_str()) + id) % size; 
//name is a std string, and id is a large integer. Size is the size of the array. 

Benim üçüncü basamak Şu anda yaşıyorum parçası olan çarpışmaları algılamak için bir şey yaratmak olacaktır.

İşte bazı sözde kod: Nispeten inelegant var

while(table[hashedValue] != empty) 
    hashedValue++ 

else 
    put in the list at that index. 

ama "nedir bu" aşamada hala duyuyorum. Benimle kal.

Başka bir şey var mı? Bir şeyi mi özledim yoksa yanlış bir şey mi yaptım?

Teşekkür

+1

Tamam görünüyor. Karma değer, sabit bir diziye indekslenir ve her dizi öğesi, gerçek değerlerin bir listesidir. –

cevap

3

Sap hiç boş yuvaları bulma ve masa boyutlandırma.

1

Elem için bir tanım eksik. Bu, chaining ya da bir sondaj karma tablosu isteyip istemediğinize bağlı olarak önemsiz değildir.

+0

Üzgünüm, sağladığım bir tanım var.Bağlı bir liste. – Joshua

+0

@Joshua: daha sonra çarpışma tespiti, kopyaları saklamak istemediğinizi varsayarak, sadece bu listeyi yürüyüş meselesidir. –

0

Bir karma işlevi aynı veriler için aynı değeri üretir. Bununla birlikte, çarpışma kontrolünüz bu değeri değiştirir, yani karma değer sadece girdiye değil aynı zamanda karma haritasındaki diğer öğelerin varlığına da bağlıdır. Bu kötü bir şeydir, zira neredeyse hiçbir zaman isminden önce girdiğiniz öğeye erişemezsiniz, sadece harita üzerinde yineleme yoluyla.

İkinci olarak, çarpışma kontrolünüz taşma/aralık hatalarından etkilenmez, çünkü haritanın büyüklüğünü kontrol etmeden yalnızca karma değerini artırırsınız (yine de daha önce söylediğim gibi, bunu yapmamalısınız).

+0

Sanırım yeterince bilgi vermedim, üzgünüm. Benim hashing ettiğim nesne özel bir isme ve kimliğe sahip, bu yüzden her ikisi de nesnede her zaman mevcut. – Joshua

+0

@Joshua: Ben öyle demek istemedim. Çarpışma kontrolünüzde, hesaplanan noktanız ücretsiz değilse (ve bir sonraki nokta da ücretsiz değilse) karma değerini değiştirirsiniz. Bu, karma haritasının yüküne bağlı olarak, aynı dizi boyutu için, öğenin aynı karma değer (yani bir çarpışma olduğunda) üretilmeden önce eklenmiş başka bir elemanın farklı pozisyonlara yerleştirilebileceği anlamına gelir. Bu, öğeye eklediğiniz anahtarla erişmenize izin vermez. – Xeo

İlgili konular