微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为连续范围创建一个“完美的哈希函数”

如何解决为连续范围创建一个“完美的哈希函数”

我正在寻找一种将一系列“范围”“投影”为一系列值的方法。应用程序将是具有不均匀 bin 的直方图或查找表的创建。

示例:

0 到 14 => 0

15 到 234 => 1

235 => 2

236 到 255 => 3

右侧“结果”值 (0,1,2,3) 的实际顺序并不重要,只要它们在 0 和 3 之间,这样我就可以在之后使用一个小的查找表。如果我可以在浮点值(左侧)上进行这项工作,那就更好了。

我知道我可以在这里使用 8 位查找表并重复值,但我想找到一种“完美散列”的方法:通过一系列系统操作(尽可能小,没有分支)计算左边值的右边,以获得最小的可能结果空间。

我似乎无法为这种算法找到正确的谷歌魔法咒语系列。

如果需要,这个'hash'或'projection'函数的计算时间可以是几天。

解决方法

如果您有 n 范围没有重叠或间隙,您可以使用 O(log2(n)) 指令生成一些简单的代码来进行此查找。我会用一些 Python 代码来演示。

# Must be a power of two,extend with zeros on the right if needed.
lookup = [0,15,235,236]

def index(x):
    i = 0
    # ceil(log2(len(lookup))) iterations in the following pattern.
    # We only need 2 iterations here.
    # ...
    # i += (x >= lookup[i+8]) << 4
    # i += (x >= lookup[i+4]) << 3
    i += (x >= lookup[i+2]) << 2
    i += (x >= lookup[i+1]) << 1
    return i

这被称为无分支二分搜索。例如。即使您有 216 个范围,这也只需要 32 次加法和 16 次表查找、比较和位移来计算精确索引。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。