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

我搜索了stackoverflow和谷歌,无法找到我正在寻找的是这个:

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

例如
        keys = {56,69,3493,49956,345678,345679,…. etc}

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

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

在上面的示例中,如果删除了密钥69,则散列3493上返回的散列整数应该是1(而不是2),因为它随后变为第二个最小的数字.

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

最佳答案 实际上,我不知道我是否理解你想要做什么.

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

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

Binary Search Algorithm

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

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

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

点赞