数据结构----哈希表

系统的哈希函数

应用:数据比较多的情况下

用顺序表 数组 实现

哈希表(Hash Table),也称为散列表,是一种用于实现关联数组(Associative Array)或映射数据结构的数据结构。它通过将键(Key)映射到值(Value)的方法来实现快速的数据查找。哈希表的核心思想是将键通过哈希函数映射到一个固定大小的数组中,使得查找时间复杂度接近常数级别。

哈希表的基本原理如下:

  1. 首先,定义一个固定大小的数组,称为哈希表。

  2. 对于每个键值对,通过哈希函数将键映射为数组中的一个索引(通常称为哈希值)。

  3. 如果多个键映射到同一个索引,就发生了哈希冲突,通常的解决方法是使用一种碰撞解决技术,比如开放定址法(Open Addressing)、链地址法(Chaining)等。

  4. 当需要查找、插入或删除一个键值对时,通过哈希函数计算键对应的索引,并在数组中进行相应的操作。

哈希表的优点:

  • 查找速度快:通过哈希函数计算出键对应的索引,从而可以快速定位到目标数据。

  • 插入和删除操作高效:通过哈希函数计算出键对应的索引,直接在数组中进行操作,不需要进行线性搜索。

  • 适用于大规模数据:哈希表适用于需要高效处理大量数据的场景,比如数据库索引、编译器符号表等。

哈希表的缺点:

  • 哈希冲突:不同的键可能映射到相同的索引位置,需要解决冲突问题,否则会影响哈希表的性能。

  • 内存消耗:如果哈希表的大小不合适或哈希函数设计不合理,可能会导致内存浪费或哈希冲突的频率增加。

常见的哈希表实现包括开放定址法(如线性探测、二次探测、双重哈希等)和链地址法(使用链表解决冲突)等。在实际应用中,选择合适的哈希函数和解决冲突的方法非常重要,可以影响哈希表的性能和稳定性。

函数构造:

1.计算简单

2.地址分布均匀

函数构造方法:

处理冲突的方法

哈希函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef int DATATYEP;

typedef struct 
{
    DATATYEP* head;
    int tlen;
}HS;


HS* CreateHsTable(int len)
{

    HS* hs = (HS*)malloc(sizeof(HS));
    if(NULL == hs)
    {
        perror("CreateHsTable");
        return NULL;
    }

    hs->head = (DATATYEP*)malloc(sizeof(DATATYEP)*len);
    if(NULL == hs)
    {
        perror("hs->head malloc");
        return NULL;
    }
    hs->tlen = len;
    int i = 0 ;
    for(i=0;i<len;i++)
    {
        hs->head [i] = -1;
    }
    
    return hs;
}
void DestroyHsTable(HS* hs)
{
    free(hs->head);
    free(hs);
}    
int HSFun(HS* hs,DATATYEP*data)
{

    return *data % hs->tlen ; 
}
int HSInsert(HS* hs, DATATYEP* data)
{

    int ind= HSFun(hs,data) ;
    while(hs->head [ind]!=-1)
    {
        ind = (ind+1)%hs->tlen;
       printf("ind:%d num:%d\n",ind,*data); 
    }
    memcpy(&hs->head [ind],data,sizeof(DATATYEP));
    return 0;
}
int HSSearch(HS* hs,DATATYEP*data)
{
    int ind = HSFun(hs,data);
    int oldind = ind;
    while(hs->head[ind]!=*data)
    {
        ind=(ind+1)%hs->tlen ;
        if(ind == oldind)
        {
            return -1;
        }
    }
    return ind;


}
int main(int argc, char *argv[])
{
    int array[12]={12,67,56,16,25,37,22,29,15,47,48,34};
    HS* hs = CreateHsTable(12);
    int i =0;
    for(i = 0 ;i<12;i++)
    {
        HSInsert(hs,&array[i]);
    }

    int data=17;
    int ret = HSSearch(hs,&data);
    if(-1 == ret)
    {
        printf("can't find\n");
    }
    else 
    {
        printf("find it ,ind :%d\n",ret);
    }
    return 0;
}


  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值