哈希表简介
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。
哈希函数
得到一个数的hash值的函数,被称为哈希函数。
1. 整数
除留余数法, 对于大小为素数M的数组,对于任意正整数k,计算k除以M的余数。M一般取素数。
#define PRIME 11
int getIntHashCode(int a) {
return a%PRIME;
}
- 字符串
保留除余法
int getHashCode(char *str, int length) {
int hash = 0;
for (int i = 0; i < length; i++) {
hash = *(str + i) + hash * 31;
}
return hash;
}
间隔n个字符,得到哈希值
//间隔dk个字符
int getHashCode_2(char *str, int length, int dk) {
int hash = 0;
for (int i = 0; i < length; i=i+2) {
hash = *(str + i) + hash * 31;
}
return hash;
}
如果给定的数组超过我们存储的大小,就会有相同的哈希值,所以我们需要避免哈希冲突
哈希冲突
拉链法
将同一个哈希值的跟在之前的节点之后。
代码实现
ADT:
#include <stdio.h>