Loading

散列表

直接寻址表

   关键字的全域U比较小的时候,直接寻址是一种简单并且有效的技术。如果某应用要用到一个动态集合,其中每个元素都来自全域U{0,................n-1,n}中的关键字,n不是一个很大的数,同时要假设关键字没有重复数。则可以定义一个数组记为直接寻址表记做T[₁....n]其中的每个位置记为槽(solt)对应U中的关键字,即T[K]=K,若没有对应则T[K]=NIL。

散列表

  直接寻址对于U大的时候就不适用了,空间浪费太厉害。此时就可采用散列表。直接寻址下关键字k放在槽k中,而在散列表里k放在槽h(k)中,h就是散列函数。他把全域U映射到散列表T[1..n]中。 h:U->{0...n}。理想情况函数保证任何关键字都映射到不同槽里,实际是不可能的。因数组有限大小,而关键字可无限多。因此要找的散列函数尽可能的使关键字均匀的分布在单元中。如图 git在0号单元,hub在2号单元里。散列基本思想清楚后,就是找一个合适的散列函数,确定两个关键字散列到同一个单元中时,要怎么处理,以及定散列表的大小。

                                                                                                                                                                                  

散列函数

  散列函数是给定一个输入值,函数返回一个数字。可以视为输入映射到数字。

  必要条件:

    必须一致,输入一样,输出必须一样。比如输入 A返回3,则不管什么情况下输入A都是返回3.

    不同的输入要返回不同的数字。

一般采用的散列函数

  一般来讲如果关键字是整数,可以简单的采用“KEY MOD SIZE”方式取得结果。一般size要使用素数。因为整数容易大量MODE 为0的情况出现。

  几种散列函数的方式  

          1.字符串的一种典型处理是转换ASCⅡ码之后相加

   2.由key 和27的方次做加法。 key[0]+key[1]*27+key[2]*27²

     3.程序根据Horner法则计算一个32的多项式。∑0size key(size-i-1)*32i    简单就是 (value << 5) - value + c;

散列冲突

  一个元素在插入的槽处已经被另外的一个元素占用,就会发生散列冲突。解决冲突的两种简单方法是

        1.分离链接法:

             散列到同一槽中的所有元素放入一个链表中。

 

        2.开放定址法

  散列表性能指标:

   1.装填因子 进入散列表的元素对整个散列表的占比,占比大于1就会出现散列冲突。

   2.散列函数 良好的散列函数让散列分布均匀。

 一致性散列

 http://www.codeproject.com/Articles/56138/Consistent-hashing

 http://blog.csdn.net/cywosp/article/details/23397179/

posted @ 2016-07-09 00:12  奔跑石头  阅读(178)  评论(0)    收藏  举报