程序猿的读书历程:x语言入门—>x语言应用实践—>x语言高阶编程—>x语言的科学与艺术—>编程之美—>编程之道—>编程之禅—>颈椎病康复指南。
前言:
哈希表(Hash Table)是一种高效的键值对存储数据结构,广泛应用于各种需要快速查找的场景,如数据库索引、缓存系统、集合等。它的基本思想是通过哈希函数将键映射到哈希表中的一个位置,从而实现快速的数据插入、删除和查找操作。下面我们将详细介绍哈希表的工作原理、实现方式、优缺点以及应用场景。
一、哈希概念
哈希是一种思想,普遍是通过一个哈希数组来存储数据的。学哈希思想,最重要的就是抓住映射两个字,它是一个无序的数据结构,所以想要找到存储的数据,就必须通过相对应的哈希关系来寻找。
对于该数据结构:
插入元素:
根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放
搜索元素:
对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置
取元素比较,若关键码相等,则搜索成功(一般来说的计算方法都是对值取余)
该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称
为哈希表。
以最简单的整形数据来举例,哈希结构想要与整形产生映射关系,最简单的就是跟哈希数组的下标产生映射。如果存储数据的哈希数组大小为10,例如:数据集合{1,7,6,4,5,9},哈希函数设置为:hash(key) = key % capacity;(capacity为存储元素底层空间总的大小)
。
就通过把他们的值取余一个数组大小10,虽好放入相应下标的数组空间中,这就是最简单的映射关系:把1存储到下标为1的地方,4存储到下标为下标为4的地方,6存储到下标为6的地方。就算存储十位数百位数也是如此操作。

这样,我们就能通过这个映射关系,可以不经过任何比较,一次直接从表中得到要搜索的元素。
二、哈希冲突
但是通过上面的介绍,相信不少童鞋已经发现了,一个下标只能存储一个数据,如果我们有两个数,转换后的下标相同呢?
即:不同关键字通过相同哈希哈数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞。
倘若数据中发生了哈希冲突,我们应该怎么做呢?
引起哈希冲突的一个原因可能是:
哈希函数设计不够合理
。所以我们要先来了解一下哈希函数的涉及原则:
1、哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有
m
个地址时,其值
域必须在
0
到
m-1
之间
2、哈希函数计算出来的地址能均匀分布在整个空间中
3、哈希函数应该比较简单
常见的哈希函数主要是有两种,一种是直接定址法:
取关键字的某个线性函数为散列地址:
Hash