zoukankan      html  css  js  c++  java
  • hash表

    查找的过程为给定值依次和关键字集合中各个关键字进行比较;

    查找的效率取决于和给定值进行比较的关键字个数;

    哈希函数:
      f(key) = L[(ord(第一字母)-ord(‘A’)+1)/2]

    该例子可见:
      1、哈希(Hash)函数是一个映像,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即;
      2、由于哈希函数是一个压缩映像,因此,在一般情况下,很容易产生“冲突”现象,即:key1 != key2,而f(key1)=f(key2).并且,改进哈希函数只能减少冲突,而不能避免冲突;

      3、很难找到一个不冲突的哈希函数,一般情况下,只能选择恰当的哈希函数,使冲突尽可能少地产生;因此,在构造这种特殊的“查找表”时,除了需要选择一个“好”(尽可能

      少产生冲突)的哈希函数之外;还需要找到一个“处理冲突”的方法;

      哈希表定义:

        根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映像到一个有限的、地址连续的地址集(区间)上,并以关键字在地址集中的“映像”作为相应

      的表中的存储位置,如此构造所得的查找表称之为“哈希表”对数字的关键字可有下列构造方法:

        1、直接定址法 2、数字分析法 3、平方取中法
        4、折叠法 5、除留余数法 6、随机数法
      若是非数字关键字,则需先对其进行数字化处理:
        1、直接定址法
          取关键字或关键字的某个线性函数值为哈希地址;即:
            H(key)=key 或者H(key)=a*key + b
        2、除余法(用的很多)
          以关键码除以表元素总数后得到的余数为存储地址;
        例如:
          对21、30、11三个数,利用k MOD3的方式,求他们的哈希地址有:
            21 MOD 3 = 0;
            30 MOD 3 = 0;
            11 MOD 3 = 2;
        3、基数转换法
           将关键码看作是某个基数制上的整数,然后将其转换为另一个基数制上的数;
        例如:
          对21、30、11进行基数转换法求哈希地址:
          把这三个数看成8进制;转成10进制:17、24、9;
         4、平方取中法:
          先通过求关键字的平方值扩大相近数的差别,然后根据表长度取中间的几位数作为散列函数值,又因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生
        的散列地址较为均匀;
        例如:
          对21、30、11进行平方取中法求哈希地址(取中间的一位)
            21×21 = 441 取4
            30×30 = 900 取0
            11×11 = 121 取2
      5、折叠法
        将关键码分成多段,左边的段向右边折,右边的段向左边折;然后将它们叠加;
      6、移位法
        将关键码分为多段,左边的段右移,右边的段左移;然后将它们叠加;

      7、随机数法:
        选择一个随机函数,取关键码的随机函数值;

        处理冲突的方法:
          1、开放定址法:
          a、线性探查法:
    当冲突发生时,使用某种探查技术在散列中形成一个探序列,沿着该序列查找,直到找到关键字或一个开放的地址(地址单元为空)线性探查法:冲突后直接向下线性找一个新的

    空间存放;

      例如:记录关键码为(3、8、12、17、9),取m=10(存储空间为10), p=5,散列函数h=key%p;

      解决冲突的办法:

        开放地址法:

          1、线性探测法;

          2、双哈希函数探测法;
        当冲突发生时,使用某种探查技术在散列中形成一个探序列,沿着该序列查找,直到找到关键字或一个开发的地址(地址单元为空)

      线性探查法:

        冲突后直接向下线性找一个新的空间存放;例如:记录关键码为(3、8、12、17、9),取m=10(存储空间为10);
        p=5,散列函数h=key%p;

      双散列函数法:
        例如:关键码(4、11、16、54),m=11, p=7, h=key%p,二次散列函数为:hi=(h(key)+key%(p-1))%p;

        3、链接法
          将散列表的每个节点增加一个指针字段,用于链接同义词的子表,链表中的结点都是同义词;

        例如:记录为(4,11,16, 54),取m=p=5,散列函数h=key%p;加一个指针域;

  • 相关阅读:
    GIT使用方法
    结对-结对编项目贪吃蛇-设计文档
    结对-结对编项目贪吃蛇-开发环境搭建过程
    《团队-爬取豆瓣电影TOP250-需求分析》
    《团队-爬取豆瓣电影TOP250-成员简介及分工》
    结对-结对编项目贪吃蛇-需求分析
    20170906-构建之法:阅读问题
    20170906-构建之法:现代软件工程-阅读笔记
    团队名称:极限定理
    软件工程初识
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4379235.html
Copyright © 2011-2022 走看看