我有两个未排序的32位无符号整数数组,分别为N1和N2。每个数组可能包含重复项。我想将每个值(2 ^ 32个可能的键)映射到一个大小为(N1 + N2)的字节数组中的位置,以记录每个键的频率。重复的键值应映射到该数组中的同一位置。此外,每个整数的频率不会超过100(这就是为什么我选择了一个字节数组来记录每个键的频率以节省空间); 如果最大可能的频率超过了这个值,我只需将字节数组更改为shorts数组等。
最终,我需要一个大小为N1 + N2的数组--不一定所有条目都会被使用,因为可能遇到重复项--其中包含每个唯一键值的频率。在最坏的情况下,只使用一个字节条目(例如,两个数组中的所有值都相同),留下((N1 + N2)-1)个未使用的条目。在最好的情况下,所有字节条目都被使用。
根据我的理解,我需要找到一个最小完美哈希函数,将已知数量的未知键(N1 + N2;范围均为 0 - 2^32)映射到已知数量的位置(N1 + N2)。我能够找到一些其他帖子,但是两个答案基本上都说要使用 gperf: 在这种情况下是否可能制作最小完美哈希函数? 最小完美哈希函数 第二个帖子(最小完美哈希函数)正是我正在尝试做的事情。
与其期望从答案中得到源代码(我使用的是C语言),我更希望能够得到一个关于如何创建一个对于N个任意正整数到N个桶的最小完美哈希函数的解释。我可以很容易地使用一个4GB的数组来进行每个可能整数的直接映射,但这会浪费大量未使用的空间,因此我希望能够减少这种巨大的空间浪费。同时,出于教育目的,我也希望不使用任何外部库来学习更多有关哈希的知识。请保留HTML标签。
最终,我需要一个大小为N1 + N2的数组--不一定所有条目都会被使用,因为可能遇到重复项--其中包含每个唯一键值的频率。在最坏的情况下,只使用一个字节条目(例如,两个数组中的所有值都相同),留下((N1 + N2)-1)个未使用的条目。在最好的情况下,所有字节条目都被使用。
根据我的理解,我需要找到一个最小完美哈希函数,将已知数量的未知键(N1 + N2;范围均为 0 - 2^32)映射到已知数量的位置(N1 + N2)。我能够找到一些其他帖子,但是两个答案基本上都说要使用 gperf: 在这种情况下是否可能制作最小完美哈希函数? 最小完美哈希函数 第二个帖子(最小完美哈希函数)正是我正在尝试做的事情。
与其期望从答案中得到源代码(我使用的是C语言),我更希望能够得到一个关于如何创建一个对于N个任意正整数到N个桶的最小完美哈希函数的解释。我可以很容易地使用一个4GB的数组来进行每个可能整数的直接映射,但这会浪费大量未使用的空间,因此我希望能够减少这种巨大的空间浪费。同时,出于教育目的,我也希望不使用任何外部库来学习更多有关哈希的知识。请保留HTML标签。