当前位置: 首页 > 编程日记 > 正文

自己写的哈希表以及解决哈希冲突

哈希表就是键值key-value对,使用hash函数让key产生哈希值,当不同的key产生相同的哈希值时就是哈希冲突了,产生哈希冲突可以使用拉链法。

hash.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hash.h"static unsigned int table_size[] = {
7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191,
16381, 32749, 65521, 131071,
262143, 524287, 1048575, 2097151, 4194303, 8388607,
16777211, 33554431, 67108863, 134217727, 268435455,
536870911, 1073741823, 2147483647, 0};/* hash function: return unsignde int */
static unsigned int hash(const char *key)
{unsigned int seed = 131;unsigned int hash = 0;while (*key) {hash = hash * seed + (*key++);}return (hash & 0x7FFFFFFF) % SIZE;
}void hash_insert(struct hash_table *ht, char *key, char *value)
{unsigned int h;struct hash_node *node,*pnode,*fnode;node=pnode=(struct hash_node *)malloc(sizeof(struct hash_node));fnode=(struct hash_node *)malloc(sizeof(struct hash_node));memset(node,0,sizeof(struct hash_node));node->next=NULL;memset(fnode,0,sizeof(struct hash_node));fnode->next=NULL;h = hash(key);if(ht[h].ht==0){ht[h].ht=fnode;}pnode=ht[h].ht;while(pnode->next!=NULL){pnode=pnode->next;}pnode->key=key;pnode->value=value;pnode->next=node;
}char* search(struct hash_table *ht, char *key)
{unsigned int h;struct hash_node *pnode;char *ret=(char*)malloc(sizeof(char));pnode=(struct hash_node *)malloc(sizeof(struct hash_node));h = hash(key);if(ht[h].ht==0){return ret=NULL;}else{pnode=ht[h].ht;while(pnode->next!=NULL&&pnode->key!=key){pnode=pnode->next;}if(pnode->key==key){return ret=pnode->value;}else{return ret=NULL;}}
}int main() {int i;char *a1;char *a2;char *search_key;char *search_ret;struct hash_table *h;struct hash_node *node;h=(struct hash_table *)malloc(sizeof(struct hash_table)*SIZE);memset(h,0,sizeof(struct hash_table)*SIZE);/*for(i=0;i<SIZE;i++){node=(struct hash_node *)malloc(sizeof(struct hash_node));memset(node,0,sizeof(struct hash_node));node->next=NULL;h[i].ht=node;}*/a1="aaa";a2="abc";hash_insert(h,a1,a2);a1="bbb";a2="jkjhk";hash_insert(h,a1,a2);a1="ccc";a2="reew";hash_insert(h,a1,a2);a1="ddd";a2="hyte";hash_insert(h,a1,a2);a1="eee";a2="wwq";hash_insert(h,a1,a2);a1="fff";a2="fd4";hash_insert(h,a1,a2);search_key="dddd";search_ret=search(h,search_key);return 0;
}

另一种方法一开始就for循环初始化node

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hash.h"static unsigned int table_size[] = {
7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191,
16381, 32749, 65521, 131071,
262143, 524287, 1048575, 2097151, 4194303, 8388607,
16777211, 33554431, 67108863, 134217727, 268435455,
536870911, 1073741823, 2147483647, 0};/* hash function: return unsignde int */
static unsigned int hash(const char *key)
{unsigned int seed = 131;unsigned int hash = 0;while (*key) {hash = hash * seed + (*key++);}return (hash & 0x7FFFFFFF) % SIZE;
}hash_insert(struct hash_table *ht, char *key, char *value)
{unsigned int h;struct hash_node *node,*pnode;node=pnode=(struct hash_node *)malloc(sizeof(struct hash_node));memset(node,0,sizeof(struct hash_node));node->next=NULL;h = hash(key);pnode=ht[h].ht;while(pnode->next!=NULL){pnode=pnode->next;}pnode->key=key;pnode->value=value;pnode->next=node;
}int main() {int i;char *a1;char *a2;struct hash_table *h=(struct hash_table *)malloc(sizeof(struct hash_table)*SIZE);struct hash_node *node=NULL;memset(h,0,sizeof(struct hash_table)*SIZE);for(i=0;i<SIZE;i++){node=(struct hash_node *)malloc(sizeof(struct hash_node));memset(node,0,sizeof(struct hash_node));node->next=NULL;h[i].ht=node;}a1="aaa";a2="abc";hash_insert(h,a1,a2);a1="bbb";a2="jkjhk";hash_insert(h,a1,a2);a1="ccc";a2="reew";hash_insert(h,a1,a2);a1="ddd";a2="hyte";hash_insert(h,a1,a2);a1="eee";a2="wwq";hash_insert(h,a1,a2);a1="fff";a2="fd4";hash_insert(h,a1,a2);return 0;
}

