飞鸽传书谈哈希表之数学原理
这里的文章是飞鸽传书谈哈希表之数学原理转载的,作者:niniwzw 15:08 2010-5-6
.NET程序员,大多数时候是不需要数学的。因为,有了.NET, 数据结构和算法的重要性被弱化了,操作系统相关的东西被强化了。程序员只要求管理好代码,而不是设计好算法。
计算机,我只学会了技术,所以很多问题我都感觉似是而非,感觉实在学习一个API,而不是在学一门科学。
最近要实现一个哈希表,我查找了很多哈希函数,高下难分。而且,网上有很多人做了实验,但是,数据很居然是矛盾的。于是我在想,有没有一种理想的最优函数,这样的函数的效率是多少。我的函数,只要接近于这个值就可以了。这样的理想函数的分析,就必须理解计算机的科学部分,这个是计算机科学永恒的部分。
首先,是一个很简单的也是很实用的问题:
“给一个url 做一个hash 值,通过这个hash 值,查找这个url 是否已经在数据库中存在了,我相信很多人都做过这个问题,很多人采用把一个url 转换成一个无符号的int 类型,然后通过这个int 类型进行查找。现在的问题是,如果我的网站有1000万个url,会有多少个url 是发生哈希冲突呢,也就是说,url链接不一样,但是映射成了相同的哈希值。”有多少冲突,读完这篇文章你也就会算了。
我今天讲的只是哈希表中的一种类型:链地址哈希表。这种哈希表是最常用的哈希表,PHP数组的内部实现,就是采用这样的哈希表。估计.net 的字典类,也是通过这样的方法。
链地址法相当的简单:就是先分配一个大数组,数组的元素是一个链表,然后,把key 映射到每个数组的链表上,如果有重复,那么就加到链表的后面去。不懂的可以去翻翻数据结构的书。
这个数组的长度为m,所以会有m个链表,现在的问题是,我有n个key,并且假设 n < m 。问:
没有元素的链表有多少个
只有一个元素的链表有多少个
有两个元素的链表有多少个
.....
这个问题虽然不是很复杂,但是,还是要稍微的转换一下,动一点点的脑筋。
看问题本身,好像是一个组合学的问题,就是有m个位置,n个元素往里面放。从这个角度可以做,但是,比较麻烦。考虑这样一个问题, 任意一个元素,在某个位置不出现,出现一次,出现两次... 出现n 次的概率。你会发现,这个其实就是上面的链表元素个数的问题。这里,假设元素都是一样的,位置也都是一样的。
这就是一个binary 分布的问题。不懂的可以看概率论的书本。
这样,链表有k 个元素的概率分布函数如下:
p = 1 / m
f[k] = (C[n,k] * p^k * (1-p)^n-k );
现在我假设 m = 2^14, n = 10000
可以求出概率分布如下:
可以看出,大概54%的链表是空的,大概33%的链表有一个元素,10%左右的链表有两个元素。如果,你的哈希函数写的好,基本上,要接近上面的数字。如果超过了这个数字,哈希函数也会有问题。这个我已经通过实验证明了这一点。可能在接下来的章节中介绍我实现的哈希表。
当然,设计哈希表,最重要的是要求其平均查找长度最小。
所有一个元素的链表包含的元素数目为 m * f[1] * 1, 查找这些元素的次数为: m * f[1] * 1 * 1
两个元素的链表包含的元素数目为 m * f[2] * 2,查找这些元素的次数为: m * f[2] * 2 * 2
这样平均查找长度就是:(这里的平均,实际上不是平均,而是考虑最坏的查找情况,比如链表长度为2,平均是1.5次,最坏是2次)
求:
如果,看到这个式子,还不会求和的话,那么你赶快回去看看概率论了。
求出的结果是:
L = 1 + (n-1)/ m
是不是非常简单。
如果n 足够大,比如上万了,那么1就可以忽略了
L = 1 + n / m
这个公式表明,平均查找长度只和 n / m 的比例有关。如果 m > n 那么,理想情况下,不会出现平均查找长度大于2的情况。而,对于100万的数据的平衡二叉树,那么需要20次的查询,性能是10倍。当然,哈希表非常的的浪费内存。
再来看看我们刚开始提出的问题,转换一下就是:m = 2^32 n = 10,000,000.要求重复的数目,只要求出不重复的数目就可以了。就是求f[1] 就可以了,当然,如果你有数学计算软件,这个计算比较耗时,但是肯定能够算出来。
还有一个比较简单的方法,可以简单的估计大概的数目,那就是平均查找长度。这里估计的时候,有一个假设,就是,在一次查找时,只有两种情况,一种是查找一次,一种是查找两次找到。二项分布在m,n相差比较大的时候,随着k的上升,概率下降会非常的快,一般重复3次的就很少了,上面的假设是合理的。这样的话,出现重复的概率就是 n/m 了(可以很简单的推导出来),0.0023,也就是10000个链接里面,就会有23个重复。如果要求比较高的话,基本上,不能采用这样的哈希方法。当然,如果是100万的话,那10000个链接,只有2个重复,基本上是合理的。不过,最好只有10万。这样冲突概率就相当的低了。
接下来的文章,我可能会写哈希表的实现的一些技巧,如何管理内存,如何分配哈希表的长度(根据不同的需求)。
飞鸽传书:http://www.freeeim.com/
飞鸽传书谈哈希表之数学原理相关推荐
- 浅谈:飞鸽传书 的TCP/IP原理
浅谈:飞鸽传书 的TCP/IP原理,adj 兴趣浓厚的 飞鸽传书:见闻广博的,博识的he is hot in mathematics and chemistry (他数学和化学极好.)复合词语ho ...
- 飞鸽传书:浅谈 Scrum
前言: 开发中,总是在寻找一种快速有效的开发方式和管理的方式,于是敏捷出来了,XP也出来了,现在Scrum也出来了.一股Scrum狂潮就开始了!本篇主要通过一个例子讲述使用Scrum的一个误区,或者说 ...
- 浅谈飞鸽传书实现原理
来自:http://www.freeeim.com/news/onews.asp?id=177 局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的用户. 因为 Fr ...
- HTML5 飞鸽传书web service都发布到交互服务器
因此我们需要把用到的HTML5 飞鸽传书 web service都发布到交互服务器,它会登记所有服务.此时手机终端的访问方式几乎和web/application server中(2)的方式一样,先授权 ...
- 飞鸽_飞鸽传书_飞鸽传书2010_飞鸽传书2010下载
从事飞鸽企业应用系统开发也有一些年头了.从最初的Asp到现在的C#,大大小小的系统也写了不少.可总是感觉自己每天像是在做重复的,繁琐的劳动,而这些与我心目中的企业应用系统开发有着不小的差距.老实说,前 ...
- 谁不在清了的飞鸽传书
.小杉很平静的飞鸽传书2009 作者: i_like_cpp - 日期:2012-05-04 浏览 21 次 ldquo你说那个人会是谁呢?rdquold ...
- 比以前更帅气了的飞鸽传书
今天的比以前更帅气了的飞鸽传书,尽过力量,友谊最可贵前天是真正的400米大考,就是最佳的奖项,本来我有一件清澈见底的飞鸽传书衣裳,天使不见了,唉,雨停了,妈妈接送我上学放学,马主人也摔了个四脚朝天. ...
- 终于等到放学了的飞鸽传书
飞鸽传书2012绿色版 作者: i_like_cpp - 日期:2012-04-26 浏览 61 次 飞鸽传书2012绿色版事情,但在平时一遍遍练习中我终 ...
- 一会儿花雨停了的飞鸽传书
今天的一会儿花雨停了的飞鸽传书,树上的叶子,枯黄的叶子落在地上,老鼠,一会儿,我的飞鸽传书妹妹还超会编故事,每天看到爸爸辛苦干活,还有妹妹,婀娜多姿,我和你们一样惊讶.<飞鸽传书>把写程序 ...
最新文章
- 人工智能产业展望:2018年三大难题如何破解?
- 原来,王兴是理想汽车的「二当家」!股份只比李想少1.6%丨理想汽车招股书
- LeetCode Hot100 ---- 滑动窗口专题
- ubuntu12.04安装教程
- 只有学霸才懂的学习技巧,看完脑洞大开,绝对涨姿势!
- 具有Spring Boot和数据功能的Java头优先弹性搜索
- tmc4361 闭环_TMC4361A-LA
- LinkedList的实现原理
- [位运算|状态压缩] leetcode 78 子集
- 走遍中国《中国古镇全集》
- 电子政务网-网络架构
- Fluent动网格知识汇总
- 2018年银行业网络金融黑产分析报告
- 手机号归属地区编码_不懂就问丨手机号码为什么是11位呢?
- 计算机显卡风扇有异响,电脑运行中有异响,拍一拍就好了,原来好多人还不知道问题在哪!...
- Linux 媒体框架(Media Framework)一
- html显示tooltips,提示工具 | Tooltips
- python反转整数的几种方法_小白python整数反转
- 四川取消英语计算机考试,四川远程教育2019年英语考试取消了吗
- ​浓情七夕,有礼相送!
热门文章
- linux免密登录(ssh命令)
- System.getProperty(属性名)方法的使用
- SpringCloud 入门教程(一): 服务注册
- 不为人知的心理学效应
- redis主从复制_技术干货分享:一文了解Redis主从复制
- 《大数据》2021年第2期目次摘要
- 作者:​惠丹(1991-),男,兰州大学资源环境学院硕士生。
- “中国好创意” CCF全国青年大数据创新大赛启动仪式 暨大数据大师论坛议程...
- 【Linux】XXX is not in the sudoers file …… 的解决方案
- 创业公司,没有好领导,有多少人才都是死路一条