哈希查找-采用线性探测再散列的方法处理冲突

哈希表初始化、输出哈希表、插入键值(线性探测再散列处理冲突 本关任务:初始化哈希表满足下面要求。将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中,散列函数为: H(key) = (key*3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。初始化的哈希表中元素均为-1。 阅读详情

1 题目

功能:哈希查找
描述:
哈希表长度 11
哈希函数 (key)=key%11
采用线性探测再散列的方法处理冲突

2 思路

哈希函数简要介绍

哈希函数的构造方法

哈希函数的构造方法常用的有5种,分别是数字分析法、平方取中法、分段叠加、伪随机数法和余数法,其中余数法比较常用。
例子中已给出哈希函数,按照给出的哈希函数进行了构造

避免哈希冲突的方法

分别有开放定址法(包括线性探测再散列和二次探测再散列入、链地址法、再哈希法和建立公共溢出区
开放定址法中的线性探测再散列比较常用,该方法的特点是在冲突发生时,顺序查看表中的下一单元,直到找出一个空单元或査遍全表。

3 代码

#include <stdio.h> 
#include <stdlib.h>
#include <time.h>
#define Max 11
#define N 8

/**
功能:哈希查找
描述:
	哈希表长度 11
	哈希函数 (key)=key%11
	采用线性探测再散列的方法处理冲突
**/

int hashtable[Max];

int func(int value) {
    return value % Max; 							// 哈希函数
}

int search(int key) { 								// 自定义函数实现哈希查询

    int pos, t;
    pos = func(key); 								// 哈希函数确定出的位置
    t = pos;										// t存放确定出的位置
    while (hashtable[t] != key && hashtable[t] !=  - 1) {
		// 如果该位置上不等于要查找的关键字且不为空
        t = (t + 1) % Max; 							// 利用线性探测求出下一个位置
        if (pos == t)
			// 如果经多次探测又回到原来用哈希函数求出的位置则说明要查找的数不存在
            return  - 1;
    }
    if (hashtable[t] ==  - 1)						// 如果探测的位置是-1则说明要查找的数不存在
        return -1;
    else
        return t;
}

void creathash(int key) {							// 自定义函数创建哈希表

    int pos, t;
    pos = func(key);								// 哈希函数确定元素的位置
    t = pos;
    while (hashtable[t] !=  - 1) {
		// 如果该位置有元素存在则进行线性探测再散列
        t = (t + 1) % Max;
        if (pos == t) {
        	// 如果冲突处理后确定的位置与原位置相同则说明哈希表已满
            printf("哈希表已满\n");
            return ;
        }
    }
    hashtable[t] = key;								// 将元素放入确定的位置
}

int main(int argc, char const *argv[]) {

    int flag[50];
    int i, j, t;
    for (i = 0; i < Max; i++)
        hashtable[i] =  - 1;				// 哈希表中初始位置全置-1
     										
    for (i = 0; i < 50; i++)
        flag[i] = 0;
     										// 50以内所有数未产生时均标志为0
    srand((unsigned long)time(0)); 			// 利用系统时间做种子产生随机数
    i = 0;
    printf("建立 Hash 表: \n");
    while (i != N) {
        t = rand() % 50; 					// 产生一个50以内的随机数赋给t
        if (flag[t] == 0) {						// 查看t是否产生过
            creathash(t);						// 调用函数创建哈希表
            printf("%2d:", t); 					// 将该元素输出
            for (j = 0; j < Max; j++)
                printf("(%2d) ", hashtable[j]);
             									// 输出哈希表中内容
            printf("\n");
            flag[t] = 1; 						// 将产生的这个数标志为1
            i++;								// i自加
        }
    }
    printf("请输入你想查找的元素:");
    scanf("%d", &t); 							// 输入要查找的元素
    if (t > 0 && t < 50) {
        i = search(t);							// 调用search进行哈希查找
        if (i !=  - 1)
            printf("查找成功!其位置是:%d\n", i);	// 若查找到该元素则输出其位置
        else
            printf("查找失败!");					// 未找到输出提示信息
    }
    else
        printf("输入有误!");
}

示例结果:

$ gcc ex066.c -o demo
$ ./demo
建立 Hash 表:
 7:(-1) (-1) (-1) (-1) (-1) (-1) (-1) ( 7) (-1) (-1) (-1)
22:(22) (-1) (-1) (-1) (-1) (-1) (-1) ( 7) (-1) (-1) (-1)
16:(22) (-1) (-1) (-1) (-1) (16) (-1) ( 7) (-1) (-1) (-1)
29:(22) (-1) (-1) (-1) (-1) (16) (-1) ( 7) (29) (-1) (-1)
44:(22) (44) (-1) (-1) (-1) (16) (-1) ( 7) (29) (-1) (-1)
37:(22) (44) (-1) (-1) (37) (16) (-1) ( 7) (29) (-1) (-1)
 3:(22) (44) (-1) ( 3) (37) (16) (-1) ( 7) (29) (-1) (-1)
 9:(22) (44) (-1) ( 3) (37) (16) (-1) ( 7) (29) ( 9) (-1)
请输入你想查找的元素:9
查找成功!其位置是:9
使用线性探测法解决哈希冲突并建立一个简单的哈希-C语言 请注意,这只是一个简单的示例,实际上,哈希表的实现可能更为复杂,例如使用链表法解决冲突、动态调整哈希表大小等。线性探测法是开放地址法族中的一种具体实现方式,它的处理方式是在发生冲突时,依次探测哈希表中的下一个位置,直到找到一个空闲的位置或者哈希表已满。开放地址法是一族解决哈希冲突方法,它的基本思想是当发生哈希冲突时,通过在哈希表中寻找其他空闲的位置来存储冲突的元素,而不是使用链表等数据结构来解决冲突。然而,由于哈希函数的映射是有限的,可能存在不同的键映射到同一个索引位置的情况,称为。 阅读详情

相关推荐

计算散列表查找成功和查找不成功的平均查找长度(利用线性探测处理冲突

散列表         哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。映射函数叫做散列函数,存放记录的数组叫做散列表。 装填因子         关键字个数 / 表长 处理冲突         一般来说冲突不可避免的,只能尽可能地减少冲突的发生。在建立Has

叫我蘑菇先生 4万+

哈希表习题

选取哈希函数H(k)=(3k)%11,用线性探测散列法和二次探测再散列法分别处理冲突。试在0~10的散列地址空间中,对关键字序列(22,41,53,46,30,13,01,67)构建哈希表,并求等概率情况下查找成功的平均查找长度。 线性探测...

mez_Blog的博客 1万+

SAP物料分类账实战:从配置到月结的关键步骤(基于S/4HANA1909)

本文详细解析了在SAP S/4HANA 1909系统中,物料分类账从基础配置到月结操作的全流程。作为成本核算的核心,物料分类账通过多级价格确定实现实际成本核算,关键步骤包括激活物料分类账、配置自动过账科目(OBYC)、运行CKMLCP进行差异分摊与结算。文章旨在帮助财务与成本会计人员确保成本差异的准确归集与分摊,顺利完成月结。

weixin_28314575的博客 161

散列函数之线性探测处理冲突

题目: 1.设散列函数H(k)=k%13,设关键字系列为{22,12,24,6,45,7,8,13,21},要求用线性探测处理冲突。 (1)构建HASH表 (2)分别求查找成功和不成功时的平均查找长度 答案: (1) (2) 查找成功的平均查找长度:(5*1+1*2+2*3+1*7)/9=20/9 查找不成功的平均查找长度:(2+1+9+8+...

lydia88的专栏 2万+

哈希查找方法

已知哈希表长度为11哈希函数为H(key)=key11,随机产生待散列的小于50的8个元素,同时采用线性探测再散列方法处理冲突。= - 1)/如果该位置不等于要查找的关键字且不为空 /= - 1) /如果该位置有元素存在,则进行线性探测再散列 /if (hashtable[t] == - 1) /如果探测的位置是-1,则说明要查找的数不存在 //如果经多次探测又回到原来用哈希函数求出的位置,则说明要查找的数不存在 //如果冲突处理后确定的位置与原位置相同,则说明哈希表已满 //哈希函数确定位置 /

2501_92023416的博客 523

7-12 哈希查找的平均查找长度

对于给定的关键字序列,求采用哈希查找时查找成功和查找失败的平均查找长度。哈希函数:H(key) = key % K,其中K为某个不大于哈希表长M的整数。采用线性探测再散列处理冲突

2401_85947543的博客 648

数据结构和算法——哈希查找冲突处理方法(开放地址-线性探测、平方探测、双散列探测、再散列,分离链接法)

数据结构和算法——哈希查找冲突处理方法(开放地址-线性探测、平方探测、双散列探测、再散列,分离链接法) 在开放地址散列表中,删除操作要很小心。通常只能“懒惰删除”,即需要增加一个“删除标记(Deleted)”,而并不是真正删除它。以便查找时不会“断链”。其空间可以在下次插入时重用。

li13437542099的博客 1万+

DS哈希查找线性探测再散列

定义哈希函数为Hkeykey11,输入表长(大于、等于11)。输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字

m0_74919335的博客 1328

Hash(散列)冲突解决之线性探测再散列和二次探测再散列

Hash(散列)冲突解决-线性探测再散列和二次探测再散列

qq_54429571的博客 1万+

专业课-数据结构(第8章查找作业部分)

所用教材: 书名:《数据结构–用C语言描述(第2版)》 编者:耿国华;张德同;周明全等编著 出版社:高等教育出版社 P315页 2.编写一个函数,利用折半查找算法在一个有序表中插入一个元素x,并保持表的有序性。 #include<stdio.h> #define Max 50 //有序表中数据类型 typedef int KeyType; //有序表 typedef struct{ KeyType elem[Max]; int length; }RecordList; //折半查找并插入

CJYKeepLearning的博客 2970

通过线性探测法构建的散列表的删除实现

在最近对散列表的学习中,以线性探测处理散列表的删除操作让我无所适从,从网上、考研参考书等等各方面查找到的资料也都不尽人意,因此写写博客,希望能够给同样无所适从的朋友一点思路。 我主要针对机械工业出版社的《数据结构、算法与应用 C++描述(第二版)》这本资料来具体阐述。 首先是线性探测法的描述特点:当在哈希表中插入某个数时,如果冲突发生的时候,他会以循环表的方式顺序查看表中下一个单元,直到找...

HaoMaqing的博客 6682

搜索结构之哈希表(线性探测法)

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

xy的博客 3万+

查找算法【哈希表】 - 处理冲突方法:开放地址-二次探测法 & 随机探测法 & 再散列

查找算法【哈希表】 - 处理冲突方法:开放地址-二次探测法 & 随机探测法 & 再散列

代码改变世界 1万+

哈希表的查找(按照除留余数法设计一个哈希函数

给定一组查找关键字(32,15,7,11,4,28,56,61,79),哈希表长为m=12,请按照除留余数法设计一个哈希函数,设每个记录的查找概率相等。 (1)画出按照线性探测再散列处理冲突得到的哈希表(给出求解过程),并计算等概率情况下查找成功和查找失败时的平均查找长度各是多少。 (2)画出按照链地址处理冲突得到的哈希表,并计算等概率情况下查找成功和查找失败时的平均查找长度各是多少。 ==设计哈希函数为 == H(key)= key % 11 (1)按照线性探测再散列处理冲突 查找成功时平均查找长度

小小本科生 8045

哈希表及处理冲突方法

哈希表及处理冲突方法 (2011-10-10 15:32:22) 转载▼ 标签: 杂谈 分类: 其他 哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。这种方法的基本思想是:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直接存入

人生代码,代码人生。。。 2014

哈希表(线性存储)+ 线性探测法解决哈希冲突

哈希表(线性存储)+ 线性探测法解决哈希冲突

玩转Java 3407

DS|哈希查找

数据结构学习记录

2203_75720729的博客 1366

散列查找 ← 线性探测处理冲突

散列法在实际应用中,很难完全避免发生冲突,所以选择一个有效的处理冲突方法是散列法的另一个关键。 本算法采用线性探测处理冲突

hnjzsyjyj的专栏 2693

月球地形数据介绍(LOLA)

LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系数据下载与浏览目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。“月球勘测轨道器”(Lunar Reconnaissance Orbiter,LRO)是NASA“机器人月球探测计划”的首个探测器,于2009年6月18日用宇宙神-5运载火箭发射。任务目标是绘制月球特征和月球资源网,用于未来月球前哨站的设计和建造。

遨游在太空 7111

污水处理厂设计设计说明.doc

污水处理厂设计设计说明.doc

上一篇: 输入一个八进制数,然后输出它的补码
下一篇: 斐波那契数列 - 实现一个斐波那契数列,并且打印出来
MAIN198
博客等级 码龄4年 2粉丝 · 12原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值