hash.h

struct hash_node{struct hash_node* next;char * key;char * value;
};struct hash_table{struct hash_node *ht;
};#define SIZE 1

SIZE就是哈希表数组的大小,现在故意设置其为1,则哈希表退化为普通链表,这里只是为了演示所有的数据应该链接在一起



扩大SIZE为5,因为我们有6对数据,所以必然最少会有2个数据冲突,冲突的放一起:



相关文章:

Python与MySQL数据库的交互实战

作者 | Huang supreme编辑 | 郭芮图源 | 视觉中国安装PyMySQL库如果你想要使用python操作MySQL数据库&#xff0c;就必须先要安装pymysql库&#xff0c;这个库的安装很简单&#xff0c;直接使用pip install pymysql&#xff1b;假如这种方式还是安装不上&#xff0c;就用如下链…

Hyper-V的三种网卡

External 虚拟机和物理网络、本地主机都能通信 Internal 虚拟机之间互相通信&#xff0c;并且虚拟机能和本机通信 Private 仅允许运行在这台物理机上的虚拟机之间互相通信

filter-mapping中的dispatcher使用

web.xml里<filter-mapping>中的<dispatcher>作用 2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素&#xff0c;这个元素有四个可能的值&#xff1a;即 REQUEST,FORWARD,INCLUDE和ERROR 可以在一个<filter-mapping>元素中加入任意数目…

脉冲神经网络在目标检测的首次尝试,性能堪比CNN | AAAI 2020

译者 | VincentLee来源 | 晓飞的算法工程笔记脉冲神经网络(Spiking neural network, SNN)将脉冲神经元作为计算单元&#xff0c;能够模仿人类大脑的信息编码和处理过程。不同于CNN使用具体的值(continuous)进行信息传递&#xff0c;SNN通过脉冲序列(discrete)中每个脉冲发射时…

TCMalloc:线程缓存的Malloc

转载自&#xff1a; http://shiningray.cn/tcmalloc-thread-caching-malloc.html作者&#xff1a;Sanjay Ghemawat, Paul Menage 原文 翻译&#xff1a;ShiningRay 动机 TCMalloc要比glibc 2.3的malloc&#xff08;可以从一个叫作ptmalloc2的独立库获得&#xff09;和其他我测试…

今年央视的春晚能给人带来惊喜吗?

已经好多年还没看完中央电视台的春节联欢晚会自己就睡着了&#xff0c;说实在的&#xff0c;现在央视春节联欢晚会的节目总是让人期待后感到相当的平淡乏味&#xff0c;有些搞笑节目庸俗的让人笑不出来&#xff0c;绝大多数的节目都显得非常的人工&#xff0c;全然不能激发出观…

将baidu地图中的baidu logo去掉

Web 最简单方法&#xff0c;将logo的css样式改为display:none即可 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>移除百度地图LOGO和版权信息</title><script type"text/javascript" src"htt…

Linux环境网络库

安装libevent 官网&#xff1a;http://libevent.org/ 书籍&#xff1a;http://www.wangafu.net/~nickm/libevent-book/ Libevent参考手册翻译:http://blog.csdn.net/laoyi19861011/article/category/831215 Libevent参考手册翻译增加&#xff1a;http://blog.sina.co…

