哈希表的实现(C++ 和 C 语言)

devtools/2024/10/22 11:15:31/

哈希表简介

哈希表是一种通过哈希函数将键映射到数组索引的数据结构,能够实现高效的数据查找、插入和删除。适用于需要快速访问的场景。

C语言实现

代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define TABLE_SIZE 10 // 定义哈希表的大小// 哈希表节点
typedef struct Node {char *key;int value;struct Node *next; // 链表的下一个节点
} Node;// 哈希表结构体
typedef struct HashTable {Node **table; // 指向节点的指针数组
} HashTable;// 哈希函数
unsigned int hash(char *key) {unsigned int hash = 0;while (*key) {hash = (hash << 5) + *key++; // 计算哈希值}return hash % TABLE_SIZE; // 返回索引
}// 创建哈希表
HashTable* create_table() {HashTable *ht = malloc(sizeof(HashTable));ht->table = malloc(sizeof(Node*) * TABLE_SIZE);for (int i = 0; i < TABLE_SIZE; i++) {ht->table[i] = NULL; // 初始化为空}return ht;
}// 插入键值对
void insert(HashTable *ht, char *key, int value) {unsigned int index = hash(key);Node *new_node = malloc(sizeof(Node));new_node->key = strdup(key); // 复制键new_node->value = value;new_node->next = ht->table[index]; // 插入到链表头部ht->table[index] = new_node;
}// 查找值
int search(HashTable *ht, char *key) {unsigned int index = hash(key);Node *current = ht->table[index];while (current) {if (strcmp(current->key, key) == 0) {return current->value; // 找到返回值}current = current->next; // 继续查找}return -1; // 找不到返回 -1
}// 释放哈希表内存
void free_table(HashTable *ht) {for (int i = 0; i < TABLE_SIZE; i++) {Node *current = ht->table[i];while (current) {Node *temp = current;current = current->next;free(temp->key); // 释放键free(temp);}}free(ht->table); // 释放表free(ht); // 释放哈希表结构体
}int main() {HashTable *ht = create_table();insert(ht, "apple", 1);insert(ht, "banana", 2);printf("Value for key 'apple': %d\n", search(ht, "apple"));printf("Value for key 'banana': %d\n", search(ht, "banana"));free_table(ht); // 释放内存return 0;
}

C++语言实现

代码示例

#include <iostream>
#include <string>
#include <list>
#include <vector>class HashTable {
private:static const int TABLE_SIZE = 10; // 定义哈希表的大小std::vector<std::list<std::pair<std::string, int>>> table; // 使用链表处理碰撞// 哈希函数int hash(const std::string &key) {int hash = 0;for (char ch : key) {hash = (hash * 31 + ch) % TABLE_SIZE; // 计算哈希值}return hash;}public:HashTable() : table(TABLE_SIZE) {} // 初始化哈希表// 插入键值对void insert(const std::string &key, int value) {int index = hash(key);table[index].emplace_back(key, value); // 使用 emplace_back 插入}// 查找值int search(const std::string &key) {int index = hash(key);for (const auto &pair : table[index]) {if (pair.first == key) {return pair.second; // 找到返回值}}return -1; // 找不到返回 -1}
};int main() {HashTable ht;ht.insert("apple", 1);ht.insert("banana", 2);std::cout << "Value for key 'apple': " << ht.search("apple") << std::endl;std::cout << "Value for key 'banana': " << ht.search("banana") << std::endl;return 0;
}

哈希表优缺点

优点

  1. 快速查找:在平均情况下,查找、插入和删除的时间复杂度为 O(1)O(1)O(1)。

  2. 动态扩展:可以根据负载因子扩展哈希表大小,以适应更多数据。

  3. 灵活性:可以存储不同类型的数据。

缺点

  1. 碰撞问题:哈希函数可能会导致多个键映射到同一索引,影响性能。

  2. 内存占用:如果哈希表过大或负载因子过低,可能造成内存浪费。

  3. 复杂性:实现和维护较为复杂,特别是在处理碰撞和扩展时。

注意

⚠️这是简单叙述想深入理解点击链接🔗z


http://www.ppmy.cn/devtools/127817.html

相关文章

AMD的fpga选型介绍(SOC类)

SOC:就是集成了FPGA端和ARM端的 FPGA:就只是单一的FPGA SOC中 7000系列:价格便宜性能中规中矩适合新手学习使用 7020:60元左右一片(tb)性价比高 ZUCG: ARM更高级,资源更丰富 货很少&#xff0c;贵的要死&#xff0c;1k起步 ZUEG: ARM更高级,资源更丰富

STM32传感器模块编程实践(六) 1.8寸液晶屏TFT LCD彩屏简介及驱动源码

文章目录 一.概要二.TFT彩屏主要参数三.TFT彩屏参考原理图四.TFT彩屏模块接线说明五.模块SPI通讯协议介绍六.TFT彩屏模块显示1.显示英文字符串2.显示数字3.显示中文 七.TFT彩屏实现图片显示八.STM32单片机1.8寸 TFT LCD显示实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九…

1.前提配置 关防火墙 关selinux

1.前提配置 关防火墙 关selinux 2.安装web服务程序nginx 未安装则需重新设置挂载点 若已安装&#xff0c;则查看系统中是否存在 3.当前主机添加多地址&#xff08;ip a&#xff09; 配置了三个IP地址 查看IP地址是否配置成功 4.自定义nginx配置文件通过多地址区分多网站 /…

100种算法【Python版】第1篇——贪心策略

贪心是一种策略 1 策略内核1.1 基本思想1.2 策略步骤1.3 贪心算法举例说明1.3.1 活动选择问题1.3.2 01背包问题1.3.3 最优解分析 2 贪心策略的应用2.1 应用&#xff1a;计算单源最短路径2.2 应用&#xff1a;霍夫曼编码字符串 3 策略优缺点3.1 优点3.2 缺点3.3 总结 1 策略内核…

Kafka 启用 JMX

以下是在 Kafka 服务启动时启用 JMX 的步骤&#xff1a; 找到 Kafka 的启动脚本&#xff0c;通常在 Kafka 安装目录的 bin 子目录下 编辑启动脚本&#xff08;例如 kafka-server-start.sh&#xff09;&#xff0c;在其中设置 JMX 参数。 在启动脚本中添加以下环境变量设置&a…

【含开题报告+文档+PPT+源码】基于SSM框架的农产品销售平台的设计与实现

开题报告 近年来&#xff0c;随着社会经济的快速发展和人民生活水平的提高&#xff0c;人们对优质农产品的需求越来越高。农产品销售管理是农业生产的重要环节&#xff0c;对于提高农产品产销效益、维护市场秩序和保障消费者权益起着至关重要的作用。然而&#xff0c;传统的农…

高等数学 7.4一阶线性微分方程

文章目录 一、线性方程*二、伯努利方程 一、线性方程 方程 d y d x P ( x ) y Q ( x ) (1) \cfrac{\mathrm{d}y}{\mathrm{d}x} P(x) y Q(x) \tag{1} dxdy​P(x)yQ(x)(1) 叫做一阶线性微分方程&#xff0c;因为它对于未知函数 y y y 及其导数是一次方程。如果 Q ( x ) ≡…

电感电容谐振原理及Matlab仿真

一、电感电容谐振原理概述 电感电容谐振&#xff08;LC谐振&#xff09;是一种电路现象&#xff0c;它发生在电感器&#xff08;L&#xff09;和电容器&#xff08;C&#xff09;通过适当的方式连接时&#xff0c;电路中电流和电压之间形成共振。在这种共振状态下&#xff0c;…