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

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

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”