C的hash实现

hash属于非常基础的内容,可以衍生出非常多的应用,因此网上讲解hash的基本原理,应用场景的文章浩如烟海。

LeetCode上关于hash的原理讲解简单明确,可以参考:https://leetcode-cn.com/explore/learn/card/hash-table/

重点关注:

1、hash处理中,key哈希后的冲突比例,一般来讲桶的大小是数据规模的2倍,这样可以有效防止key过于冲突,因此需要提前评估处理数的规模,或者像标准模板库一样实现桶的动态增长(具体如何增长?)。最简单的就是一次性将桶的大小定义大些。桶的大小优先选择质数,参考:https://blog.csdn.net/shiyongyang/article/details/78079109

2、hash函数需要根据key的特点选择散列性较好的函数,

字符串参考:https://blog.csdn.net/shuckstark/article/details/8178270

整数参考:https://blog.csdn.net/qq_42763389/article/details/82995480

由于key可以选择数字,字符串,结构体等各种自定义类型,因此如何生成key的hash值是关键点,可能key和hash函数之间不是直接的计算关系,需要先对key进行预处理或转换,然后在求hash值。比如小写字母,可以先减掉‘a’变成0-25的数字,

3、对于key冲突的处理,一般使用有序数组、单/双链表,集合存放。数组可以二分查找,链表只能顺序查找,集合则采用平衡二叉树。如果确定最大规模,可以直接使用固定长度数组处理,如果不确定可以使用单链表。

 

C++标准库中有unordered_map(hash键值对)/ unordered_set(hash集合),对于语言内建的类型和string都支持,同时也会随数据规模动态增长桶的大小。

 

C语言可以使用开源hash代码uthash,参考:https://blog.csdn.net/xuyuegang/article/details/18939873

uthash库比较复杂,但弹性较高,LeetCode默认已经支持该库,在实际使用中,自己简单封装了一个C语言版本hash库

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值