查找算法之哈希查找

突破编程_C++_查找算法哈希查找 C++ 查找算法哈希查找 阅读详情

哈希查找是通过计算数据元素的存储地址进行查找的一种方法。O(1)的查找,即所谓的秒杀。哈希查找的本质是先将数据映射成它的哈希值。哈希查找的核心是构造一个哈希函数,它将原来直观、整洁的数据映射为看上去似乎是随机的一些整数。

哈希查找的操作步骤:

1)       用给定的哈希函数构造哈希表;

2)       根据选择的冲突处理方法解决地址冲突;

3)       在哈希表的基础上执行哈希查找。

建立哈希表操作步骤:

1)       step1 取数据元素的关键字key,计算其哈希函数值(地址)。若该地址对应的存储空间还没有被占用,则将该元素存入;否则执行step2解决冲突。

2)       step2 根据选择的冲突处理方法,计算关键字key的下一个存储地址。若下一个存储地址仍被占用,则继续执行step2,直到找到能用的存储地址为止。

哈希查找步骤为:

1)       Step1 对给定k值,计算哈希地址 Di=Hk);若HST为空,则查找失败;若HST=k,则查找成功;否则,执行step2(处理冲突)。

2)       Step2 重复计算处理冲突的下一个存储地址 Dk=RDk-1),直到HST[Dk]为空,或HST[Dk]=k为止。若HST[Dk]=K,则查找成功,否则查找失败。

 

比如说:”5“是一个要保存的数,然后我丢给哈希函数,哈希函数给我返回一个”2",那么此时的”5“和“2”就建立一种对应关系,这种关系就是所谓的“哈希关系”,在实际应用中也就形成了”2“是key,”5“是value

那么有的朋友就会问如何做哈希,首先做哈希必须要遵守两点原则:

: key尽可能的分散,也就是我丢一个“6”和“5”给你,你都返回一个“2”,那么这样的哈希函数不尽完美。

②:哈希函数尽可能的简单,也就是说丢一个“6”给你,你哈希函数要搞1小时才能给我,这样也是不好的。

其实常用的做哈希的手法有“五种”:

第一种:”直接定址法“。

很容易理解,key=Value+C;这个“C"是常量。Value+C其实就是一个简单的哈希函数。

第二种:“除法取余法”。

很容易理解, key=value%C;解释同上。

第三种:“数字分析法”。

这种蛮有意思,比如有一组value1=112233value2=112633value3=119033

针对这样的数我们分析数中间两个数比较波动,其他数不变。那么我们取key的值就可以是

key1=22,key2=26,key3=90

第四种:“平方取中法”。此处忽略,见名识意。

第五种:“折叠法”。

这种蛮有意思,比如value=135790,要求key2位数的散列值。那么我们将value变为13+57+90=160,然后去掉高位“1,此时key=60,哈哈,这就是他们的哈希关系,这样做的目的就是key与每一位value都相关,来做到“散列地址”尽可能分散的目地。

影响哈希查找效率的一个重要因素是哈希函数本身。当两个不同的数据元素的哈希值相同时,就会发生冲突。为减少发生冲突的可能性,哈希函数应该将数据尽可能分散地映射到哈希表的每一个表项中。

解决冲突的方法有以下两种:  

(1)   开放地址法  

如果两个数据元素的哈希值相同,则在哈希表中为后插入的数据元素另外选择一个表项。当程序查找哈希表时,如果没有在第一个对应的哈希表项中找到符合查找要求的数据元素,程序就会继续往后查找,直到找到一个符合查找要求的数据元素,或者遇到一个空的表项。  

(2)   链地址法

将哈希值相同的数据元素存放在一个链表中,在查找哈希表的过程中,当查找到这个链表时,必须采用线性查找方法。

 

实现哈希函数为“除法取余法”,解决冲突为“开放地址线性探测法”,代码如下:

 

public class HashSearch {

	public static void main(String[] args) {
		//“除法取余法”
        int hashLength = 13;

        int [] array  = { 13, 29, 27, 28, 26, 30, 38 };

        //哈希表长度
        int[] hash = new int[hashLength];
        //创建hash
        for (int i = 0; i < array.length; i++)
        {
            insertHash(hash, hashLength, array[i]);
        }
        
        int result = searchHash(hash,hashLength, 29);

		if (result != -1)
			System.out.println("已经在数组中找到,索引位置为:" + result);
		else
			System.out.println("没有此原始");
	}

