我对哈希函数有一个奇怪的想法。问题陈述是
您存储的ID为162 班上的学生获得n分 在一个课程中超过300(每个n = 0, 哈希表中的1,2,... 300)。设计 最简单,最不容易发生碰撞 这样的哈希函数就是这样的 浪费的记忆细胞也是最小的。 在这里,碰撞是两个学生 得分n 1 和 n 2 获得相同的插槽 哈希表。
一种解决方案可以是使用h(n)=(n * 5 + 7)%163以及链接。最多可以有162个不同的标记。
编辑有几种标准方法可以做到这一点。但是我想尝试一下我的想法并检查它(也许是数学上的)。它可能与较小的记忆有较小的碰撞。
现在,这是我的想法。我可以假设标记分布为gaussian。因此,平均得分附近有更多人,而极端情况则更少。
所以,我可以使用这样的哈希函数:
h(n)= 0(如果n <100 || n> 200) h(n)= 1(如果100 <= n <125 || 175 <= n <200)
h(n)= 2(如果125 <= n <140 || 160 <= n <175)
h(n)= 3(如果140 <= n <160)
对于某些此类条件(例如,k),哈希表将具有最少的冲突数和最少的占用空间。
现在,这只是猜测。这样的事情是否有意义?有没有办法证明这一点?或者我在某处错了?
答案 0 :(得分:4)
您在此处手动执行的操作在图像处理histogram equalization中调用。我认为这是绝对有意义的,因为你确保统计上所有的插槽都以相同的概率使用,因此你可以最大限度地减少碰撞。
答案 1 :(得分:0)
编辑:误读了这个问题,投票'删除'似乎没有在SO上做任何事情。
答案 2 :(得分:0)
如果您的变量是正态分布的,为什么不使用普通CDF来变换它?结果将在0和1之间均匀分布,并且自然是哈希表中的一个好键。
答案 3 :(得分:0)
执行histogram_equalization等会变得非常昂贵。您可以考虑使用其他标准方法来降低hash collisions或其效果,例如cuckoo hashing或hopscotch hashing。