散列函数之简单散列函数算法

1. 问题

设有10个非负整数,用不多于20个的储存单元来存放,如何存放这10个数,使得搜索其中的某一个数时,在储存单元中查找的次数最少?

问题类似于,有10个带号码的球,放到编号为{0, 1, 2, …, 19}共20个盒子中,每个盒子最多放一个,问如何放,使能够用最少的次数打开盒子,知道任一个球所在的盒子编号?

2. 分析

2.1 最简单的情况

设10个球的号码分别是 : {1, 2, 3, …, 10}

那么我们只要10个盒子,按顺序依次将球放入{1, 2, 3, …, 10}中,那么任一个球的所在的盒子就是球的号码,打开对应编号的盒子,一次即可找到这个球

当然,我们还可以这样放:

设球的号码 = n, 盒子的编号 = k (k ∈ {0, 1, 2, …., 9})

球放入盒子的方式 f(n) = (n +  x) % m = (n + x) % 10

即将每个球偏移x个位置,当x = 1时,则如:1号球放到2号盒子,2号球放到3号盒子,依次类推,最后10号球将在0号盒子

这就是最简单的散列函数了,当处理球号为{4, 5, 6, …, 13}, {22, 23, 24, …, 31}这样起点不同的球号组合时,可以通杀。

进一步,如果10个球中,所有的球号除以盒子数20,所得的余数都不相同,即没有冲突,仍可以用该散列函数处理,

如{0, 1, 3, 5, 6, 7, 9, 13, 14, 17, 39}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值