	/****
	 * Hash表检索数据
	 * 
	 * @param hash
	 * @param hashLength
	 * @param key
	 * @return
	 */
	public static int searchHash(int[] hash, int hashLength, int key) {
		// 哈希函数
		int hashAddress = key % hashLength;

		// 指定hashAdrress对应值存在但不是关键值,则用开放寻址法解决
		while (hash[hashAddress] != 0 && hash[hashAddress] != key) {
			hashAddress = (++hashAddress) % hashLength;
		}

		// 查找到了开放单元,表示查找失败
		if (hash[hashAddress] == 0)
			return -1;
		return hashAddress;

	}

	/***
	 * 数据插入Hash表
	 * 
	 * @param hash 哈希表
	 * @param hashLength
	 * @param data
	 */
	public static void insertHash(int[] hash, int hashLength, int data) {
		// 哈希函数
		int hashAddress = data % hashLength;

		// 如果key存在,则说明已经被别人占用,此时必须解决冲突
		while (hash[hashAddress] != 0) {
			// 用开放寻址法找到
			hashAddress = (++hashAddress) % hashLength;
		}

		// 将data存入字典中
		hash[hashAddress] = data;
	}
}

运行结果:
已经在数组中找到,索引位置为:3


 

C#实现哈希查找算法 在这个示例中,我们使用了Dictionary来实现哈希查找算法。首先,我们遍历数组,将数组元素作为键,元素在数组中的索引作为存储在Dictionary中。然后,我们可以通过目标在Dictionary中查找其索引,如果存在则返回索引,否则返回-1表示未到。C#实现哈希查找算法 阅读详情

相关推荐

【愚公系列】七大查找算法()-哈希查找

在编程语言中,查找算法是指在一个数据集合中查找某个元素是否存在的算法。常见的查找算法包括:顺序查找(Sequential Search):逐个遍历数据集来查找目标元素,时间复杂度为O(n)。二分查找(Binary Search):在有序数据集合中,从中间位置作为起点不断划分区间并查找,时间复杂度为O(log n)。插查找(Interpolation Search):在有序数据集合中,根据目标元素数据集合首尾之间的差,利用插估算目标元素的位置,时间复杂度为O(log log n)或O(n)

愚公智库 47万+

九种查找算法-哈希查找

