• 哈希查找 数据结构


     

    假定一个集合为     S={18,75,60,43,54,90,46},集合长度为n

    假定选取的散列函数为:h(K)=K % m

       即用元素的关键字K整除以散列表的长度m(假定K和m均为正整数,并且m>=n),取余数作为存储该元素的散列地址。在此例中,n=7,所以假定取m=8,则得到的每个元素的散列地址为:

     

        h(18)=18 % 13=5        h(75)=75 %13=10

           h(60)=60 % 13=8        h(43)=43 %13=4

           h(54)=54 % 13=2        h(90)=90 %13=12

           h(46)=46 % 13=7

    若根据散列地址把元素存储到散列表H[m]中,则存储映象为:

     处理冲突的方法

    1、开放定址法  

     (1) 线性探查法

     向前面的例子中构造的H散列表中再插入关键字分别为31和58的两个元素,若发生冲突则使用线性探查法处理。

       先看插入关键字为31的元素的情况。关键字为31的散列地址为h(31)=31 % 13=5,因H[5]单元已被占用,接着探查下一个即下标为6的单元,因该单元空闲,所以关键字为31的元素被存储到下标为6的单元中,此时对应的散列表H为:

     

     

       再看插入关键字为58的元素的情况。关键字为58的散列地址为h(58)=58 % 13=6,因H[6]已被占用,接着探查下一个即下标为7的单元,因H[7]仍不为空,再接着探查下标为8的单元,这样当探查到下标为9的单元时,才查找到一个空闲单元,所以把关键字为58的元素存入该单元中,此时对应的散列表H为:

     

    (2) 平方探查法

       平方探查法的探查序列为d,d+12,d+22,…,或表示为(d+i2) % m (0≤i≤m-1)。若使用递推公式表示,则为:

            d=h(K)

            di=(di-1+2i-1)% m   (1≤i≤m-1, d0=d)

       这种方法能够较好的避免堆积现象,它的缺点是不能探查到散列表上的所有单元,但只能探查到一半单元。

       (3) 双散列函数探查法

       这种方法使用两个散列函数h1和h2,其中h1和前面的h(K)一样,以关键字为自变量,产生一个0至m-1之间的数作为散列地址,h2也以关键字为自变量,

       产生一个1至m-1之间的,并和m互素的数作为探查序列的地址增量。

       双散列函数的探查序列为:

            d=h1(K)

            di=(di-1+h2(K))% m   (1≤i≤m-1, d0=d)

     2. 链接法

        链接发又称开散列法,它是把发生冲突的同义词元素用单链表链接起来的方法。

         假定一个线性表B为:

           B=(18,75,60,43,54,90,46,31,58,73,15,34)

         为了进行散列存储,假定采用的散列函数为:

           h(K)=K % 13

        当发生冲突时,假定采用链接法处理,则得到的散列表如下图所示。


      用链接法处理冲突,虽然比开放定址法多占用一些存储空间用来存储链接指针,但它可以减少在插入和查找过程中同关键字的比较次数。

  • 相关阅读:
    分布式集群系统下的高可用session解决方案
    Google大数据三篇著名论文中文版
    12款免费与开源的NoSQL数据库介绍
    揭密Node.js 盛行的因由(转载)
    lion.ec开源框架简介(原创)
    2.2 Hadoop Studio 使用 [Hadoop学习笔记]
    spring3.2+ehcache 注解使用
    Venus 是一个简单的、高性能、高并发能力的java 开源Remoting框架
    ZooKeeper原理分析
    Netty系列之Netty高性能之道(转载InfoQ)
  • 原文地址:https://www.cnblogs.com/lightmare/p/10434841.html
Copyright © 2020-2023  润新知