这里的文章是飞鸽传书谈哈希表之数学原理转载的,作者: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/

飞鸽传书谈哈希表之数学原理相关推荐

  1. 浅谈:飞鸽传书 的TCP/IP原理

    浅谈:飞鸽传书 的TCP/IP原理,adj  兴趣浓厚的 飞鸽传书:见闻广博的,博识的he is hot in mathematics and chemistry  (他数学和化学极好.)复合词语ho ...

  2. 飞鸽传书:浅谈 Scrum

    前言: 开发中,总是在寻找一种快速有效的开发方式和管理的方式,于是敏捷出来了,XP也出来了,现在Scrum也出来了.一股Scrum狂潮就开始了!本篇主要通过一个例子讲述使用Scrum的一个误区,或者说 ...

  3. 浅谈飞鸽传书实现原理

    来自:http://www.freeeim.com/news/onews.asp?id=177 局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的用户. 因为 Fr ...

  4. HTML5 飞鸽传书web service都发布到交互服务器

    因此我们需要把用到的HTML5 飞鸽传书 web service都发布到交互服务器,它会登记所有服务.此时手机终端的访问方式几乎和web/application server中(2)的方式一样,先授权 ...

  5. 飞鸽_飞鸽传书_飞鸽传书2010_飞鸽传书2010下载

    从事飞鸽企业应用系统开发也有一些年头了.从最初的Asp到现在的C#,大大小小的系统也写了不少.可总是感觉自己每天像是在做重复的,繁琐的劳动,而这些与我心目中的企业应用系统开发有着不小的差距.老实说,前 ...

  6. 谁不在清了的飞鸽传书

    .小杉很平静的飞鸽传书2009 作者:       i_like_cpp        -       日期:2012-05-04     浏览 21 次 ldquo你说那个人会是谁呢?rdquold ...

  7. 比以前更帅气了的飞鸽传书

    今天的比以前更帅气了的飞鸽传书,尽过力量,友谊最可贵前天是真正的400米大考,就是最佳的奖项,本来我有一件清澈见底的飞鸽传书衣裳,天使不见了,唉,雨停了,妈妈接送我上学放学,马主人也摔了个四脚朝天. ...

  8. 终于等到放学了的飞鸽传书

    飞鸽传书2012绿色版 作者:       i_like_cpp        -       日期:2012-04-26     浏览 61 次 飞鸽传书2012绿色版事情,但在平时一遍遍练习中我终 ...

  9. 一会儿花雨停了的飞鸽传书

    今天的一会儿花雨停了的飞鸽传书,树上的叶子,枯黄的叶子落在地上,老鼠,一会儿,我的飞鸽传书妹妹还超会编故事,每天看到爸爸辛苦干活,还有妹妹,婀娜多姿,我和你们一样惊讶.<飞鸽传书>把写程序 ...

最新文章

  1. 人工智能产业展望:2018年三大难题如何破解?
  2. 原来,王兴是理想汽车的「二当家」!股份只比李想少1.6%丨理想汽车招股书
  3. LeetCode Hot100 ---- 滑动窗口专题
  4. ubuntu12.04安装教程
  5. 只有学霸才懂的学习技巧,看完脑洞大开,绝对涨姿势!
  6. 具有Spring Boot和数据功能的Java头优先弹性搜索
  7. tmc4361 闭环_TMC4361A-LA
  8. LinkedList的实现原理
  9. [位运算|状态压缩] leetcode 78 子集
  10. 走遍中国《中国古镇全集》
  11. 电子政务网-网络架构
  12. Fluent动网格知识汇总
  13. 2018年银行业网络金融黑产分析报告
  14. 手机号归属地区编码_不懂就问丨手机号码为什么是11位呢?
  15. 计算机显卡风扇有异响,电脑运行中有异响,拍一拍就好了,原来好多人还不知道问题在哪!...
  16. Linux 媒体框架(Media Framework)一
  17. html显示tooltips,提示工具 | Tooltips
  18. python反转整数的几种方法_小白python整数反转
  19. 四川取消英语计算机考试,四川远程教育2019年英语考试取消了吗
  20. ​浓情七夕,有礼相送!

热门文章

  1. linux免密登录(ssh命令)
  2. System.getProperty(属性名)方法的使用
  3. SpringCloud 入门教程(一): 服务注册
  4. 不为人知的心理学效应
  5. redis主从复制_技术干货分享:一文了解Redis主从复制
  6. 《大数据》2021年第2期目次摘要
  7. 作者:​惠丹(1991-),男,兰州大学资源环境学院硕士生。
  8. “中国好创意” CCF全国青年大数据创新大赛启动仪式 暨大数据大师论坛议程...
  9. 【Linux】XXX is not in the sudoers file …… 的解决方案
  10. 创业公司,没有好领导,有多少人才都是死路一条