2016-03-26 22 views
-2

Doğru şekilde anlaşıldığı gibi, hash tablosu uygulayarak, giriş dizgisine dayalı olarak dizin hesaplanıyor ve basit bir anahtar - değer depolaması yapıyor.Vektör ile basit hash tablosu

Yani basit hash fonksiyonu SizeOfArray önceden tanımlanmış boyutu ile işaretçileri dizidir

int hash(string name){ 

    int index = 0; 
    int hash = 0; 
    for (int i = 0; i < name.length() ;i++){ 
     hash += (int)name[i]; 
    } 
    index = sizeOfArray % hash; 
} 

gibi bir şey olabilir. Bu dizin mevcut değilse, onu oluşturur. Ama bunu nasıl vektörlerle uygularım?

Vektör önceden tanımlı bir boyuta sahip değil. Otomatik olarak büyürler. Böylece sizeOfArray% karma değerinin değişmesi her zaman değişecektir.

Mantığın ardındaki tablo nedir? Büyüyen vektör/dizi ile bile endeksi hesaplamak için en iyi yöntem nedir?

+1

Neden bir dizi dize kullanmıyoruz? Ve çarpışmalar olabileceğinden, birden fazla dizenin bir hash anahtarına bağlanabilmesi gerektiğinden, dizinin bir dizi bağlantılı listesi (veya vektörü) kullanmanız daha iyidir. Bu arada, belki de sadece öğrenmek için bunu çok faydalıdır. Ancak, hash anahtarları derleyicinizle birlikte gelen birçok STL veri yapısının temelidir. –

+1

Karma tablolar hakkında bilgi edinmek iyi bir fikirdir, ancak öğrenme stilleriniz için değil, öğrenim amaçlı bir şey oluşturmayın, ['std :: unordered_map'] (http://en.cppreference.com/w/cpp/) kap/unordered_map). –

+0

Öğrenmek için incelemeler yapıyorum, bir veriyi birden çok veriyi tutacak şekilde dizinde saklamak istiyorum. – Darlyn

cevap

1

Hash tablosu için temel veri yapısı olarak vector<list<string>> kullanabilirsiniz.
Ayrıca, dizin hesaplaması yanlış var; sizeOfArray % hash yerine, diğer yol yuvarlak olmalıdır.

vector<list<string>> hash_table; 
const size_t hash_table_size = 100; 
hash_table.resize(hash_table_size); 

int hash(string name){ 
    int index = 0; 
    int hash = 0; 
    for (int i = 0; i < name.length() ;i++){ 
     hash += (int)name[i]; 
    } 

    index = hash % hash_table.size(); 
    hash_table[index].push_back(name); 
} 
+1

OP bu yararlı, ama - nitpicking bulmak gerekir - aslında gerçekte tabloya veri ekleme karma işlevi olmamalıdır: 'hash' çağırmak ayrı bir işlev eklemek gerekir (ve muhtemelen de%' s hash_table.size() '). Dahası, burada 'isim' bulunup bulunmadığını kontrol etmeden kovaya 'push_back' yapmamalısınız. Ancak, OP bu şeyleri emin bir şekilde sıralayabilir .... –