小练习 - 哈希表之分离链接法

2024-03-31 21:08

本文主要是介绍小练习 - 哈希表之分离链接法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哈希表十分常用,这里做个小练习,冲突解决使用分离链接法。从哈希表的C实现来看,其本质上做了这样一个映射:key -> hashtable[index] -> addr, 新插入一个数据时,key由数据本身决定,存储地址addr则是系统分配,key通过哈希函数可以算出索引,查找索引对应哈表项目得到地址。

采用分离链接法,底层数据结构主要是数组和链表。这里未考虑哈希表随着数据增加自动扩容的功能,考虑到后插入的数据可能先被访问,这里每次插入都插入到冲突链的首部,当然传入的时候要判断元素是否重复。例子如下:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>typedef struct {int id;char name[10];
}Data;typedef struct _node{Data data;struct _node *next;
}Node;typedef struct {int size;Node **nodes;
} HashTable;void init(HashTable *table, int size)
{size_t len = sizeof(void*) * size;table->size = size;table->nodes = (Node**)malloc(len);memset(table->nodes, 0, len);
}int hash(HashTable *table, int key)
{return key % table->size;
}Node* find(HashTable *table, int key)
{int index = hash(table, key);Node *pos = table->nodes[index];while (pos != NULL && pos->data.id != key)pos = pos->next;return pos;
}#define OK    0
#define ERROR 1int insert(HashTable *table, Data *data)
{int index;Node *inode;Node *pos = find(table, data->id);if (pos == NULL) {index = hash(table, data->id);inode = (Node*)malloc(sizeof(Node));memcpy(&inode->data, data, sizeof(Data));inode->next = table->nodes[index];table->nodes[index] = inode;return OK;} else {return ERROR; // hash key conflict}
}int delete(HashTable *table, int key)
{Node *pos, *p, *tmp;pos = find(table, key);if (pos != NULL) {p = table->nodes[hash(table, key)];if (p->next == NULL) {free(p);table->nodes[hash(table, key)] = NULL;return OK;}while (p->next->data.id != key)p = p->next;tmp = p->next->next;free(p->next);p->next = tmp;return OK;} else {return ERROR;}
}void clear_table(HashTable *table)
{int i;Node *p = NULL, *tmp = NULL;for (i = 0; i < table->size; i++) {p = table->nodes[i];if (p != NULL) {while (p) {tmp = p->next;free(p);p = tmp;}}}free(table->nodes);
}int main()
{Node *p;HashTable tb;Data a, b, c;init(&tb, 1);a.id = 1;strcpy(a.name, "aa");b.id = 2;strcpy(b.name, "bb");c.id = 3;strcpy(c.name, "cc");insert(&tb, &a);insert(&tb, &b);insert(&tb, &c);p = find(&tb, 2);delete(&tb,2);clear_table(&tb);return 0;
}

更多经典实现可以参考JDK和各种脚本语言字典功能的底层实现。

这篇关于小练习 - 哈希表之分离链接法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/865348

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构