哈希表(Hash Table)原理和代码

news/2024/11/7 18:49:32/

哈希表(Hash Table)是一种高效的数据结构,用于存储键-值对(Key-Value pairs)。它通过将键映射到数组的索引位置来实现快速的插入、查找和删除操作。哈希表的核心原理是使用哈希函数将键转换为对应的数组索引,从而实现快速的数据访问。

哈希表的基本原理如下:
1. 定义哈希表的大小(数组的长度)。
2. 设计哈希函数,该函数将键映射到哈希表的索引位置。
3. 创建一个数组作为哈希表的存储结构。
4. 将键通过哈希函数转换为索引,并将对应的值存储在数组的相应位置。
5. 当需要查找或删除键对应的值时,使用哈希函数找到对应的索引,并在该位置查找或删除值。
6. 处理哈希冲突(多个键映射到相同的索引位置)的情况,以确保键的唯一性和数据的完整性。

以下是一个简单的用C语言实现的哈希表示例:

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLE_SIZE 10

// 哈希表节点结构
typedef struct {
    char* key;
    int value;
} Node;

// 哈希表结构
typedef struct {
    Node* nodes[TABLE_SIZE];
} HashTable;

// 创建哈希表
HashTable* createHashTable() {
    HashTable* hashTable = malloc(sizeof(HashTable));
    memset(hashTable, 0, sizeof(HashTable));
    return hashTable;
}

// 哈希函数
int hash(char* key) {
    int hashValue = 0;
    int length = strlen(key);
    for (int i = 0; i < length; i++) {
        hashValue += key[i];
    }
    return hashValue % TABLE_SIZE;
}

// 向哈希表插入键值对
void insert(HashTable* hashTable, char* key, int value) {
    int index = hash(key);
    Node* newNode = malloc(sizeof(Node));
    newNode->key = key;
    newNode->value = value;
    hashTable->nodes[index] = newNode;
}

// 根据键查找哈希表中的值
int find(HashTable* hashTable, char* key) {
    int index = hash(key);
    if (hashTable->nodes[index] != NULL && strcmp(hashTable->nodes[index]->key, key) == 0) {
        return hashTable->nodes[index]->value;
    }
    return -1;  // 未找到对应的值
}

int main() {
    HashTable* hashTable = createHashTable();

    // 向哈希表插入键值对
    insert(hashTable, "apple", 10);
    insert(hashTable, "banana", 20);
    insert(hashTable, "orange", 30);

    // 查找键对应的值
    int value = find(hashTable, "banana");
    if (value != -1) {
        printf("找到键对应的值:%d\n",

 value);
    } else {
        printf("未找到键对应的值\n");
    }

    return 0;
}
```


http://www.ppmy.cn/news/99909.html

相关文章

数据分析之Pandas--数据检索

数据分析之Pandas&#xff08;03&#xff09;--数据检索 pandas的数据检索功能是其最基础也是最重要的功能之一。 pandas中最常用的几种数据过滤方式如下&#xff1a; 1. 行列过滤&#xff1a;选取指定的行或者列 2. 条件过滤&#xff1a;对列的数据设置过滤条件 3. 函数过…

KVM虚拟化技术学习-KVM管理

二&#xff0c;KVM管理 1.升级配置 1.创建一个空磁盘卷 [rootlocalhost ~]# qemu-img create -f qcow2 /kvm/images/disk2.qcow2 5G Formatting disk2.qcow2, fmtqcow2 size5368709120 encryptionoff cluster_size65536 lazy_refcountsoff 2.修改配置文件 <disk typefi…

如何使用 service account 获取 keycloak 的用户信息

Keycloak 是一个开源的权限管理和认证系统。使用 Keycloak 可以让开发者专注于解决业务的核心问题。获取用户信息是权限管理和认证系统需要的基本功能。Service Account 是OAuth 2.0推荐的系统服务使用的账户&#xff0c;开发者可以通过 Keycloak 的 Service Account 来让自己的…

ChatGPT自动生成思维导图

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349; ChatGPT自动生成思维导图 文章目录 &#x1f350;问题引入&#x1f350;具体操作markmapXmind &#x1f433;结语 &#x1f…

idea不识别yml文件了

添加上这两个就好了

FFmpeg5.0源码阅读——mov文件格式解析

摘要&#xff1a;之前在Mp4格式详解中详细描述了Mp4文件格式的具体布局方式。为了更加深入理解mp4文件格式&#xff0c;本文记录了ffmpeg中解封装mp4文件的基本实现。关键字:mov、FFmpeg、mp4 1 简介 mp4文件格式是现如今网络上最常见的视频文件格式&#xff0c;其和mov等格式…

《数据库系统概论》期末考试手写笔记汇总+考试注意事项+反思(超全整理总结!!!)

&#xff08;一&#xff09;期末考试手写笔记汇总 笔记内容为期末考试前整理&#xff08;结合测试题PPT作业题目课本&#xff09; 很多内容为纯手写&#xff0c;非常的全乎&#xff0c;预祝你期末可以考个好成绩&#x1f339; 第二章第三章&#xff08;25分&#xff09; (…

POWERLINK协议在stm32单片机+w5500移植成功经验分享

连续折腾了多个晚上&#xff0c;又趁周末又花了一天时间&#xff0c;终于把powerlink协议移植成功到单片机上啦。本想放弃&#xff0c;但想了下不管我能不能用上&#xff0c;结个尾吧&#xff0c;分享给有需要的人。放弃并不难&#xff0c;但坚持一定很酷。为了移植测试这个协议…