高斯分布+哈希表

时间:2010-12-01 12:46:37

标签: algorithm data-structures hashtable hash variable-assignment

我对哈希函数有一个奇怪的想法。问题陈述是

  

您存储的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),哈希表将具有最少的冲突数和最少的占用空间。

现在,这只是猜测。这样的事情是否有意义?有没有办法证明这一点?或者我在某处错了?

4 个答案:

答案 0 :(得分:4)

您在此处手动执行的操作在图像处理histogram equalization中调用。我认为这是绝对有意义的,因为你确保统计上所有的插槽都以相同的概率使用,因此你可以最大限度地减少碰撞。

答案 1 :(得分:0)

编辑:误读了这个问题,投票'删除'似乎没有在SO上做任何事情。

答案 2 :(得分:0)

如果您的变量是正态分布的,为什么不使用普通CDF来变换它?结果将在0和1之间均匀分布,并且自然是哈希表中的一个好键。

答案 3 :(得分:0)

执行histogram_equalization等会变得非常昂贵。您可以考虑使用其他标准方法来降低hash collisions或其效果,例如cuckoo hashinghopscotch hashing