哈希表
哈希表的特点是:哈希表的增删改查,在使用时,时间复杂度为O(1)
java和c++有已经封装好的HashMap了
而如果想自己写实现一个hashmap的话可能得写一百多行代码了...
C语言需要调用第三方库 uthash.h
#include<stdio.h>
#include<stdlib.h>
#include"uthash.h"
struct person{
int id; // 这是key值
char name[20]; // 值1
int age; // 值2
UT_hash_handle hh; // uthash自带的指针
};
void add(int id, char* name, int age){
struct person* new_person = malloc(sizeof(struct person));
new_person->id = id;
// 这个strcpy相当于字符串的赋值操作
strcpy(new_person->name, name);
new_person->age = age;
//这里三个函数 people——头指针 id->key值 new_person 要添加去的指针
HASH_ADD_INT(people, id, new_person);
}
// 但是hashmap有一个特点:如果key值,比如一号柜已经有东西了, 再添加东西hashmap会直接把原本柜子里的东西丢出去(恶霸
// 而HASH_ADD_INT不能实现这个功能
void ebaadd(int id, char* name, int age){
struct person* new_person = malloc(sizeof(struct person));
HASH_FIND_INT(person, &id, new_person);
if(new_person->name != NULL || new_person->age !=NULL){
HASH_DELETE(new_person->id);
}
new_person->id = id;
strcpy(new_person->name, name);
new_person->age = age;
HASH_ADD_INT(people, id, new_person);
}
struct person* find_person(int id){
struct person* person_found;
HASH_FIND_INT(people, &id, person_found);
return person_found;
}
void print_people(){
struct person* cur_person;
// 遍历
for(cur_person = people; cur_person!=NULL; cur_person->hh.next){
printf("%d %s %d\n", cur_person->id, cur_person->name, cur_person->age);
}
}
void delete_person(int id){
struct person* person_del = find_person(id);
if(person_del != NULL){
HASH_DEL(person, person_del);
free(person_del);
}
else{
printf("person with id not found");
}
}
先会用再说...
哈希函数那段我真的没太听懂...
但是哈希表有颇多应用
哈希函数
一个函数经典的结构应该是这样,比如入栈操作
void(返回类型) push(函数名) ( struct Stack* stack, int value)
或是什么
int add(int a, int b)
总的来说 就是
out f(in)格式
哈希函数的性质
1.输入域被认为是无穷的 输出域是有限的
2.不是随机的,相同的输入,一定产生相同的输出
3.因为输入无穷输出有限,不同的输入,可能产生相同输出(哈希碰撞)
4. 均匀、离散,相同的大小在整个域里包含相同个数数据
应用
样本组A ——hash函数——> out组S ——%m———>m组
样本组A里是无规律的。但是经过哈希函数,out组S是均匀分布。
在%m后,就在0~m-1上面均匀分布。