实验:哈希表的算法实现

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

实验内容

采用除留余数法实现哈希表的创建,任意采用一种处理冲突的方法解决冲突,计算哈希表的平均查找长度。编程实现以下功能:

已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希函数定义为:H(key)=key MOD 13, 哈希表长为m=16。实现该哈希表的散列,并计算平均查找长度(设每个记录的查找概率相等)。

(1)哈希表定义为定长的数组结构;

(2)使用线性探测再散列或链地址法解决冲突;

(3)散列完成后在屏幕上输出数组内容或链表;

(4)输出等概率查找下的平均查找长度;

(5)完成散列后,输入关键字完成查找操作,要分别测试查找成功与查找不成功两种情况。

算法设计思路

1.建造哈希结构

#define m 16//哈希表的长度

typedef struct {

int date;//关键字

int cent=0;//来表示表内是否含有数据

int flag=0;//用来控制递归

}HashTable[m];

int sum=0;//用来计算平均查找长度

2.私下根据哈希函数将关键字存放

3.线性探测解决冲突

void CreateHash(HashTable &Hash,int x)//线性探测散列
{
		int y = x % 13;//H(key)=key MOD 13
		int flag = 1;
		while(flag){
			if (Hash[y].cent == 0)//判断是否已经存入数据
			{
				Hash[y].date = x;
				Hash[y].cent = 1;
				flag = 0;
				sum++;
			}
				y++;
		}
}

4.折半查找法

void Search(HashTable Hash,int key)//搜查关键词

{

int min = 0;

int max = m;

int t = key % 13;//key应该存放的位置

while(min<=max)

{

int mid = (max + min) / 2;

if (t == (Hash[mid].date)%13&&key==Hash[mid].date)

{

cout << "查找成功:" << mid << endl;

return;

}

else if (t > (Hash[mid].date % 13))

     {

   min = mid;

     }

else { max = mid; }

}

cout << "无目标值:" << endl;

return;

}

全部源代码

#include<iostream>
using namespace std;
#define m 16//哈希表的长度
typedef struct {
	int date;//关键字
	int cent=0;//来表示表内是否含有数据
}HashTable[m];
int sum=0;//用来计算平均查找长度

void CreateHash(HashTable &Hash,int x)//线性探测散列
{
		int y = x % 13;//H(key)=key MOD 13
		int flag = 1;
		while(flag){
			if (Hash[y].cent == 0)//判断是否已经存入数据
			{
				Hash[y].date = x;
				Hash[y].cent = 1;
				flag = 0;
				sum++;
			}
				y++;
		}
}
void Search(HashTable Hash,int key)//搜查关键词
{
	int min = 0;
	int max = m;
	int t = key % 13;//key应该存放的位置
	while (min <= max)
	{
		int mid = (max + min) / 2;
		if (t == (Hash[mid].date) % 13 && key == Hash[mid].date)
		{
			cout << "查找成功:" << mid << endl;
			return;
		}
		else if (t > (Hash[mid].date % 13))
		{
			min = mid;
		}
		else { max = mid; }
	}
	cout << "无目标值:" << endl;
	return;
}
int main()
{
	HashTable Hash;
	int n = 12;
	cout << "请输入存放的关键字:" << endl;
	while (n--)
	{
		int x;
		cin >> x;
		CreateHash(Hash, x);
	}
	cout << "散列完成后的数组内容:" << endl;
	for (int i = 0; i < m; i++)
	{
		cout << Hash[i].date << "  ";
	}
	cout << "\n";
	cout << "请输入要查找的关键字:" << endl;
	int k;
	cin >> k;
	Search(Hash, k);
	return 0;
}

运行截图

数据结构------基于线性探测解决哈希冲突哈希表 刹车 阅读详情

相关推荐

实验哈希表查找

实验七 查找 2.(必做题)实现哈希表的构造和查找算法,要求:用除留余数法构造哈希函数,分别用一次探测再散列、二次探测再散列解决冲突

小明同学的博客 2098

实验哈希表的查找操作

一、实验目的 1.掌握哈希表、哈希函数与哈希冲突的概念。 2.掌握哈希表的构造方法及其计算机的表示与实现。 3.掌握哈希表查找算法实现。 二、实验内容 1.以开放地址法中的线性探测再散列法处理冲突实现哈希表的建立、查找和插入操作。 2.以链地址法,也叫拉链法处理冲突实现哈希表的建立,查找和插入操作。 三、实验要求 1.以开放地址法中的线性探测再散列法处理冲突实现哈希表的建立

沉默的大多数 6508

哈希表算法(闭散列表操作,开散列表操作)创建,查找,插入,删除

#include <stdio.h> #include <malloc.h> #include "stdlib.h" #include <math.h> typedef int Status; typedef int KEYTYPE; typedef struct { KEYTYPE key; }ElemType; typedef struct { ...

qq_45150239的博客 2665

