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}
订阅专栏 解锁全文
784

被折叠的 条评论
为什么被折叠?



