博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译]C语言实现一个简易的Hash table(4)
阅读量:7009 次
发布时间:2019-06-28

本文共 875 字,大约阅读时间需要 2 分钟。

hot3.png

我们解释了Hash table中最重要的hash函数,并用伪代码和C语言实现了一个我们自己的hash函数hash函数碰撞是无法避免的,当发生碰撞时我们改如何有效的处理呢?这章我们就来讲解下。

处理碰撞

hash函数中将无限大的输入映射到有限的输出中,当不同的输入映射到相同的输出时,就会发生碰撞,每个的hash表都会采用不同的方法来处理碰撞

我们的哈希表将使用一种称为开放地址的双重哈希的技术来处理冲突。双重哈希使用两个散列函数来计算在发生碰撞后存储记录的索引。

双重哈希

i发生碰撞后我们使用如下方式来获取索引:

index = hash_a(string) + i * hash_b(string) % num_buckets

当没有发生碰撞时,i=0,所以索引就是hash_a的值,发生碰撞后,hash_a的结果就需要经过一次hash_b的处理。

hash_b可能会返回0,将第二项减少到0,这就导致hash表会将多个记录插入到同一个bucket中,我们可以在hash_b的结果后加1来处理这种情况,确保它永远不会为0

index = (hash_a(string) + i * (hash_b(string) + 1)) % num_buckets

算法实现

// hash_table.cstatic int ht_get_hash(const char* s, const int num_buckets, const int attempt) {    const int hash_a = ht_hash(s, HT_PRIME_1, num_buckets);    const int hash_b = ht_hash(s, HT_PRIME_2, num_buckets);    return (hash_a + (attempt * (hash_b + 1))) % num_buckets;}

上一章: 下一章:

转载于:https://my.oschina.net/simonWang/blog/3001471

你可能感兴趣的文章
single-row function和muti-row function
查看>>
keepalived
查看>>
意向锁
查看>>
线性规划
查看>>
常见错误分析-笔记
查看>>
P1256 显示图像(广搜)
查看>>
MongoDB(课时29 MapReduce)
查看>>
Slurm任务调度系统部署和测试(源码)(1)
查看>>
李超树详解
查看>>
怎样才是全能的程序员?
查看>>
with as的用法
查看>>
springboot oauth 鉴权之——授权码authorization_code鉴权
查看>>
〔池化纲领〕也及链表
查看>>
黑马程序员-蓝桥杯110问题练习
查看>>
AtCoder Beginner Contest 127 解题报告
查看>>
最大流EK算法
查看>>
在nuxt中引入Font Awesome字体图标库
查看>>
sql trace script
查看>>
程序员,请不要抢系统管理员的饭碗
查看>>
VCS双机由于ID冲突导致启动失败
查看>>