哈希算法学习

哈希学习

本人菜鸡,今天学习了简单的哈希用法,利用C语言,记录下我学习的过程,加深印象,如理解有误差请各位指正,非常感谢。


哈希是什么?

哈希能简单的看做一种映射,通过设计好的映射函数将关键字直接对应到哈希表中的某个位置。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。

上面内容中提到了:关键字、哈希表、哈希函数都是首次听到,由于从零开始学习哈希,一开始不太容易理解这里面的逻辑关系,我们通过一个小例子,简单的了解三个专业词之间的联系。


小例子(代码可直接复制粘贴运行)

附菜鸟教程c语言在线运行链接:c语言在线运行链接

问题描述:现在有一个整形数组:array_data[1000],内有1000个整形数据,而这1000个数据恰好都是0-99的整形数据,如果我们需要在1000个数据中寻找特定的元素(如数据:66),如果找到就返回1,没有找到就返回0,按照常规的思路一般是,在数组中一个一个的遍历与66是否相等,最坏总共要遍历1000次,代码如下:

#include "stdio.h"

int find_data(int *array, int *data)
{
	int i;
	
	for(i = 0; i < 1000; i++) {
		if(*data == array[i]) {
			/* 找到返回1 */
			return 1;
		}
	}
	/* 没有找到返回0 */
	return 0;
}

int main(void)
{
	/* 数据只有0-99的数组(随意给定) */
	int array_data[1000] = {1, 2, 3, 66, 6, 8, 10, 20, 30, 66};
	int data = 66;
	/* 顺序查找 */
	printf("%d", find_data(array_data, &data));
	
	return 0;
}

下面使用简单的哈希算法:
由于1000个数据中只可能出现0-99,因此我们能将用100大小的哈希数组表示这1000个数据,哈希数组的下标就是1000个数据的值,如果这1000个数据其中哈希数组就是上面描述的哈希表,而转换的过程就是哈希函数,关键字Hash(key) = key (key为0-99的数据)。

#include "stdio.h"

int main(void)
{
	/* 数据只有0-99的数组(随意给定) */
	int array_data[1000] = {1, 2, 3, 66, 6, 8, 10, 20, 30, 66};
	int data = 66;
	/* 哈希表 */
	int array_hash[100] = {0};
	int i;
	
	/* 建立哈希表array_data */
	for(i = 0; i < 1000; i++) {
		/* 哈希表 */
		array_hash[ array_data[i] ] ++;
	}
	/* 输出66出现的个数 */
	printf("%d", array_hash[data]);
	
	return 0;
}

有人会问了:啊,你这查找不是脱裤子放屁吗?一点都没有节省时间。不仅增加了100个数据的内存在时间上还没有简化。
( ⊙ o ⊙ )是的,在这个例子中确实是这样的,并且哈希算法就是这样的过程。
但当我们建立了哈希表以后,再次查找数据时直接搜索哈希表就行,不需要再遍历原数组了,并且原数组的数据量就算再大,哈希表只要不到达单个数据存储的上限(即int的数据大小)都不会增加哈希表的大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值