【问题标题】:Numbers of collision in a hash table哈希表中的冲突数
【发布时间】:2015-03-21 15:30:40
【问题描述】:

我正在为这个范围内的存储元素做一个哈希表:2000000-20000000 个值。

例子: 17664658-8,7587458-8,7338375-4,5741259-2.....

在 100000 个元素的样本中,冲突的数量约为 23939,而在 1000000 个元素的样本中,冲突的数量约为 439870。我对哈希表了解不多,但这个冲突的数量并不多高的?

我读到在一个受控的数字范围内你可以有一个相当统一的好哈希函数,但不知道如何或从哪里开始,有什么建议吗?

这是我的哈希函数。

int hash(char* clave,int m) { //m is the size of the table (about the double of the elements to be stored)
        int number=0,i=0;
        /// 
        while(isdigit(clave[i])){ //i don't use the last 2 characters. 
            number+=(clave[i++]-'0');
            if(isdigit(clave[i]))
                number*=10;
        }
        /// mutiplication method
        float dis,R;
        R=0.6106154;
        dis = R*(number) - floor(R*(number));
        int result = (int)(dis*m);
        return result;
    }

【问题讨论】:

  • 你的哈希表有多大?你有没有机会使用二的幂?
  • @TheParamagneticCroissant 对于 100000 个元素,表格的大小为 178144。
  • 顺便说一句,只是为了好玩,请尝试使用 178141 或 178151 的表大小(最接近的素数,以防您想知道)。

标签: c hash


【解决方案1】:

不,冲突的数量并不算多,实际上它与您的预期差不多。 expected number of collisions in a hash table 具有统一的随机散列函数和 m 个桶和 n 个插入的公式是:

n - m * (1 - ((m-1)/m)^n)

对于您的情况:

m = 178144
n = 100000

插入数字给出:

100000 - 178144 * (1 - ((178144-1)/178144) ^ 100000)
= 23476.674

观察到的冲突次数是 23939。所以你的哈希函数没有问题。

【讨论】:

  • 我尝试了更大的 m,碰撞次数从 23k 增加到了 6k。那我怎么办?更大的 m,不同的哈希函数?还是重要的是冲突解决?
  • 增加 m 将导致更少的冲突,因为如果有更多的插槽可用于插入项目,那么两个项目最终分配到同一个插槽的可能性较小。没有理由更改散列函数,因为它的性能已经接近最佳。所以只需增加 m
猜你喜欢
  • 2017-09-28
  • 2019-12-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多