首页 > 其他分享 >查找 - 散列表

查找 - 散列表

时间:2023-11-30 14:22:40浏览次数:37  
标签:探测 关键字 地址 查找 冲突 列表 散列

散列表(哈希)

相关定义

  1. 散列表:有限连续的地址空间。
  2. 冲突:不同关键字对应同一个散列地址。
    冲突是不可避免的。
  3. 同义词:发生冲突的不同关键字。

构造散列函数

原则

  1. 减少冲突。
  2. 散列地址分布均匀。

常用方法

  1. 直接定址
    1)条件:已知关键字每一位的数字分布情况。
    2)操作:从关键字中提取数字分布比较随机的若干位作为散列地址。
  2. 平方取中
    取关键字平方后的中间几位,具体位数由表长决定。
  3. 折叠
    将关键字分割成位数相同的多个部分,叠加求和,舍去进位,取与前面相同的位数。
    适用于散列地址位数少,关键字位数多。
    1)移位叠加:最低位对齐
    2)边界叠加:按照折叠绳子的方式叠加
  4. 除留余数
    选择一个比表长小的最大素数取模。

处理冲突

  1. 开放地址
    H0发生冲突时,基于H0用某方式计算得到下一个H,直到不发生冲突为止。
    1)线性探测法
    假想成一个循环表,先从冲突地址下一个位置进行寻找,如果到表尾也没找到位置,就从表头开始再找,如果还是找不到,做溢出处理。

2)二次探测法
每次从冲突位置的前后k²位置查找。
3)伪随机探测法
增量序列等于一个伪随机数序列。
2. 链地址
同义词链表:散列地址相同的关键词放进一个单链表。
一个数组存放头指针。

分析

  1. 线性探测法
  • 优点:只要表没满,总能找到合适的位置。
  • 缺点:二次聚集(第一个散列地址不同的关键字在寻找后续散列地址的过程中再次冲突)。
  1. 二次探测法/伪随机探测法
  • 优点:没有二次聚集。
  • 缺点:不一定找得到位置。
  1. 链地址
    没有二次聚集。

散列表查找

算法分析

  1. 装填因子α
    α = 表中填入记录数 / 散列表长度
    表示散列表的装满程度。α越大,冲突可能性越大,需要比较的关键字个数越多。
  2. 影响平均查找长度的因素:处理冲突的方法和装填因子。
    平均查找长度与α有关,与n无关。

线性探测法 成功(1/2)(1+1/(1-α)) 失败(1/2)(1+(1-α)²)
二次探测法/伪随机探测法 成功(-ln(1-α)/α) 失败(1/(1-α))
链地址法 成功(1+α/2) 失败(α+exp(-α))

标签:探测,关键字,地址,查找,冲突,列表,散列
From: https://www.cnblogs.com/ww0809/p/17866474.html

相关文章

  • 查找算法
    查找1.二分查找二分查找的思路分析有序序列1.首先确定该数组的中间的下标mid=(left+right)/22.然后让需要查找的数findval和arr[mid]比较2.1findval>arr[mid],说明你要查找的数在mid的右边,因此需要递归的向右查找2.2findval<arr[mid],说明你要查找的数在mid的左边,......
  • Linux文件查找,压缩和解压
    关于搜索查找有关的指令find指令从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。基本语法:find[搜索范围][选项]选项说明:选项功能-name按照指定的文件名查找模式查找文件-user查找属于指定用户名所有文件-size按照指定的文件大小......
  • (查找)03-寻找峰值
    1importjava.util.*;23publicclassSolution{4/**5*@paramnumsint整型一维数组6*@returnint整型7*/8publicintfindPeakElement(int[]nums){9//申请左指针10intleft=0;11//申......
  • day1数组理论基础,704. 二分查找,27. 移除元素
    数组理论基础,704.二分查找,27.移除元素1数组理论基础1.1数组概念定义:存放在连续内存空间上的相同类型数据的集合。特点:1.数组中数据类型相同2.数组所占空间连续1.2数组创建2704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数......
  • 麻烦问一下Python采集到的文本列表中有大量的 ', ' 符号 想这种符号怎么删除
    大家好,我是皮皮。一、前言前几天在Python铂金流群【泅渡】问了一个Python字符处理的问题,一起来看看吧。问题描述:麻烦问一下Python采集到的文本列表中有大量的  ','  符号 想这种符号怎么删除?二、实现过程这里【不上班能干啥!】和【瑜亮老师】分别给了一个指导,如下......
  • # yyds干货盘点 # 麻烦问一下Python采集到的文本列表中有大量的 ', ' 符号 想这种符号
    大家好,我是皮皮。一、前言前几天在Python铂金流群【泅渡】问了一个Python字符处理的问题,一起来看看吧。问题描述:麻烦问一下Python采集到的文本列表中有大量的  ','  符号 想这种符号怎么删除?二、实现过程这里【不上班能干啥!】和【瑜亮老师】分别给了一个指导,如下图所示:......
  • linux文件查找和打包压缩
    1文件查找1.1mlocatelocate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库,遍历整个根文件系统,很消耗资源工作特点:查找速度快;默认模糊查找,支持正则表达式;非实时查找;搜索的是文......
  • Linux文件查找、打包压缩及解压
    打包压缩1. 使用tar命令进行文件打包。基本语法如下:tar-cvf压缩文件名文件1文件2...2. 如果您想同时压缩多个文件,可以使用tar-cf命令:tar-cf压缩文件名.tar文件1文件2...3. 使用gzip或bzip2进行压缩。例如,使用gzip压缩:gzip压缩文件名.tar4. 压缩时添加......
  • 给定两个列表,找出他们相同的元素和不同的元素
    list1=[11,22,33,11]list2=[11,22,89,45]A=set(list1)#先去重B=set(list2)print(A&B)#相同的元素print(A^B)#不同的元素 ......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    LeetCode704二分查找题目链接:LeetCode704左闭右闭:视频讲解:手把手带你撕出正确的二分法思路:在循环条件中注明left<=right,即[left,right]classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1......