万人马拉松赛事,人脸识别系统如何快速、准确完成校验?

作者 | 阿里文娱技术专家墨贤出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;大麦的人脸闸机在2019年杭州马拉松上成功的完成了刷脸入场功能的首秀&#xff0c;相比传统的马拉松入场核验方案在入场体验和入场效率上都有了很大的提升&#xff0c;下面介绍一下大麦的人…

Collection集合List、Set

Collection集合&#xff0c;用来保存一组数据的数据结构。 Collection是一个接口&#xff0c;定义了所有集合都应该包含的特征和行为 Collection派生出了两类集合 List和Set List接口&#xff1a;List集合的特征是元素是可重复且有序 Set接口&#xff1a;Set集合的特征是元素是…

如何用Jupyter Notebook制作新冠病毒疫情追踪器?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;新冠肺炎已在全球范围内爆发。为了解全球疫情分布情况&#xff0c;有技术人员使用Jupyter Notebook绘制了两种疫情的等值线地图&#xff08;choropleth chart&#xff09;和散点图。前者显示了一个国家/地区的疫情扩散…

关于Aptana studio工具

今天&#xff0c;使用了Aptana studio这个工具&#xff0c;界面类似于Myeclipse因使用MyEclipse比较顺手&#xff0c;这个工具上手还挺容易的。而且比Dreamweaver好用多了&#xff0c;有代码提示的工具&#xff0c;再加上工具不大&#xff0c;耗内存较小。挺喜欢这个工具的。写…

再谈JSON -json定义及数据类型

再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析。使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑&#xff0c;比方说&#xff0c;什么情况下我们须要去将字符串转换为json对象。什么情况下就不须要转换。通过hql和sql查询返回…

Linux软连接和硬链接

1.Linux链接概念 Linux链接分两种&#xff0c;一种被称为硬链接&#xff08;Hard Link&#xff09;&#xff0c;另一种被称为符号链接&#xff08;Symbolic Link&#xff09;。默认情况下&#xff0c;ln命令产生硬链接。 【硬连接】 硬连接指通过索引节点来进行连接。在Linux的…

学语言不是写程序!

这是发到我邮箱里面的一封信&#xff0c;嗯&#xff0c;类似的信有好几封&#xff0c;春节期间呢&#xff0c;我主要陪笑笑&#xff0c;呵呵&#xff0c;不办公&#xff0c;就一直压着没有回答&#xff0c;有点delay了&#xff0c;现在给这几位同学抱个歉哈&#xff0c;对不住了…

“AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作

2020年春节&#xff0c;注定将刻进每个人的记忆。面对突如其来的新型冠状病毒感染的肺炎疫情&#xff0c;除了一线医护人员的日夜奋战&#xff0c;“人工智能”也在特殊时期走向前沿&#xff0c;接受了抗疫洗礼。 3月13日&#xff0c;今年第一期百度大脑开放日首次通过直播的形…

POJ 2778 AC自己主动机+矩阵幂 不错的题

http://poj.org/problem?id2778 有空再又一次做下&#xff0c;对状态图的理解非常重要 题解&#xff1a; http://blog.csdn.net/morgan_xww/article/details/7834801 另外做了矩阵幂的模板&#xff1a; //ac.sz是矩阵的大小 void mulmtr(long long x[MAXNODE][MAXNODE],long l…

Libevent调用

1.最基本的打印libevent版本 #include <event.h> #include <stdio.h>int main() {const char *version event_get_version();printf("%s\n",version);return 0; }# gcc getVersion.c -o getVersion -levent 参考&#xff1a;https://github.com/mike-zh…

如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!

作者 | CloudFactory译者 | 天道酬勤 责编 | 徐威龙出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;高效的机器学习模型需要高质量的数据。训练你的机器学习模型并不是过程中的单个有限阶段。即使将其部署到生产环境中&#xff0c;也可能需要稳定的新训练数据流来确保…

