首页 > 其他分享 >哈希查找(按个位取余的方式)

哈希查找(按个位取余的方式)

时间:2024-06-18 22:29:08浏览次数:12  
标签:Hash int 按个 位取 pHash 哈希 nVal pMark

步骤:

1.构建哈希表进行分类

2.进行哈希查找(算法)

处理冲突:

按个位取余发现有两个或多个数重复,如:

会发现15,25,55,重叠了,对此进行冲突处理,冲突处理有三种:

1.地址偏移法

以上图为例,将和25按个位取余后重复的数填到25后面的位置,如果相邻的位置满了,在向后填。


2.再哈希法 

再次使用哈希法,直至填充完毕。

3.拉链法

以上图为例,像拉链一样将重叠数据以拉链形式挂在下面,示例代码

#include <iostream>
using namespace std;

struct Hash
{
	int nVal;
	int nIndex;//在原数组的元素下标
	Hash* pNext;
};

//每个元素是一个Hash*,所以这个函数的返回值是Hash**
Hash** CreateHashTable(int nLen, int arr[])
{
	if (arr == nullptr||nLen<=0)
	{
		return nullptr;
	}

	//创建哈希表的数组,一个表内有10个数字的大小
	Hash** pHash = new Hash*[10];
	//每一个元素都是个指针,所以要对其赋空
	memset(pHash, 0, sizeof(Hash*) * 10);
	//遍历数组,对每一个元素归位
	for (int i = 0; i < nLen; i++)
	{
		//创建元素的下标key
		int key = arr[i] % 10;
		//先创建节点pTemp
		Hash* pTemp = new Hash;
		pTemp->nVal = arr[i];
		pTemp->nIndex = i;
		pTemp->pNext = nullptr;
		//头部添加,类似于入栈
		pTemp->pNext = pHash[key];
		//将pHash指针指向新建的节点
		pHash[key] = pTemp;
	}
	return pHash;
}
int HashSearch(Hash** pHash, int nVal)
{
	if (pHash == nullptr || *pHash == nullptr)
		return -1;

	//创建元素的下标key,用来找位置
	int key= nVal % 10;

	Hash* pMark = pHash[key];
	//遍历链表
	while (pMark!=nullptr)
	{
		if (pMark->nVal ==nVal)
		{
			return pMark->nIndex;
		}
		pMark = pMark->pNext;
	}
}
int main()
{
	int arr[] = {10,23,45,67,99,69,46};
	Hash** pHash = CreateHashTable(7,arr);
	cout << HashSearch(pHash, 23) << endl;
	return 0;
}

标签:Hash,int,按个,位取,pHash,哈希,nVal,pMark
From: https://blog.csdn.net/2302_77573185/article/details/139772863

相关文章

  • 使用 shell 快速生成字符串的哈希值
    使用方式echo-n"dev"|sha256sum|cut-d''-f1此外也可以使用md5sum、sha224sum、sha1sum等,替换命令中的sha256sum即可。命令解释echo将字符串"dev"通过管道符传递给标准输出,-n选项可以去掉多余的换行符sha256sum本身接收的参数是文件路径,如果不指定,则从标......
  • (算法)找到字符串中所有字母异位词——<滑动窗⼝+哈希表>
    1.题⽬链接:438.找到字符串中所有字⺟异位词2.题⽬描述:3.解法(滑动窗⼝+哈希表): 算法思路:◦因为字符串p的异位词的⻓度⼀定与字符串p的⻓度相同,所以我们可以在字符串s中构造⼀个⻓度为与字符串p的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量; ◦当窗......
  • MD5哈希加密算法
    [TOP]简介MD5(Message-DigestAlgorithm5)是一种被广泛使用的密码散列函数,它可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。MD5并不是一种加密算法(因为它不可逆),而是一种摘要算法或哈希算法。以下是MD5加密(更准确地说是哈希)原理的简要概述:说明输入:MD......
  • Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合
    Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合和哈希表。以下是一些Redis命令的实践示例,帮助你了解如何使用Redis。连接Redis服务器首先,使用redis-cli命令连接到Redis服务器:redis-cli-h<hostname>-p<port>基本命令PING:检查Redis......
  • MD5哈希长度延展攻击(选做)
    任务详情任务描述:在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文......
  • 6.14 哈希表
    采用邻接表创建无向图G,依次输出各顶点的度。输入格式:输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数。输入第二行为顶点的信息,每个顶点只能用一个字符表示。依次输入j行,每行输入一条边依附的顶点。输出格式:依次输出各顶点的度,行末没有最后的空格。输入......
  • 代码随想录第7天 |● 454.四数相加II●383. 赎金信●15. 三数之和●18. 四数之和●哈
    题目:454.四数相加Ⅱ思路:0.知道用map,但是map存啥1.暴力法,四层循环遍历哈哈哈哈2.分而治之,化繁为简,四个数组a,b,c,d分成两组,题目求符合要求的元祖个数,所以将a+b的值和出现次数存储,之后遍历查找c+d中0-(c+d)出现的次数,统计为结果时间复杂度:O(n^2)空间复杂度:O(n^2),最坏情况下A......
  • 代码随想录 算法训练营d7 哈希表 Leetcode454 四数相加2 Leetcode383 赎金信 Leetcode
    Leetcode454四数相加2 题目链接简单理解四个数组的数构成元组 相加为0思想:参考力扣第一题两数之和 才用哈希表解决问题通过将ab数组之和存储到哈希表中,并记录次数再通过计算-(c+d)去匹配哈希表如果存在那么count+=次数即可classSolution{publicintfour......
  • c++哈希表hash_table的深度学习(hash_map,un和hash_set的底层实现)
    什么是哈希表?哈希表(HashTable)是一种数据结构,它使用哈希函数将键(key)映射到桶(bucket)或槽(slot)中,可以直接通过相应的键值直接对数据进行访问,高效的插入,删除,查找 哈希表的组成部分和特性哈希函数:哈希函数接受一个键作为输入,并返回一个索引值(通常是一个整数),该索引值用于确定键......
  • 代码随想录第6天 | ●哈希表理论基础●242.有效的字母异位词●349. 两个数组的交集●2
    题目:242.有效的字母异位词思路:1.ASCII和哈希函数,存入数组,比较数组相等否2.首先选择数据结构,题目只有小写字母,ASCII连续,选用数组,一个字符串遍历,在哈希数组中存入字母出现频率,第二个字符串遍历,做减法。(不需要记ASCII,直接减字母,编译器自己算)时间复杂度:O(n)空间复杂度:O(1)坑......