实验:哈希表的算法实现

这篇具有很好参考价值的文章主要介绍了实验:哈希表的算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验内容

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

已知一组关键字(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;
}

运行截图

编写程序,用除留余数法创建一个哈希表,解决冲突方法采用线性探测法,并对指定元素,数据结构,算法,排序算法文章来源地址https://www.toymoban.com/news/detail-762219.html

到了这里,关于实验:哈希表的算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++哈希表的实现

    解决哈希冲突两种常见的方法是:闭散列和开散列 因为线性探测跟二次探测很像,所以这里就只实现线性探测了 1.线性探测 1.动图演示 2.注意事项 3.代码的注意事项 1.仿函数的问题: (1).因为string类型不能进行取模运算,因此给string类型增加一个仿函数 该仿函数可以将string转为整

    2024年02月04日
    浏览(44)
  • 实验5 MapReduce初级编程实践(2)——编写程序实现对输入文件的排序

    通过实验掌握基本的MapReduce编程方法; 掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04) Hadoop版本:3.1.3 现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数

    2024年02月09日
    浏览(40)
  • Python 哈希表的实现——字典

    哈喽大家好,我是咸鱼 接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧 虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构 在 Python 中,字典的键(key)被哈希,哈希值决定了键对应的值(value)在字典底层数据存储中的位

    2024年02月05日
    浏览(41)
  • C++【哈希表的模拟实现】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 哈希表的核心思想是 映射 ,对数据的键值进行处理后, 映射 至表中对应的位置,实现存储,利用空间换时间,哈希表的查找效率非常高,可以达到 O(1) ,哈希表的实现主要分为两种:

    2024年02月13日
    浏览(42)
  • 并查集和哈希表的实现

    1.将两个集合进行合并 2.询问两个元素是否在一个集合里面 基本原理:每一个集合用一棵树来表示,树根的编号就是整个集合的编号,每一个点存储的都是其父节点,p[x]表示的就是x的父节点 要考虑的问题有三个 问题一:如何判断树根 if(p[x]==x) 问题二:如何求x的集合编号

    2024年02月01日
    浏览(76)
  • 【C++】“最强查找“哈希表的底层实现

    哈希表的查找的时间复杂度是O(1)~ 文章目录 前言 一、哈希冲突和哈希函数 二、哈希表底层实现 1.开放地址法 2.链地址法 总结 哈希概念: 顺序结构以及平衡树 中,元素关键码与其存储位置之间没有对应的关系,因此在 查找一个元素 时,必须要经过关键码的多次比较 。

    2024年02月06日
    浏览(46)
  • 2、有序链表的维护【问题描述】编写一个程序,根据从标准输入接收的指令来维护和操作排序的链表(C语言、java和Python分别实现)

    【问题描述】 编写一个程序,根据从标准输入接收的指令来维护和操作排序的链表。链表是按顺 序维护的,这意味着链表中的数据在每次操作后都以递增的数字顺序存储。 请注意,在创建新节点时,需要使用malloc为它们分配空间;一旦不再需要任何已 分配的空间,就应该使

    2024年02月09日
    浏览(45)
  • OpenCV书签 #差值哈希算法的原理与相似图片搜索实验

    差值哈希算法(Difference Hash Algorithm,简称dHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片的搜索工作。   差值哈希算法通过计算相邻像素的差异来生成哈希,即通过缩小图像的每个像素与平均灰度值的比较,生成一组哈希值。最后,利用两组图像的哈希值的汉

    2024年01月23日
    浏览(47)
  • OpenCV书签 #感知哈希算法的原理与相似图片搜索实验

    感知哈希算法(Perceptual Hash Algorithm,简称pHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片搜索工作。   感知哈希算法(pHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过使用离散余弦变换(DCT)来获取频域信息。然后,根

    2024年01月22日
    浏览(41)
  • OpenCV #以图搜图:均值哈希算法(Average Hash Algorithm)原理与实验

    均值哈希算法(Average Hash Algorithm,简称aHash) 是哈希算法的一种,主要用来做相似图片的搜索工作。   均值哈希算法(aHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过缩小图像的每个像素与平均灰度值的比较,生成一组哈希值。最后,

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包