zoukankan      html  css  js  c++  java
  • Hash Table

    ---

    key - value 键值映射

    image-20210630192134282

    当多个关键字映射到同一个值时,则称发生了冲突,下面介绍一种解决冲突的方法:

    Chaining with hash

    “拉链法”

    将映射值相同的关键字称为同义词,拉链法将同义词链接在一起

    • 查找成功:

    image-20210630192605557

    • 查找失败:

      image-20210630192912467

    ASL

    • 查找成功:

    image-20210630193037211

    • 查找失败:

      image-20210630193426826

      实际上,上式中分子部分就是表中存储的记录数(n),分母部分等于散列表的表长(槽的个数m),因此,上式的结果0.92也就是此时该表的装填因子 α = n/m

    如何优化?

    ”设计冲突更少的散列函数“

    image-20210630193223087

    常见的散列函数

    • 除留余数法

    image-20210630194339773

    Q:下面这个例子中显然模 8后的冲突比模 7更小,为什么还一定要用素数

    image-20210630194614325

    A:如果实际问题中关键字不像上例一样连续出现,例如考虑下面的情况,不难发现用素数取模虽然会牺牲部分槽位,但显然可以使分布更加均匀

    image-20210630195049454

    • 直接定址法

      对于关键字连续分布的情况,可以使用直接定址法

      image-20210630195728508

    • 数字分析法

      image-20210630200022822

    • 平方取中法

      image-20210630200120449

    image-20210630200651465

    Open addressing

    “开放定址法 ”

    “拉链法”不同,所谓“开放”,是指对于多个同义词而言,如果发现目标槽位已经被占据,可以把待定位的同义词放到其它槽中

    增量序列有以下几种取法:

    Probing Strategies

    “探查策略 ”

    线性探测法

    “Linear Probing”

    Insert

    image-20210630204225696

    注意上例中哈希值是对H(key)是对13取模,而冲突时的递推公式是以表长16取模:

    image-20210630204531637

    tips:

    上图递推式中的 di为增量序列,对照6.006中对 Open Addressing的解释,这里计算出的 H0,H1,H2 ... Hi也就是所谓的探查序列(probe sequence),即对m个槽位的一次排列,每次寻找新的空槽位时都按这条探查序列搜索,注意区分概念

    link:https://www.cnblogs.com/potofsalt/p/14941814.html

    显然,线性探测法就是指 di从0开始连续 ++取值:

    image-20210630205644149Delete

    同样地,在6.006中已经介绍过,由于搜索时是按照同一个探查序列搜索,因此删除并不能直接将相应槽置为空,否则可能会使搜索失败,解决方法是为要删除的槽设置一个DELETE标志表示这个槽的内容已被删除

    image-20210630210433364

    可能造成一种情况就是有可能槽中放了很多元素,但大部分都被DELETE标记,实际上元素很少

    查找效率分析:

    查找成功:

    image-20210630210932233

    查找失败:

    image-20210630211605111

    上例中初始哈希以13为模,因为d0=0,不难明白H0 = H(key)

    也就是说探测序列中第一个元素就是初始哈希值,根据关键字与探测序列一一对应的关系显然总共有13条探测序列,按照均匀哈希假设,每个探测序列的取到概率为1/13,对应上图以此表示从0号槽开始,从1号槽开始, ... ,从12号槽开始,可以算出失败下的ASL如上。

    Cons

    线性探测法容易造成同义词、非同义词的Clustering(聚集、堆积)现象,

    如下图,如果关键字k的初始探测位落入箭头所指任意槽,最终都会使聚集部分变长:

    image-20210630212649336

    因此提出了一种另一种对增量序列di的取法

    平方探测法

    image-20210630214048074

    注意平方探测法对表长m有一定限制:

    image-20210630214647434

    伪随机序列法

    正如其名,di是一个伪随机序列

    再散列法

    ”Double Hashing“

    image-20210630215008766

    小结

    image-20210630214849523

    image-20210701141405795

  • 相关阅读:
    ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题
    在 ASP.NET Web API 中,使用 命名空间(namespace) 来作为路由的参数
    【转】使用create_project.py创建cocos2d项目时出错
    WCF使用net.tcp绑定时的注意事项
    WCF:如何将net.tcp协议寄宿到IIS
    关于WCF服务的调试跟踪
    Windows Store Apps 开发转载
    如何让弹出窗口和页面产生联动?
    关于C# wpf DataGrid单元格双击设置单元格内容
    在WPF的DataGrid中对行添加单击事件
  • 原文地址:https://www.cnblogs.com/potofsalt/p/14958574.html
Copyright © 2011-2022 走看看