1 原因
查找最快的方式就是直接去找到那个东西,计算机中能否直接通过关键词key直接找到需要记录的存储位置,不需要比较。
存储位置= f(key)
这里把f称为散列函数,又称为哈希函数。这一块连续的存储空间称为哈希表。
2 哈希表
2.1 查找步骤
1)存储时,通过哈希函数计算记录的地址,并将数据存入该地址。
2)查找时,通过海希函数计算地址,去地址取出数据。
2.2 哈希函数构造
除留余数法。
以ip地址192.168.50.168为例,存储时可以把四个数字相加除以32得到余数作为key。
2.2 冲突
哈希在计算地址时肯定会遇到冲突,解决冲突的常用方法,链地址法。
遇到冲突之后,直接把相同哈希值的数据用链表串起来。
3 实现
链地址实现。冲突时使用链表进行存储。(未完待续)
#include <stdio.h>
int hash_length = 10;
typedef struct
{
int value;
struct hash_table_t *nxt_elmt;//此处注意时struct hash_table_t
}hash_table_t;
int hash(int value)
{
return value%10;
}
void insert_hash(hash_table_t *H,int value)
{
int hash_key;
hash_table_t *p;
hash_key = hash(value);
if( H[hash_key].value != -1)
{
p =(hash_table_t*) malloc(sizeof(hash_table_t));
p->value = value;
p->nxt_elmt = NULL;
H[hash_key].nxt_elmt = p;
}
else
H[hash_key].value = value;
}
void find_hash(hash_table_t *H,int value)
{
}
int main()
{
hash_table_t hash_base[hash_length],*p,*q;
int num=0;
for(int i=0;i<hash_length;i++)
{
hash_base[i].value = -1 ;//默认为-1
hash_base[i].nxt_elmt = NULL;
}
printf("please input num\n");
scanf("%d",&num);
printf("num = %d\n", num);
insert_hash(hash_base,num);
printf("please input num2\n");
scanf("%d",&num);
printf("num2 = %d\n", num);
insert_hash(hash_base,num);
for(int i=0;i<hash_length;i++)
{
printf("%d",hash_base[i].value);
q = hash_base[i].nxt_elmt;
while( q!= NULL)
{
//p = hash_base[i].nxt_elmt;
printf("\t %d",q->value);
q = q->nxt_elmt;
}
printf("\n");
}
printf("hello word!!!\n");
return 0;
}