如果我使用以下方法计算碰撞概率:
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内存分配来决定最佳大小?
答案 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%负载系数下表现不佳。