1.哈希表和数组
我们先来看这样一个问题
问题:
把乱序5个自然数 1 2 3 4 5存入到数组中,查询自然数5并返回它的下标
一个简单的思路就是申请一个数组,然后遍历数组查询值为5的下标并返回,c语言的代码实现如下
#include "stdio.h"
#include "stdlib.h"
int main() {
int arr1[5] = {4, 3, 2, 1, 5};
for (int i = 0; i < 5; ++i) {
if (arr1[i] == 5) {
printf("index is %d", i);
break;
}
}
}
很明显,上述代码的时间复杂度是o(n),有没有更快的方式呢,就是给出一个数,通过计算就能得到它的下标在哪?
我们可以设计这种计算,输入的是数字,输出的是下标,这个函数叫做哈希函数,每个数字和英文字母都应对应的ASCII码,我们用 ASCII % 5的方式来作为它的下标,哈希函数就是: 输入值的ASCII % 5,c语言的代码实现如下
#include <stdio.h>
#include <stdlib.h>
typedef struct Dict {
int size;
int *value;
}Dict;
// 哈希函数,返回下标值
int hash(int key) {
return key % 5;
}
Dict* initDict() {
Dict* dict = (Dict*) malloc(sizeof(Dict));
dict->value = (int*) malloc(sizeof(int) * 5);
dict->size = 0;
// 将节点初始化为0
for (int i = 0; i < 5; ++i) {
dict->value[i] = 0;
}
return dict;
}
void destroyDict(Dict* dict) {
free(dict);
}
void put(Dict* dict, int value) {
int index = hash(value);
dict->value[index] = value;
}
int main() {
int arr1[5] = {4, 3, 2, 1, 5};
Dict* d1 = initDict();
for (int i = 0; i < 5; ++i) {
put(d1, arr1[i]);
}
int index = hash(5);
printf("%d", d1->value[index]);
destroyDict(d1);
return 0;
}
哈希表的存储也是通过数组来实现的,但是不同与数组按照顺序一个个放入数据,哈希表会通过哈希函数来计算下标,将值放入对应的位置,同样的,取值时,只需要根据哈希函数进行计算,就能得到数组的下标值,所以查找的时间复杂度是o(1)