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
- 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
Tamam görünüyor. Karma değer, sabit bir diziye indekslenir ve her dizi öğesi, gerçek değerlerin bir listesidir. –