我如何预先确定理想的大小我应该为N个项目制作哈希表?

时间:2014-03-20 15:10:25

标签: python hashtable probability

如果我使用以下方法计算碰撞概率:

def collision(hash_t, items):
    prob = 1.0
    for i in range(1, items):
        prob *= (hash_t - i) / float(hash_t)
    return 1 - prob

有没有一种简单的方法来创建一个模型,根据冲突的概率计算哈希表中查找和插入的成本,那么我可以根据速度v内存分配来决定最佳大小?

1 个答案:

答案 0 :(得分:1)

虽然这取决于您的散列函数+数据类型(以确定散列是如何发生的),但散列条目的大小(使用python的大小可能因32位系统与64位系统而异),您的碰撞处理策略,以及您的时间/内存要求,以下是一个很好的经验法则:

使用2/3的负载系数。

也就是说,哈希表的大小是元素数量的3/2。因此,如果您有1,000个元素,则您有1,500个条目。如果每个哈希元素是32位(假设基于32位python安装,如果这是错误的某人纠正我)那么你浪费差不多2 kB,这真的是一个很小的内存。如果您有2,000,000个条目,那么您将浪费近4 MB,这也很小。

简而言之,哈希表中的共同考虑很少是空间,而是时间。用于dicts的Python自己的实现在扩展哈希表大小之前使用最大2/3加载因子。这是基于性能下降,许多碰撞策略在70%或80%负载系数下表现不佳。