本科课程【数据结构算法实验6 - 创建哈希表、最短路径(Dijkstra算法

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。 博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/ca.

1+1=王的博客 3380

数据结构算法(6)哈希表

数据结构算法(6)哈希表

weixin_63714970的博客 1978

xdoj用除留余数法和线性探测再散列的冲突解决方法构造哈希表

(XDOJ)用除留余数法和线性探测再散列的冲突解决方法构造哈希表

gled fish的博客 1396

数据结构实验九:设计并验证如下算法:二叉树采用二叉链表存储表示,按输入的关键键字建立一棵二叉排序树,并删除二叉排序树中的某个结点。实现哈希表的构造和查找算法,要求:用除留余数法构造哈希表,分别用一次

设计并验证如下算法:二叉树采用二叉链表存储表示,按输入的关键键字建立一棵二叉排序树,并删除二叉排序树中的某个结点。 实现哈希表的构造和查找算法,要求:用除留余数法构造哈希表,分别用一次探测再散列,二次探测再散列解决冲突

2301_80392147的博客 360

数据结构实验报告(C++) 实验4:查找与排序实验指导(含源码)

整理一下之前的作业,说不定会帮上别人如果其中选做题没有源码或没有运行截图,那是因为作者也未完成,请见谅一、查找与排序实验(1)——查找选做题题目1.队列元素倒置。

Last_time233的博客 1070

SWUST软件技术基础实验(3)查找算法实现

实验目的: 1.掌握顺序表上查找的实现及监视哨的作用。 2.掌握折半查找所需的条件、折半查找的过程和实现方法。 3.掌握二叉排序树的创建过程,掌握二叉排序树查找过程的实现。 4. ...

酒中欢的博客 1113

哈希表及其运算的实现

#include #define MaxSize 100 //定义最大哈希表长度 #define NULLKEY -1 //定义空关键字值 #define DELKEY -2 //定义被删关键字值 typedef int KeyType; //关键字类型 typedef char * InfoType; //其他数据类型

Painc. 714

哈希表(散列表)C/C++代码实现

哈希表(散列表): 1,构造散列函数 最常用的方法除留余数法: H(key) = key%p 这个方法的关键是选取适当的p, 一般情况下,可以选p为小于表长的最大质数。例如表长m=100, 可取p=97。 2,处理冲突 选择一个 “好” 的散列函数可以在一定程度上减少冲突,但在实际应用中,很难完全避免发生冲突 1,开放地址法 (1)线性勘测法 (2)二次探测法 (3)伪随机探测法 线性探测法的优点是:只要散列表未填满,总能 找到一个不发生冲突的地址。缺点是:会产生 ”二次聚集“ 现象。而二次探测法和伪随机

Ycy的博客 1万+

哈希表(散列表)详解

深入理解哈希表,哈希函数的构造和解决哈希冲突方法

不能再留遗憾了的博客 2202

散列表(哈希表)知识详解

哈希表知识总结

m0_57105290的博客 6492

算法哈希表

本次为大家带来的是哈希表算法中的应用与实践,主要讲解哈希表的思路以及在算法题中的应用,本篇文章由于是面向算法党的,对于工程实现部分讲解较为粗糙,以后会在STL中详细讲解工程实现。当然,本篇文章会给出哈希表的两种快速实现,希望大家能将这两个模板理解记忆,方便面试中或者算法竞赛中快速实现。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构

白晨的博客 3314

实验哈希表算法实现

采用除留余数法实现哈希表创建任意采用一种处理冲突方法解决冲突计算哈希表的平均查找长度。编程实现以下功能: 已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希函数定义为:H(key)=key MOD 13, 哈希表长为m=16。实现哈希表的散列,并计算平均查找长度(设每个记录的查找概率相等)。 (1)哈希表定义为定长的数组结构; (2)使用线性探测再散列或链地址法解决冲突; (3)散列完成后在屏幕上输出数组内容或链表; (4)输出等概率查找下的平均查找长度;

qq_73625278的博客 1206

数据结构算法——散列表类的C++实现(探测散列表)

散列表类的C++实现(探测散列表)...

Be The Best! 7788

算法之散列表:基于拉链法的高效查找实现

在编程学习的道路上,算法解决各类复杂问题的核心工具,其重要性不言而喻。我在学习算法的过程中,收获了许多宝贵的知识,但也遇到了不少挑战。深知独自面对算法难题时的困惑,所以希望通过这篇博客,能和大家一起深入学习算法知识,在交流分享中共同进步,让更多人领略算法的魅力,提升编程技能。

wj_rdk的博客 1782

数据结构实验】查找(一)基于散列表的查找算法

实验将通过C语言实现基于散列表的查找算法

天地玄黄 魑魅魍魉 风花雪月 商角徵羽 1524
下一篇: 【数据结构】快速排序
文风丧胆
博客等级 码龄4年 35粉丝 3原创
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文风丧胆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值