嵌入式linux c 学习笔记9---哈希链表

本文介绍了哈希表的概念、哈希函数的构造方法以及哈希冲突的解决办法,包括开放地址法和拉链法。提供了一个使用除留余数法构建的哈希表的C语言实现,包含查找、删除和插入操作。同时,文章要求根据Linux内核的list.h头文件,实现一个哈希链表,包含查找、增加和删除功能。
摘要由CSDN通过智能技术生成

/*
 * =====================================================================================
 *
 *       Filename:  hash.c
 *
 *    Description:  hash表
 *         Author: cdutyangshaokun@163.com
 * =====================================================================================
 */
hash table 又称散列表,是一种线性存储结构。
hash的基本思想是:设要存储的对象个数为n,设置一个长度为m(m>=n)的连续内存单元,以线性表中的每个对象的关键字ki(0=<i<n-1)为自变量,通过一个哈希函数的函数h(ki),把ki映射为内存单元的地址,并把该对象存储在这个内存单元中。h(ki)也称为哈希地址。

哈希冲突:对于两个关键字ki和kj(i!=j),有ki!=kj,但是有h(ki)=h(kj).
同常把具有不同关键字而具有相同哈希地址的对象称为“同义词”,由同义词引起的冲突称为同义词冲突。

哈希函数的构造方法:
 1: 直接地址法:
     直接地址法是以关键字k本生或关键字加上某个数值常量c作为哈希地址的方法。
                h(k)=k+c
                这种方法简单,当关键字的分布基本连续时,可用直接地址法的哈希函数,否则,若关键字分布不连续将造成内存单元的大量浪费。

2:除留余数法:
    用关键字k除以某个不大于哈希表长度m的数p所得的余数作为哈希地址的方法
                h(k)=k%p
            p应该取不大于m的素数效果最好。
3:数字分析法:
    提取关键字中取值教均匀的数字位作为哈希地址的方法。


哈希冲突解决的办法:
    基本思想是当发生哈希冲突时通过哈希冲突函数产生一个新的哈希地址使hl(ki)!=
    hl(kj),哈希冲突函数产生的哈希地址仍可能有哈希冲突问题,此时,在用一个新
    的哈希冲突函数得到新的哈希地址,一直到不存在哈希冲突为止。

    1:开放地址法:哈希空闲单元既向同义词关键字开发,也向发生冲突的非同义词开放。
    a:线性探查法:
        从发生冲突的地址开始,依次探查d的下一个地址,直到找到一个空闲地址为止,公式描述为:
            d0=h(k);
            di=(di+1)modm  (1<<i<<m-1)
    b:平方探查法:
            d0=h(k);
                    2
            di=(d0+i )mod m  (1<<i<<m-1)
    缺点:不能探查到哈希表上的所有单元,但是至少能探查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值