占失物,笔记本电脑电池

公历&#xff1a;2009年3月18日18时11分 农历&#xff1a; 农历己丑年(牛)二月廿二 节气&#xff1a; 2009年3月5日19时2分惊蛰年建&#xff1a;己丑 月建&#xff1a;丁卯 日建&#xff1a;壬戌 时建&#xff1a;己酉 断:玄武中值天地合,故能寻到,在西方,又为长生之地,故为住…

Scala Learn 1 Basic

Chap 0 前言 focus on: Scala 的语法十分简洁Scala 运行在虚拟机之上, 可以使用 java 的海量类库和工具Scala 拥抱函数式编程的同时&#xff0c;并没有废弃面向对象Scala 既有动态语言那样的灵活简洁&#xff0c;同时有保留了静态类型检查的安全与执行效率Scala 既能处理脚本化…

linux下使用NetBeans调试libevent库

1.安装libevent 参考&#xff1a;http://blog.csdn.net/unix21/article/details/8679269 libevent安装在usr/local/libevent下 2.安装netBeans http://www.netbeans.org 3.配置netBeans 1)打开项目的属性选项&#xff0c;选择包含目录&#xff0c;把/usr//local/libevent/…

批量删除指定文件

Linux下的解决方法: # Linux Batch Delete find /home/data/-name ab.doc-exec rm -f {} \;注&#xff1a;最后反斜杠前有一空格&#xff0c;最后一个是分号。Windows下的解决方法:rem Windows Batch Delete 1: DEL /Q /S D:\home\data\*.class 2: FOR /R D…

百万人学AI:CSDN重磅共建人工智能技术新生态

站在AI发展的新十年起点上&#xff0c;CSDN将发挥开发者优势&#xff0c;与中国AI各行业和企业共建“百万人学AI”新技术生态。 作者 | CSDN新媒体事业部 8年前&#xff0c;现图灵奖得主Hinton团队在ImageNet竞赛中首次使用深度学习完胜Google等其它团队&#xff0c;顿时让工…

Android Property Animation属性动画:scale缩放动画(4)

&#xfeff;&#xfeff;Android Property Animation属性动画&#xff1a;scale缩放动画&#xff08;4&#xff09; 和之前我写的附录文章1,2,3相似&#xff0c;本文将接着使用Android Property Animation属性动画实现一个缩放的动画。代码部分和文章1,2,3中的代码大同小异&am…

结构体的两种声明方式:堆上和栈上以及在双链表的应用

在看《算法精解&#xff1a;C语言描述》的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的。 但是&#xff0c;对于链表的初始化却不一样 1.《算法精解&#xff1a;C语言描述》风格 /************************************************************************…

COM 组件设计与应用(六)——用 ATL 写第一个组件(vc.net)

一、前言 1、与 《COM 组件设计与应用(五)》的内容基本一致。但本回讲解的是在 vc.net 2003 下的使用方法&#xff0c;即使你不再使用vc6.0&#xff0c;也请和上一回的内容&#xff0c;参照比对。2、这第一个组件&#xff0c;除了所有 COM 组件必须的 IUnknown 接口外&#xff…

《评人工智能如何走向新阶段》后记(再续19)

由AI科技大本营下载自视觉中国304. 也来讨论构建模拟人类思维过程的认知计算机制&#xff0c;好像这个问题迄今尚未获得解决。 我们先从输入的信息类型说起&#xff1a;一类是语言输入&#xff08;包括词、句、文本&#xff09;&#xff0c;第二类是图像输入&#xff08;包括图…

PHP下载/采集远程图片到本地

2019独角兽企业重金招聘Python工程师标准>>> PHP下载/采集远程图片到本地01 /** 02* 下载远程图片到本地 03* 04* param string $url 远程文件地址 05* param string $filename 保存后的文件名&#xff08;为空时则为随机生成的文件名&#xff0c;否则为原文件名&am…