Minta hash tábla implementálása C/C++-ban

Minta hash tábla implementálása C/C++-ban

Bevezetés

A hash tábla egy hatékony adatszerkezet, amely lehetővé teszi a kulcs-érték párok tárolását és gyors lekérdezését. A kulcs egy egyedi azonosító, amely egy adott értékre mutat. A hash függvény segítségével a kulcs egy hash értékre képeződik le, amely meghatározza az érték tárolásának helyét a hash táblában.

A hash tábla implementálása C/C++-ban lehetővé teszi, hogy az adatokat rendkívül hatékonyan tároljuk és kezeljük, jelentősen javítva a kulcs-érték lekérdezések teljesítményét.

Hash tábla implementálása C/C++-ban

2.1. C struktúra

A C/C++ programozási nyelvekben a hash táblát egy struktúra segítségével implementálhatjuk:

c
typedef struct hash_node {
char *key;
int value;
struct hash_node *next;
} hash_node;

typedef struct hash_table {
int size;
hash_node **table;
} hash_table;

A hash_node struktúra tárolja az egyes kulcs-érték párokat, míg a hash_table struktúra az egész hash táblát képviseli.

2.2. Hash függvény

A hash függvény felelős a kulcs hash értékének kiszámításáért. A C/C++ programozási nyelvekben a következő hash függvény használható:

c
int hash_function(char *key) {
int hash = 0;
while (*key != '\0') {
hash = hash 31 + key++;
}
return hash;
}

Ez a hash függvény a kulcs karaktereit egymás után összegzi, és eltolja őket a 31-es szorzóval.

2.3. Hash tábla létrehozása

A hash tábla létrehozása az alábbi lépéseket foglalja magában:

1. Memória lefoglalása a hash táblához:

c
hash_table *create_hash_table(int size) {
hash_table table = (hash_table )malloc(sizeof(hash_table));
table->size = size;
table->table = (hash_node *)malloc(sizeof(hash_node *) size);
for (int i = 0; i < size; i++) {
table->table[i] = NULL;
}
return table;
}

2. Az egyes vödörlisták inicializálása:

c
void init_hash_table(hash_table *table) {
for (int i = 0; i < table->size; i++) {
table->table[i] = NULL;
}
}

2.4. Elem beszúrása a hash táblába

A hash táblába való elem beszúrása a következő lépéseket foglalja magában:

1. A kulcs hash értékének kiszámítása:

c
int hash_value = hash_function(key);

2. A kulcsnak megfelelő vödörlista lekérdezése:

c
hash_node *bucket = table->table[hash_value % table->size];

3. A vödörlistán való iterálás és az elem beszúrása:

c
while (bucket != NULL) {
if (strcmp(bucket->key, key) == 0) {
bucket->value = value;
return;
}
bucket = bucket->next;
}

hash_node new_node = (hash_node )malloc(sizeof(hash_node));
new_node->key = strdup(key);
new_node->value = value;
new_node->next = table->table[hash_value % table->size];
table->table[hash_value % table->size] = new_node;

2.5. Elem keresése a hash táblában

A hash táblában való elem keresése a következő lépéseket foglalja magában:

1. A kulcs hash értékének kiszámítása:

c
int hash_value = hash_function(key);

2. A kulcsnak megfelelő vödörlista lekérdezése:

c
hash_node *bucket = table->table[hash_value % table->size];

3. A vödörlistán való iterálás és az elem keresése:

c
while (bucket != NULL) {
if (strcmp(bucket->key, key) == 0) {
return bucket->value;
}
bucket = bucket->next;
}

return NULL;

2.6. Elem törlése a hash táblából

A hash táblából való elem törlése a következő lépéseket foglalja magában:

1. A kulcs hash értékének kiszámítása:

c
int hash_value = hash_function(key);

2. A kulcsnak megfelelő vödörlista lekérdezése:

c
hash_node *bucket = table->table[hash_value % table->size];

3. A vödörlistán való iterálás és az elem keresése:

c
hash_node *prev = NULL;
while (bucket != NULL) {
if (strcmp(bucket->key, key) == 0) {
if (prev == NULL) {
table->table[hash_value % table->size] = bucket->next;
} else {
prev->next = bucket->next;
}
free(bucket->key);
free(bucket);
return;
}
prev = bucket;
bucket = bucket->next;
}

Következtetés

A hash táblák hatékony adatszerkezetek a kulcs-érték párok tárolására és gyors lekérdezésére. A C/C++ programozási nyelvekben való implementálásuk egyszerű és hatékony, ami lehetővé teszi az adatok gyors tárolását és kezelését. A hash táblák széles körben használatosak adatbázisokban, cache-elési rendszerekben és más alkalmazásokban, ahol a nagy mennyiségű adat gyors lekérdezése elengedhetetlen.

GYIK

1. Mi a különbség a hash tábla és a bináris keresőfa között?

A hash táblák a kulcsok egy hash függvénnyel való leképezésével tárolják az adatokat, míg a bináris keresőfák a kulcsokat rendezett sorrendben rendezik. A hash táblák gyorsabb kulcs-érték lekérdezéseket tesznek lehetővé, de nem támogatnak rendezett hozzáférést az adatokhoz.

2. Milyen a jó hash függvény tulajdonságai?

Egy jó hash függvény egyenletesen oszlatja el a kulcsokat a hash táblában, minimalizálva az ütközéseket. Ideal esetben véletlenszerűnek és gyorsan kiszámíthatónak kell lennie.

3. Hogyan kezeljük az ütközéseket a hash táblákban?

Az ütközéseket általában láncolással vagy nyílt címezéssel kezelik. A láncolás egy vödörlistát használ az ütköző kulcsok tárolására, míg a nyílt címezés alternatív pozíciókat használ a táblában az ütköző kulcsok tárolására.

4. Milyen a hasitási faktor és hogyan befolyásolja a hash tábla teljesítményét?

A hasitási faktor a kulcsok számának és a hash tábla méretének aránya. Egy magas hasitási faktor leromlik a hash tábla teljesítményét az ütközések növekedése miatt.

5. Hogyan méretezünk egy hash táblát?

A hash táblát méretezhetjük a méret növelésével vagy csökkentésével az adatok mennyiségének növekedésével vagy csökkenésével. A méret beállításához újra kell használnunk az összes kulcsot, hogy megőrizzük az ütközéseket.

6. Milyen alkalmazásokban használnak hash táblákat?

A hash táblákat széles körben használják adatbázisokban, cache-elési rendszerekben, fordítókban és más alkalmazásokban, amelyek gyors kulcs-érték lekérdezéseket igényelnek.

**7.

  A legjobb 9 személyes költségvetés-tervező szoftver pénzügyi céljainak eléréséhez