/*哈希查找
*哈希函数的构造方法常用的有5种。分别是:
*数字分析法
*平方取中法
*分段叠加
*伪随机数
*除留取余法
*这里面除留取余法比较常用
*避免哈希冲突常用的方法有4种:
*开放定址法(线性探测再散列、二次探测再散列)
*链地址法
*再哈希法
*建立公共溢出区
其中,线性探测再散列比较常用*/
 

这是一道2009年武汉科技大学的考研题,但是按照要求却做不出来,因为对7取模最多只有7个空间,不可能放进8个数,所以怀疑这道题是不是出错了,但这是考研题,应该不会出错吧。所以各位大神,你们怎么看?

以下是这道题的代码实现,可以看到27放不进哈希表中,因为哈希表已满!

 
 #include <stdio.h>
#include <time.h>
#define Max 7
#define Length 10
#define N 8 int hashtable[Length]; int func(int value)
{
return value % Max; } void create_hash(int key)
{
int pos, t;
pos = func(key);
printf(" %d MOD %d = %d\n", key, Max, pos);
t = pos;
while(hashtable[t] != -)
{
printf("(%d+1) MOD %d = %d\n", t, Max, (t+) % Max);
t = (t+) % Max; if(pos == t)
{ printf("Hash table is full!\n");
return;
} }
hashtable[t] = key; } main()
{
int flag[N] = {, , , , , , , };
int i, j, t;
for(i = ; i < Length; i++)
hashtable[i] = -; i = ;
while(i != N)
{
t = flag[i]; create_hash(t);
printf(" ------------------------------------------------------------\n");
printf(" | 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 |\n");
printf(" ------------------------------------------------------------\n");
printf("%2d: ", t);
for(j = ; j < Length; j++)
printf("| %2d |", hashtable[j]); printf("\n");
printf(" ------------------------------------------------------------\n"); i++; } }

运行结果:

问题解决了!感谢可爱又靠谱的老师和帮我转发消息的baby!

之前的理解有误,以为不论是第一次代入函数计算还是处理冲突都是对函数给定的值取余,正确的是哈希函数对函数给定的值取余,处理冲突对表长取余。代码更正如下:

/*哈希查找
*哈希函数的构造方法常用的有5种。分别是:
*数字分析法
*平方取中法
*分段叠加
*伪随机数
*除留取余法
*这里面除留取余法比较常用
*避免哈希冲突常用的方法有4种:
*开放定址法(线性探测再散列、二次探测再散列)
*链地址法
*再哈希法
*建立公共溢出区
其中,线性探测再散列比较常用*/
#include <stdio.h>
#include <time.h>
#define Max 7
#define Length 10
#define N 8 int hashtable[Length]; int func(int value)
{
return value % Max; } void create_hash(int key)
{
int pos, t;
pos = func(key);
printf(" %d MOD %d = %d\n", key, Max, pos);
t = pos;
while(hashtable[t] != -)
{
printf("(%d+1) MOD %d = %d\n", t, Length, (t+) % Length);
t = (t+) % Length; if(pos == t)
{ printf("Hash table is full!\n");
return;
} }
hashtable[t] = key; } main()
{
int flag[N] = {, , , , , , , };
int i, j, t;
for(i = ; i < Length; i++)
hashtable[i] = -; i = ;
while(i != N)
{
t = flag[i]; create_hash(t);
printf(" ------------------------------------------------------------\n");
printf(" | 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 |\n");
printf(" ------------------------------------------------------------\n");
printf("%2d: ", t);
for(j = ; j < Length; j++)
printf("| %2d |", hashtable[j]); printf("\n");
printf(" ------------------------------------------------------------\n"); i++; } }

运行结果:

c语言构建哈希表的更多相关文章

  1. 【编程学习】浅谈哈希表及用C语言构建哈希表!

    哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...

  2. C语言-简单哈希表(hash table)

    腾讯三面的时候,叫我写了个哈希表,当时紧张没写好···结果跪了··· 回来后粪发涂墙,赶紧写了一个! 什么都不说了···先让我到厕所里面哭一会··· %>_<% 果然现场发挥,以及基础扎实 ...

  3. 数据结构---哈希表的C语言实现(闭散列)

    原文地址:https://blog.csdn.net/weixin_40331034/article/details/79461705 构造一种存储结构,通过某种函数(hashFunc)使元素的存储位 ...

  4. 理解Golang哈希表Map的元素

    目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...

  5. Leetcode No.1 Two Sum(c++哈希表实现)

    1. 题目 1.1 英文题目 Given an array of integers nums and an integer target, return indices of the two numb ...

  6. 集合&gt;哈希表类Hashtable和SortedList排序列表类

    集合>哈希表类Hashtable Hashtable一种键值对的集合 ,哈希表内部的排列是无序的,而且哈希表没有提供排序方法. 集合>哈希表类Hashtable>构造普通哈希表 代码 ...

  7. 算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)

    散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构.关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash table,也叫哈希表),是根据键(Key)而直 ...

  8. Java中哈希表(Hashtable)是如何实现的

    Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...

  9. 从Dictionary源码看哈希表

    一.基本概念 哈希:哈希是一种查找算法,在关键字和元素的存储地址之间建立一个确定的对应关系,每个关键字对应唯一的存储地址,这些存储地址构成了有限.连续的存储地址. 哈希函数:在关键字和元素的存储地址之 ...

随机推荐

  1. ARTS打卡计划第一周-Tips-ControllerAdvice的使用

    通常在开发具体项目过程中我们可能会面临如下问题: 统一所有的json返回结果 统一处理所有controller中的异常,并且给不同异常不同的返回状态值 统一对返回的接口做数据校验或者加密,防止篡改 在 ...

  2. ubuntu单用户修改密码

    系统版本:Ubuntu 16.04,其它版本类似. 第一步 重启 Ubuntu ,并长按shift键,进入grub菜单,上下键选择Ubuntu高级选项 第二步 上下键选择recovery mode,不 ...

  3. LVM XFS增加硬盘分区容量最后一步的时候动态扩容报错

    在我们lvextend扩容完之后,想动态扩容时出现错误.我们可以用以下命令来进行操作. 若不是xfs我们可以用resize2fs,这里报错了 [root@Mysql01-213-66 ~]# resi ...

  4. python测试开发django-3.url配置

    前言 我们在浏览器访问一个网页是通过url地址去访问的,django管理url配置是在urls.py文件.当一个页面数据很多时候,通过会有翻页的情况,那么页数是不固定的,如:page=1.也就是url ...

  5. PCA降维参数介绍

    https://www.cnblogs.com/pinard/p/6243025.html#undefined

  6. (纠错)JSP数据库判断是否存在

  7. iOS socket常用数据类型转换

    int -> data /** int -> data */ + (NSData *)intToData:(int)value { Byte byte[4] = {}; byte[0] = ...

  8. java_25 FileReader类和FileWriter类

    1.FileWriter 1.1FileWriter 用于写入字符流.要写入原始字节流,请考虑使用 FileOutputStream. public class Demo { public stati ...

  9. 小程序canvas绘制渐变色(简单入门)

    呀,曾经的我是那么的单纯,天真,粗略的翻了一遍小程序画布API,没有看见渐变色,就以为不支持渐变色 于是在项目中直接把原本的渐变色换成了单一颜色展示,发现很low啊 但是,自从上次小程序API文档更新 ...

  10. 常用的三种json软件的使用

    从几个角度比较三种软件 1. json操作 2 反解 3 性能 易用性还没有列出. 可以根据个人喜好进行取舍. package json; import com.alibaba.fastjson.JS ...