哈希表基础及应用

发布于:2024-04-14 ⋅ 阅读:(173) ⋅ 点赞:(0)

哈希表结构体

        头文件 “uthash.h
        typedef struct HASH
        {
            int key;
            int value;                       
//不是必需的
            UT_hash_handle hh;    //头文件定义的类型
        }tHash;                   //用户自己定义

        在结构体定义中,key的数据类型可以是整型、字符、指针等

        value的类型也是自定义的,value不一定存在的
        可以在结构体中只定义key值,这样哈希表就只关注表中有没有某个key,而不关心它对应的value值;

        typedef struct HASH
        {
            int key;

            UT_hash_handle hh;    //头文件定义的类型
        }tHash;                   //用户自己定义

        结构体中key的定义一定要有,UT_hash_handle hh也不能去掉。

初始化哈希表

        tHash *hash_table = NULL;

查找元素

        HASH_FIND_INT( hash_table , &user_id, temp );

        hash_table :待查询的hash表;
        &user_id:指向想查询的key的地址;user_id表示要查的key值,前面加& 取址;
        temp:表示该函数的输出值,根据user_id查到的键值对;它是一个指向哈希表users中一个键值对的指针。
        因此在调用该函数前,要先定义s, 完整用法如下:

        tHash *temp;

        HASH_FIND_INT(hash_table,&user_id,temp);

        if(temp == NULL)

        {

                //xxxx    no find

        }

        else

        {

                //xxx   have find

        }

插入元素

       保持哈希表中的唯一性,在插入键值对之前,一定要先判断表中是否已经存在要插入的键,如果已存在,就直接修改键对应的value;如果没有存在,插入键值对。

        HASH_ADD_INT( hash_table , id, temp );

        hash_table :待插入的hash表;

        id:key域的变量名;

        s:待插入的键值对结构体,是指针形式。

        tHash *temp;

        HASH_FIND_INT(hash_table,&user_id,temp);

        if(temp == NULL)

        {

               temp = (tHash *)malloc(sizeof(tHash));
               temp->key = id;
               temp->value = 100;
               HASH_ADD_INT(hash_table ,key,temp);
        }

        else

        {

                //xxx   have find

        }

统计元素个数

        num_users = HASH_COUNT(hash_table );

        hash_table :待统计元素个数的hash表

        函数输出即为哈希表中存在的键值对个数

应用

        LeetCode两数之和

        给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
 

struct hashTable
{
    int key;
    int val;
    UT_hash_handle hh;
};

struct hashTable* hashtable;

struct hashTable* find(int ikey)
{
    struct hashTable* tmp;
    HASH_FIND_INT(hashtable, &ikey, tmp);
    return tmp;
}

void insert(int ikey, int ival) 
{
    struct hashTable* it = find(ikey);
    if (it == NULL)
    {
        struct hashTable* tmp = malloc(sizeof(struct hashTable));
        tmp->key = ikey, tmp->val = ival;
        HASH_ADD_INT(hashtable, key, tmp);
    }
    else
    {
        it->val = ival;
    }
}