首页 > 其他分享 >查找二之哈希表查找

查找二之哈希表查找

时间:2023-06-11 20:33:56浏览次数:33  
标签:哈希 关键字 地址 查找 冲突 key

1、功能:哈希表可以直接通过关键字直接找到数据的位置,不需要进行任何的比较,也就是说,哈希表建立了关键字和存储地址之间一种直接的映射关系,其查找的效率相对较高。

2、定义

  1、哈希地址:哈希地址只是在查找表中的存储位置,并不是实际的物理存储物质

  2、哈希函数:f()是一个函数,通过这个函数可以快速求出关键字对应的数据的哈希地址,称为hash函数

  3、冲突:由于用算法求关键字对应哈希地址,会出现两个人算出来是同一块hash地址的情况,哈希只能减少冲突的出现,无法完全避免冲突。

3、哈希表构造

  哈希函数的构造方法(常用):直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法

  1、直接定址法

  哈希函数为一次函数,H(key) = key 或 H(key) = a * key + b。 H(key)表示关键字 key对应的hash地址, a,b都是常数。

  2、数字分析法

  如果关键字由多位字符或者数字组成,就可以考虑抽取其中两位或者多位作为该关键字对应的哈希地址,在取法上尽量选择变化较多的位,避免冲突发生。适用于已知的关键字集合。

  3、平方取中法

  将关键字做平方操作,取中间的几位作为哈希地址。(比较常用)

  4、折叠法

  将关键字分割成位数相同的几部分,最后一部分的位数可以不同,然后取这几部分叠加和(舍去进位)作为哈希地址,此方法适合关键字位数较多的情况。

  移位折叠:将分割后的每一小部分,按照最低位对齐,然后相加

  间界折叠:从一端向另一端沿分割线来回折叠

   5、除留余数法

  若已知整个哈希表的最大长度m,可以取一个不大于m的数p,然后对该关键字key做取余运算,H(key) = key%p(p<=m),适用于哈希表大小已知。

  p的取值很重要,p可以为不大于m的质数或者不包含小于20的质因数的合数。

  6、随机数法

  取关键字的一个随机函数值作为它的哈希地址,H(key) = random(key),此方法用于关键字长度不等的情况(注意:这里的随机函数其实是伪随机函数,随机函数是即是每次给定的key相同,但是H(key)都是不同,而伪随机数正好相反,每个key都对应的是固定的H(key))。

4、选择方法构造哈希表

  1、关键字的长度,长度不等,用随机数法;关键字较多,用折叠法或者数字分析法;关键字位数较短,可以考虑平方取中

  2、哈希表的大小,大小已知,可以使用储留余数法;

  3、关键字分布情况

  4、查找表的查找频率

  5、计算哈希函数所需时间(包括硬件指令元素)

5、处理冲突的方法

  1、开放寻址法

    在出现哈希冲突时在哈希表中找一个新的空闲位置存放元素。

    1、线性探测法:当冲突发生时,顺序查看表中的下一个单元,知道找出一个空闲单元

      优点:解决冲突简单

      缺点:容易产生堆积问题

    2、平方探测法:比如发生冲突的地址时d,平方探测法得到新的地址序列为 d+1平方,d-1平方,d+2平方……

      缺点:避免出现堆积问题

      缺点:不能探测到散列表上的所有单元,但至少能探测到一半单元  

  2、链地址法:将所有产生冲突的关键字对应的数据全部存储在同一个线性链表中,拉链法适用于经常插入和删除的情况

    优点:提高查找速率

    缺点:需要额外空间

  3、再哈希法

  当通过哈希函数求得的哈希地址同其他关键字产生冲突时,使用另一个哈希函数计算,知道冲突不再发生。

6、哈希表查找的性能

  在构造哈希表过程中,由于冲突的产生,使得哈希表的查找算法 仍然会涉及到比较的过程,因此对哈希表的查找效率仍然以平均查找长度来衡量

  比较次数取决于以下方面

    1、哈希函数:哈希函数的好坏取决于影响出现冲突的频繁程度。但是一般情况下,韩熙韩束相比于后两种的影响,可以忽略不计

    2、处理冲突的方式:对于同一组关键字,设定相同的哈希函数,使用不同处理冲突的方式得到的哈希表是不同的,表的平均查找长度也不同

    3、哈希表的装填因子:在一般情况下:处理冲突的方式相同,平均查找长度取决于哈希表的装满程度,越满,冲突越多

      装填因子 = 哈希表中的数据个数/哈希表长度

      经过计算,假设表中所有数据查找概率相等的情况下,对于表长为m,合适为n的哈希表:

        查找成功的平均长度:-1/装填因子 * ln(1-装填因子)

        查找不成功的平均查找长度:1/(1-装填因子)

      哈希表的查找效率只能装填因子有关,和哈希表中的数据的个数无关,所以选用哈希表做查找操作时,选择一个合适的装填因子非常重要

  代码明天补

7、对比

 

  

 

标签:哈希,关键字,地址,查找,冲突,key
From: https://www.cnblogs.com/gunancheng/p/17472631.html

相关文章

  • 【数据结构】查找
    基本概念查找表 由同一类型的数据元素(记录)构成的集合。所谓集合指记录间不存在前驱后继关系,因此查找表是一种应用灵便的结构。静态查找表 只对查找表做查找操作,即只查询某个记录是否在表中,或只检索某个记录的各种属性。或者说:查找表加上不会使该表的内容发生变化的查找操作,称作......
  • NOI / 1.9编程基础之顺序查找
    06:笨小猴描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-mi......
  • 推荐两个查找rpm包的网站
    http://rpmfind.net/http://rpm.pbone.net/addbyjoeyon1985......
  • LeetCode----二分查找
    1算法原理适用条件:有序数组2算法模板classSolution:defsearch(self,nums:List[int],target:int)->int:left=0right=len(nums)-1#规则[left,right]whileleft<=right:#根据规则,举例[1,1]添加=是否合法即可......
  • 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
    一致性哈希算法摘自:http://blog.codinglabs.org/articles/consistent-hashing.html算法简述一致性哈希算法(ConsistentHashing)最早在论文《ConsistentHashingandRandomTrees:DistributedCachingProtocolsforRelievingHotSpotsontheWorldWideWeb》中被提出。简单来......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后......
  • Python+pandas查找前5位成绩最高的同学与前5个最高成绩的同学
    问题描述:查找前5位成绩最高的同学与前5个最高成绩的同学。参考代码(建议使用pandas0.24.0以上版本):运行结果:公众号“Python小屋”......
  • 查找
    #include<stdio.h>#include<stdlib.h>#defineMAX100intbinarySearch(intlist[],intn,intkey,int*count){ intlow=0,high=n-1,num=0; intt=(low+high)/2; while(low<=high){ if(list[t]==key){ num++;......
  • 查找一之顺序查找、二分查找、分块查找
    1、概念:在一些有序的或无序的数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找,也就是给定一个值,在查找表中确定一个关键字等于给定值的记录或数据元素。2、平均查找长度(后期可能会增加)3、查找长度分为成功和失败两种4、顺序查找1、主要思想:将查找值......
  • Python查找任意字符串中只出现一次的字符(2016奇虎笔试题)
    '''  程序功能:  编写函数,给定任意字符串,找出其中只出现一次的字符,  如果有多个这样的字符,就全部找出。'''importsysdefsearchOne(s):#创建空字典d=dict()#遍历字符串,并分别记录每个字符的出现次数forchins:#这里重点演示字典的ge......