我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都一个函数(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方。但是,不能够保证每个元素的关键字函数是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中。后面我们将看到一种解决"冲突"的简便做法。

螺旋翻转大大雄 5447

如何对正射影像DOM(卫星影像、无人机航拍影像)进行拼接、合并以及去黑边(附 Global Mapper Pro 24.0 安装包(中文注册版))

为什么要对正射影像DOM进行拼接?影像去黑边、影像拼接的操作和步骤。

从地图看世界的专栏 4243

数据结构算法之哈希搜索算法

数据结构算法之哈希搜索算法

weixin_47225948的博客 2161

【数据结构】---哈希表查找算法

 1哈希查找也叫散列查找,整个散列查找过程大概分两步       (1)在存储时通过散列函数计算记录的散列地址,并按此散列地址存储该记录。       (2)当查找时,一样通过散列函数计算记录的散列地址,然后访问散列地址的记录。     散列函数的构造方法        (1)直接定址法                       取关键字的某个线性函数为散列地址         ...

LeeCH的博客 4万+

哈希(Hash)查找算法详解之C语言版

哈希查找是一种快速查找算法,该算法不需要对关键字进行比较,而是以关键字为自变量,以该关键字在存储空间中的地址为因变量,建立某种函数关系,称为哈希函数,这样在查找某一关键字的时候,就可以通过哈希函数直接得到其地址,有效的提高了查找效率。 选取哈希函数及基本原则主要有:计算函数所需时间、关键字的长度、哈希表长度(哈希地址范围)、关键字分布情况、记录的查找频率等。 哈希函数的构造有多种,常见的有“直接定址法”、“数字分析法”、“平方取中法”、“折叠法”、“除留余数法”、“随机数法”等。

sunnyoldboy博客 2万+

哈希查找算法

哈希查找算法 哈希查找算法又称散列查找算法,是一种借助哈希表(散列表)查找目标元素的方法,查找效率最高时对应的时间复杂度为 O(1)哈希查找算法适用于大多数场景,既支持在有序序列中查找目标元素,也支持在无序序列中查找目标元素。讲解哈希查找算法之前,我们首先要搞清楚什么是哈希表。 哈希表是什么 哈希表(Hash table)又称散列表,是一种存储结构,通常用来存储多个元素。 和其它存储结构(线性表、树等)相比,哈希表查找目标元素的效率非常高。每个存储到哈希表中的元素,都配有一个唯一的标识(又称“索引”或者

ccc369639963的博客 1万+

【Python查找算法】二分查找、线性查找哈希查找

【Python查找算法】二分查找、线性查找哈希查找原理详解示例应用

qq_35831906的博客 1944

查找算法(三):哈希查找

哈希查找算法详解:原理实现 哈希查找通过哈希函数将数据映射到固定数组实现高效查找,时间复杂度可达O(1)。本文系统介绍了哈希表的核心原理,包括哈希函数设计、冲突处理机制(链式地址法和开放地址法),并给出Java代码实现示例。文章对比了两种冲突处理方法的特点,提出了优化策略如合理选择哈希函数、动态扩展哈希表等。哈希查找适用于频繁查找、插入和删除的场景,但实际应用中需注意哈希函数选择和负载因子控制等问题。本文为理解和使用哈希查找提供了全面指导。

一碗黄焖鸡三碗米饭的博客 1171

005.【查找算法哈希查找算法

哈希查找算法就是使用哈希函数来计算一个键所对应的地址,进而建立哈希表格,然后利用哈希函数来查找到各个键存放在表格中的地址。简单来说,就是把一些复杂的数据,通过某种函数映射(数学中的映射关系一样)关系,映射成更易于查找的方式。,完美的哈希查找算法一般都可以做到一次读取完成查找哈希查找算法就是这样一种算法,例如,在一本书中查找内容,首先翻开这本书的目录,然后在目录上到想要的内容,最后根据对应的页码就能到所需要的内容。哈希查找算法具有保密性高的特点,因此哈希查找算法常被应用在数据压缩和加解密方面。

qq_42226855的博客 981

python实现顺序查找哈希查找算法

顺序查找 顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法,顺序查找是最简单的搜索算法,其实现如下: def sequential_search(items, item): for i in items: if i == item: return i else: return False 适用于线性表...

python之战 1347

查找算法系列之复杂算法哈希查找

目前为止已经介绍了顺序查找、二分查找、分块查找、二叉排序树,见作者之前的文章: http://blog.csdn.net/u010025211/article/details/46635325 http://blog.csdn.net/u010025211/article/details/46635183 今天这篇博文将介绍哈希查找1.为什么要用哈希查找 之前所讲

susandebug 4399

Java 语言哈希查找算法实现

哈希查找是一种高效的查找算法,它能够快速定位元素并返回其位置。在Java语言中,我们可以使用HashMap或HashTable类来实现哈希查找。本文介绍了Java语言中的哈希查找算法的实现步骤,并给出了代码示例和运行结果。希望本文能够帮助你理解和使用哈希查找算法

三流程序员,三流的技术,一流的态度和真心,期待和你们交流合作🤝🤝🤝。 729

查找算法哈希查找

查找算法哈希查找

闲余知道 1025

Java实现哈希查找算法

在这个示例中,我们使用了HashMap来实现哈希查找算法。首先,我们遍历数组,将数组元素作为键,元素在数组中的索引作为存储在HashMap中。然后,我们可以通过目标在HashMap中查找其索引,如果存在则返回索引,否则返回-1表示未到。Java实现哈希查找算法

adendean的博客 564

QEMU源码全解析7 —— QEMU主函数

QEMU源码全解析7 —— QEMU主函数

phmatthaus的专栏 1261

简单实现步进电机梯形加减速控制(STM32精准控制步进电机第三期).zip

简单实现步进电机梯形加减速控制(STM32编程实例)源码分享【普通GPIO引脚编程驱动步进电机系列】

上一篇: 查找算法之二分查找
下一篇: 查找算法整理之索引查找
xiaoping8411
博客等级 码龄19年 147粉丝 203原创
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值