如何编写保持整数键最小完美哈希的顺序?

时间:2014-08-01 05:22:30

标签: c hash

我搜索了stackoverflow和谷歌,但无法找到我正在寻找的是什么:

我有一组4字节无符号整数键,最多可达一百万左右,我需要将其用作表的索引。最简单的方法是简单地使用键作为数组索引,但是当我只使用几百万个条目时,我不想要一个4gb的数组!表条目和键是顺序的,所以我需要一个保留顺序的哈希函数。

e.g。         keys = {56, 69, 3493, 49956, 345678, 345679,....etc}

我想将密钥翻译成{0, 1, 2, 3, 4, 5,....etc}

键可能是任何整数,但总共不会超过200万。数字将随着密钥(和相应的数组条目)的删除而变化,但新密钥的编号始终高于先前编号最高的密钥。

在上面的示例中,如果键69被删除,则散列3493上返回的散列整数应为1(而不是2),因为它随后变为第二低的数字。

我希望我能解释这一点。以上是否可以使用任何快速有效的散列解决方案?我需要翻译才能获得nS的低100s虽然删除我希望需要更长的时间。我查看了CMPH,但找不到任何不涉及从文件中获取数据的使用示例。它需要在linux下运行并使用纯C编译gcc。

4 个答案:

答案 0 :(得分:1)

实际上,我不知道我是否理解你想要做什么。

您似乎正在尝试获取已存储在某处的有序排序整数的“数组”(或“列表”)中的索引号。

如果已将这些整数值存储在数组中,则在最佳时间内返回索引整数的算法为二进制搜索

Binary Search Algorithm

由于您的列表已知有序,因此二进制搜索在O(log(N))时间内工作,这非常快。

如果删除“键”列表中的元素,二进制搜索算法无论如何都可以工作,无需额外的努力或空间(但是,删除列表中的一个元素的操作强制执行,当然,移动所有元素位于已删除元素的右侧)。

您只需要为Ninary Search算法提供三个数据:数组,数组大小和所需的键。

答案 1 :(得分:1)

有一个完整的Python实现here。另见可用材料here。如果你只需要解码字典,最简单的方法是修改Python代码,使其吐出定义必要数组的C文件,并重新实现查找函数。

答案 2 :(得分:0)

可以通过使用两个动态分配的数组来解决:一个用于“键”,另一个用于键的数据。

要获取特定密钥的数据,首先要在密钥数组中找到,并且密钥数组中的索引是数据数组的索引。

当您删除密钥数据对或想要插入新项目时,您需要重新分配数组,并将密钥/数据复制到正确的位置。

我并不认为这是最好或最有效的解决方案,但无论如何它都是解决问题的方法之一。

答案 3 :(得分:0)

您不需要保留最小完美哈希的订单,因为任何旧哈希都可以。您不想使用4GB阵列,但使用2 MB的项目时,您不会介意使用3 MB的查找条目。

哈希映射的标准实现将完成这项工作。它允许您删除和添加条目,并在添加条目时为条目指定任何值。

这给你留下了问题"我可以在整数上使用什么哈希函数?"通常的答案是在除以素数时取余数。选择素数比您预期的数据略大。例如,如果您期望2M的项目,那么选择3M附近的素数。