博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#的dictionary为什么在扩容时会以素数扩容
阅读量:5047 次
发布时间:2019-06-12

本文共 621 字,大约阅读时间需要 2 分钟。

  今天在看dictionary时,看到他在扩容时会以大于其两倍的最近素数大小来扩容,就思考了一下。

  因为dictionary是基于hash表的,hash后转正数后会去取模,所以我的思路就转到了是否用素数取模更优越,记录一下我的推断过程:

  最终的桶的index = key%m = key - xm = key - f(key/m)m。 这里的 f 函数用于向下取整。可以看到,最终结果是等价于key - f(key/m)m的。那么我们就以进来的key = 2n(即2的倍数),桶为4来举例。那么结果为 2n - f(2n/4)*4,简化后是2(n - f(n/2)*2)。可以看到这其实就是n - f(n/2)*2的两倍,而n - f(n/2)*2则是key = n装进长度为2的桶的公式,因此可以知道在这种情况下,它退化为了长度为2的桶。而又因为key = n装进长度为2的桶可能为0或1,它的两倍也就是0或2,即这种情况下(key为2n,桶长为4),它只会将值hash到0,2这两个桶里,并不均匀。其他合数亦是如此,只要有公约数,就会退化,无法均匀分布。

  最终结论是,如果进来的数是真随机的,那么不管用什么取模都无所谓。但是考虑到大多时候,进来hash的数列并不是这样,因此使用素数作为桶大小能够让其均匀分布到各个桶。

转载于:https://www.cnblogs.com/charsoul/p/11311969.html

你可能感兴趣的文章
CentOS笔记-用户和用户组管理
查看>>
Mongodb 基本命令
查看>>
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>