首页 > 其他分享 >哈希(散列)查找

哈希(散列)查找

时间:2024-04-10 15:33:08浏览次数:26  
标签:哈希 同义词 关键字 查找 key 散列 函数

1.哈希表(HashTable)

(1)哈希表定义
又称散列表,是一种数据结构,数据元素的关键字与其存储地址直接相关
(2)同义词
若不同的关键字通过散列函数映射到同一个值,则称为“同义词”
(3)冲突
通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”
(4)填装因子
装填因子=表中记录数/散列表长度

2.常见哈希函数

哈希函数描述公式适用场景
除留余数法散列表表长为m,取一个不大于m但最接近或等于m的质数p H ( k e y ) = k e y % p H(key)=key\%p H(key)=key%p关键字范围相差较大的情况
直接定址法通过取关键字或关键字的某个线性函数值为哈希值,从而确定数据在哈希表中的存储位置 H ( k e y ) = k e y H(key)=key H(key)=key或 H ( k e y ) = a ∗ k e y + b H(key)=a*key+b H(key)=a∗key+b关键字的分布基本连续的情况
数字分析法选取数码分布较为均匀的若干位作为散列地址关键字集合已知,若更换了关键字,则需要重新构建新的哈希函数
平方取中法取关键字的平方值的中间几位作为散列地址关键字的每位取值都不够均匀或均小于散列地址所需的位数

3.常见处理冲突的方法

(1)开放定址法
指可存放新表项的空闲地址既向它的同义词表项开放,又向他的非同义词表项开放。其数学递推公式:
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi​=(H(key)+di​)%m; i = 0,1,2,…,k(k<=m-1);m表示散列表表长; d i d_i di​为增量序列;i可理解为“第i次发生冲突”

开放定址法种类增量序列
线性探测法 d i = 0 , 1 , 2 , 3 , . . . , m − 1 d_i=0,1,2,3,...,m-1 di​=0,1,2,3,...,m−1
平方探测法 d i = 0 2 , 1 2 , ( − 1 ) 2 , 2 2 , ( − 2 ) 2 , . . . , k 2 , ( − k ) 2 d_i=0^2,1^2,(-1)^2,2^2,(-2)^2,...,k^2,(-k)^2 di​=02,12,(−1)2,22,(−2)2,...,k2,(−k)2; k < = m / 2 k<=m/2 k<=m/2;注:散列表长度m必须是一个可以表示成4j+3的素数,才能探测到所有位置
伪随机序列法 d i d_i di​是一个伪随机序列

注:采用开放定址法解决冲突的时,删除结点不能简单地被删除结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径,应进行逻辑删除

(2)再哈希法
除了原始的哈希函数之外,多准备几个哈希函数,当哈希函数冲突时,用下一个哈希函数计算新地址,直到不冲突为止

(3)拉链法
把所有同义词存储在一个链表里

标签:哈希,同义词,关键字,查找,key,散列,函数
From: https://blog.csdn.net/Lyhdreamer/article/details/137582120

相关文章

  • 蓝桥杯备考随手记: Java 中常用的排序和查找方法
    1.排序方法Arrays.sort():用于对数组进行排序。它使用优化的快速排序算法来对数组进行排序。示例代码:int[]arr={5,2,8,1,6};Arrays.sort(arr);Collections.sort():用于对集合进行排序。它使用优化的归并排序算法来对集合进行排序。示例代码:List<Integer>list......
  • 代码随想录 day6 哈希表
    题目:P242有效的字母异位数,P349两个数组的交集,P202快乐数,P1两数之和收获:1.使用数组,集合(set,主要是unorder_set,无序,无重复)做哈希表。哈希表一般用来快速判断一个元素是否出现在集合里。2.unorder_set的用法。classSolution{public:vector<int>intersection(vector<......
  • 哈希表自记录
    存储结构:1.开放寻址法#include<cstring>#include<iostream>usingnamespacestd;constintN=2000003,null=0x3f3f3f3f;inth[N];intn;intfind(intx){intk=(x%N+N)%N;//蹲坑法while(h[k]!=null&&h[k]!=x){k++;......
  • js 逆向 闭包 查找变量
    https://s1.hdslb.com/bfs/static/history-record/app_84bedf69.js varl={ install:function(e,t){  functionn(){//目前断点在了这个函数要查找修改变量v的逻辑,发现v是属于install这个Closure作用域。然后,v肯定就在install这里边(绿色之间的部分)定义,往下......
  • 模型调用接口查找数据
    fromlangchain.chainsimportAPIChainfromlangchain_community.llms.ollamaimportOllamallm=Ollama(model="qwen:7b")api_docs="""BASEURL:https://api.python.langchain.comAPIDocumentation:TheAPIendpoint/en/latest/la......
  • 二分——二分查找,二分答案
    二分查找二分查找也称折半查找,它是一种效率极高的查找方法。但是折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列,就是:数据要是有序排列的。备注:二分查找的一个非常重要的前提条件就是查找的内容具备单调性举个例子假如我们需要在10亿个不同的数字当中找......
  • SQL 查找是否存在”,别再用 COUNT 了。
    根据某一条件从数据库表中查询『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECTcount(*)呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老手,都是一如既往的count目前多数人的写法多次REVIEW代码时,发现如现现象:业务代码中,需要根据一个或多个条件,查询是否存在......
  • 如何用加密技术守护你的数字世界(5):单向散列函数
    该文章Github地址:https://github.com/AntonyCheng/encryption-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况......
  • 三种算法实例(二分查找算法、插入排序算法、贪心算法)
    当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应用到日常生活中了。下面我将举......
  • 字符串哈希板子
    #include<iostream>#include<cstring>#defineMAX_SIZE100usingnamespacestd;classStringHash{public:intsize;char*array;char*array_forward;unsignedlonglong*pre_base;unsignedlonglong*hash_array;uns......