Algoritmia - hashing

 
Vista:

hashing

Publicado por Serbulo (1 intervención) el 15/05/2007 14:46:19
QUISIERA OBTENER TODA LA AYUDA POSIBLE EN GASHIN EN VARIOS METODOS, COLISIONES Y SINONIMOS, ES URGENTE, POR FAVOR AYUDENME, EL CODIGO ES EN C++
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Introducción a hashing en C++

Publicado por Alejandro (307 intervenciones) el 11/03/2024 19:22:28
El hashing es una técnica utilizada para asociar datos con claves, permitiendo un acceso rápido a la información. A continuación, te proporcionaré una introducción a hashing en C++, abordando métodos, manejo de colisiones y sinónimos.

Hashing en C++:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <unordered_map>
#include <string>
 
using namespace std;
 
class HashTable {
private:
    unordered_map<int, string> table;
 
public:
    // Función de hash simple para enteros
    int simpleHash(int key) {
        return key % 10;  // Modificación del tamaño de la tabla según tus necesidades
    }
 
    // Función de hash para cadenas (ejemplo)
    int hashString(const string& key) {
        int hashValue = 0;
        for (char ch : key) {
            hashValue += ch;
        }
        return hashValue % 10;  // Modificación del tamaño de la tabla según tus necesidades
    }
 
    // Insertar elemento en la tabla
    void insert(int key, const string& value) {
        int index = simpleHash(key);  // Cambiar a hashString para claves de cadena
        table[index] = value;
    }
 
    // Buscar elemento en la tabla
    string search(int key) {
        int index = simpleHash(key);  // Cambiar a hashString para claves de cadena
        if (table.find(index) != table.end()) {
            return table[index];
        } else {
            return "No encontrado";
        }
    }
};
 
int main() {
    HashTable myHashTable;
 
    // Ejemplo de uso
    myHashTable.insert(42, "Ejemplo1");
    myHashTable.insert(23, "Ejemplo2");
    myHashTable.insert(55, "Ejemplo3");
 
    // Buscar elementos
    cout << "Resultado de búsqueda para clave 23: " << myHashTable.search(23) << endl;
    cout << "Resultado de búsqueda para clave 37: " << myHashTable.search(37) << endl;
 
    return 0;
}

Manejo de colisiones:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Implementación de hash con manejo de colisiones mediante listas enlazadas
#include <iostream>
#include <list>
#include <string>
 
using namespace std;
 
class HashTable {
private:
    static const int tableSize = 10;
    list<pair<int, string>> table[tableSize];
 
public:
    // Función de hash simple para enteros
    int simpleHash(int key) {
        return key % tableSize;
    }
 
    // Insertar elemento en la tabla
    void insert(int key, const string& value) {
        int index = simpleHash(key);
        table[index].push_back(make_pair(key, value));
    }
 
    // Buscar elemento en la tabla
    string search(int key) {
        int index = simpleHash(key);
        for (const auto& pair : table[index]) {
            if (pair.first == key) {
                return pair.second;
            }
        }
        return "No encontrado";
    }
};
 
int main() {
    HashTable myHashTable;
 
    // Ejemplo de uso
    myHashTable.insert(42, "Ejemplo1");
    myHashTable.insert(23, "Ejemplo2");
    myHashTable.insert(55, "Ejemplo3");
 
    // Buscar elementos
    cout << "Resultado de búsqueda para clave 23: " << myHashTable.search(23) << endl;
    cout << "Resultado de búsqueda para clave 37: " << myHashTable.search(37) << endl;
 
    return 0;
}

Hashing con sinónimos (open addressing - sondas lineales):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
 
using namespace std;
 
class HashTable {
private:
    static const int tableSize = 10;
    pair<int, string> table[tableSize];
 
public:
    // Función de hash simple para enteros
    int simpleHash(int key) {
        return key % tableSize;
    }
 
    // Insertar elemento en la tabla con manejo de colisiones
    void insert(int key, const string& value) {
        int index = simpleHash(key);
        while (table[index].first != -1) {
            // Sonda lineal en caso de colisión
            index = (index + 1) % tableSize;
        }
        table[index] = make_pair(key, value);
    }
 
    // Buscar elemento en la tabla
    string search(int key) {
        int index = simpleHash(key);
        int originalIndex = index;
        while (table[index].first != -1) {
            if (table[index].first == key) {
                return table[index].second;
            }
            // Sonda lineal en caso de colisión
            index = (index + 1) % tableSize;
            if (index == originalIndex) {
                break;  // Evitar bucle infinito
            }
        }
        return "No encontrado";
    }
};
 
int main() {
    HashTable myHashTable;
 
    // Ejemplo de uso
    myHashTable.insert(42, "Ejemplo1");
    myHashTable.insert(23, "Ejemplo2");
    myHashTable.insert(55, "Ejemplo3");
 
    // Buscar elementos
    cout << "Resultado de búsqueda para clave 23: " << myHashTable.search(23) << endl;
    cout << "Resultado de búsqueda para clave 37: " << myHashTable.search(37) << endl;
 
    return 0;
}

Estos ejemplos te proporcionan una base para trabajar con hashing en C++. Puedes adaptar las funciones de hash y los métodos de manejo de colisiones según tus necesidades específicas. Recuerda que este código es bastante simplificado y no aborda problemas más avanzados como la gestión dinámica de la tabla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar