1. 概述

哈希地址:是一个逻辑地址<–哈希函数

哈希取值方法:

  1. 平方取中法
  2. 取余法
  3. 直接定址法
  4. 折叠法

哈希冲突:当两个数据的取余值相同时会指向同一个储存地址。

哈希冲突解决方案 :

  1. 开放地址法
  2. 邻接表法

2. 哈希函数

取余法(主要常用)

取余法是将数值进行以数组最长长度进行取余从而确定数值存储位置的方法。如下:

1
2
3
4
5
6
int num[6];//定义6个元素用来存储6个数值
int nums[6]={7,9,10,8,11,12};
while(i<6){
int m=nums[i]/6;
num[m]=nums[i];
}

上述代码就是表示当余数为0-5时,那么对应的数值就是放入下标为0-5的数组中进行存储。

直接定址法

直接定址法简单粗暴,缺点是耗费空间。如下:

1
2
3
4
5
6
7
int nums[]={22,35,67,56};
num[100];
int i=0;
while(i<=4){
num[nums[i]]=nums[i];
i++;
}

上述代码就是将数值分配到与之相同的数组下标,那么我们数组开辟的空间时以所有数字中最大的为基准开辟的,故及其浪费时间;


3. 哈希冲突及其解决

哈希冲突是当有两个相同的值的时候会占据相同位置。那么我们可以用开放地址法解决

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//回到上面取余法的方法
int num[7];//定义6个元素用来存储6个数值
int nums[7]={7,9,10,8,11,1215};
int i;
while(i<7){
int m=nums[i]/6;
int c_m=m;
do{
if(num[m]==NULL)
{
break;
}
c_m=(c_m+1)&6;
while(c_m!=m);
num[m]=nums[i];
i++;
}

在上述过程中8和15发生冲突,那么我们判断当num[1]不为空时将会依次往下找空空间,知道有空位置就将其放入,就可以顺利将所有的元素放入。


4. 资料参考

【【一听就懂】算法详解:哈希算法!超详细算法思想讲解,理论+代码实践,带你零基础掌握编程核心算法!】https://www.bilibili.com/video/BV1aB4y1m7av?vd_source=602097138258a0057a732e44579de1ed

【数据结构与算法基础(青岛大学-王卓)】https://www.bilibili.com/video/BV1nJ411V7bd?p=22&vd_source=602097138258a0057a732e44579de1ed

【【纯干货】5分钟!!!让你学会c/c++中结构体struct的用法!】https://www.bilibili.com/video/BV1vF411n7fe?vd_source=602097138258a0057a732e44579de1ed

【哈希究竟代表什么?哈希表和哈希函数的核心原理】https://www.bilibili.com/video/BV1SZ4y1z7wT?vd_source=602097138258a0057a732e44579de1ed